diff --git a/DEPS b/DEPS
index bec005b..f113f26 100644
--- a/DEPS
+++ b/DEPS
@@ -300,19 +300,19 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'src_internal_revision': '56e640d103307c0b369edd25a0ba25661a6fe93e',
+  'src_internal_revision': 'ebf59a967121173a07b14a2c2b415983f7267b85',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '339ef4f48c29aa467362852f2c49bafe4511046e',
+  'skia_revision': '5f0f9b76b975a5c70022a35372bd1618628d3e78',
   # 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': 'c04ae4da0bf3c16eabed39c0f27bba1e87cfab93',
+  'v8_revision': '9737790587bc0ce61a1ffc9fadde3abf70dbb5a9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '0feb9ed695d949e65f6fda21d6bd02e6654b4615',
+  'angle_revision': '1b92a973484c95f26bba5e2e4e2511ed03ab6c66',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -356,7 +356,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
-  'freetype_revision': '82090e67c24259c343c83fd9cefe6ff0be7a7eca',
+  'freetype_revision': 'fc67794e159a852d5cbaadcaf3d36598435938cc',
   # 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,11 +376,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': 'c8d1e184668453ebd5841994a41cc07956fd8ab5',
+  'catapult_revision': '556571f9e93b7e4fe6f61c09b0281442722facef',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
-  'crossbench_revision': 'dd17e9aa7ed59b8dfdebdcbd33c8a4c7356d16fe',
+  'crossbench_revision': 'f5a24fd88bd5137b412f59477878d0782e19ff15',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -396,7 +396,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': '2e5bee22ef25bd730a9853640716681e0e0a7656',
+  'devtools_frontend_revision': '3b6a4060c03f56f901cb39084b52b5ef1dea16fa',
   # 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.
@@ -420,7 +420,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '1a17363f9499dd0054aba7bd372d469317ca1a73',
+  'dawn_revision': '36be4620f07d464268815b4933e91db34c99fee6',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -1158,7 +1158,7 @@
   },
 
   'src/chrome/release_scripts': {
-      'url': Var('chrome_git') + '/chrome/tools/release/scripts' + '@' + '0f06c99991724564da4c9b7e19335c6485818cd4',
+      'url': Var('chrome_git') + '/chrome/tools/release/scripts' + '@' + 'ebacc4377d49ec15f4d19e061d5d9ed344cffc1e',
       'condition': 'checkout_chrome_release_scripts',
   },
 
@@ -1501,12 +1501,12 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    'dc121c58029e00ebbaaa941a253676b6e66f7d90',
+    '5c66745b33cda1230040a42b22046206497c6580',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + 'cac8fbef00b6695ad2f41d65d92ce8af443728be',
+    'url': Var('chromium_git') + '/website.git' + '@' + '911ac9ba06c70163c0feff9dfe9d5829dda94b83',
   },
 
   'src/ios/third_party/earl_grey2/src': {
@@ -1660,7 +1660,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'k_PkRQSXmU5kMVljAAkZheHTLojPHCbFHm_72yDXB_IC',
+          'version': 'YUagVb2LLm046A1cjxcNeAtcDxBYd0vu1VxD0Eth_BUC',
       },
     ],
     'condition': 'checkout_android and non_git_source',
@@ -1963,7 +1963,7 @@
   # Tools used when building Chrome for Chrome OS. This affects both the Simple
   # Chrome workflow, as well as the chromeos-chrome ebuild.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '651eb6a4e77910dcea6bb9ab5702c3d16e8477f0',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'e30044c14db6ab8011e4bc692bfde46b13b7f5a4',
       'condition': 'checkout_chromeos',
   },
 
@@ -1984,7 +1984,7 @@
 
   # For Linux and Chromium OS.
   'src/third_party/cros_system_api': {
-      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + 'dc032eaf82d4df9b66c0761a38a3ae914ed4e629',
+      'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '485228a6b2213da0e2dd27bf3f6ca29396ed699f',
       'condition': 'checkout_linux or checkout_chromeos',
   },
 
@@ -2515,7 +2515,7 @@
     Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '652bdb7719f30b52b08e506645a7322ff1b2cc6f',
 
   'src/third_party/openscreen/src':
-    Var('chromium_git') + '/openscreen' + '@' + 'db9e1ea566813606ca055868be13f6ff4a760ab8',
+    Var('chromium_git') + '/openscreen' + '@' + 'ddc89a049295f3fa6ff01646c0a02eb747eba6af',
 
   'src/third_party/openxr/src': {
     'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + '781f2eab3698d653c804ecbd11e0aed47eaad1c6',
@@ -2541,7 +2541,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '4df384ab8fd5cb376e392f6e245593f9ea221f2f',
+    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '745c6d3fead9008f05ee73172e46d059863b5ab3',
 
   'src/base/tracing/test/data': {
     'bucket': 'perfetto',
@@ -2855,16 +2855,16 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@fb4fe29989cbe5e6c5110cbfaaf2e5c4b61a2262',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@22fd0de3755bed1806292e15b640b93e1812bb2b',
   'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@4a038eafdf9e9f3e0ac2e200127df969f3a51ddb',
   'src/third_party/spirv-cross/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Cross@b8fcf307f1f347089e3c46eb4451d27f32ebc8d3',
   'src/third_party/spirv-headers/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Headers@8e82b7cfeca98baae9a01a53511483da7194f854',
   'src/third_party/spirv-tools/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Tools@1a811fd69871da36d9cca84586d8a7799be893ec',
   'src/third_party/vulkan-headers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Headers@5ceb9ed481e58e705d0d9b5326537daedd06b97d',
   'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@b8eb2b901835497b91db7bd7005f4d6ddba2bf1e',
-  'src/third_party/vulkan-tools/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@289efccc7560f2b970e2b4e0f50349da87669311',
-  'src/third_party/vulkan-utility-libraries/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@01851ecae564f8d3da0123659c26a2f5bbfc0228',
-  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@6f9d2d358f9585bbd302106e7b5b8135cb19f716',
+  'src/third_party/vulkan-tools/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@9c0fff2798d769b4c0681001c24d3d55467dde8f',
+  'src/third_party/vulkan-utility-libraries/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@abc2498bde8d65841f463431a6220701fad44c64',
+  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@91fd4f29aed4015857822e8edad5004e7e3f90da',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '56300b29fbfcc693ee6609ddad3fdd5b7a449a21',
@@ -2909,7 +2909,7 @@
     Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'),
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'afc8f4ffbfd3a54206ecd187144eb80ce75e832d',
+    Var('webrtc_git') + '/src.git' + '@' + '5ed7ffd7ff73d95bf87d85de4eb469bb78af6c2b',
 
   # Wuffs' canonical repository is at github.com/google/wuffs, but we use
   # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file.
@@ -3042,7 +3042,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': '022izaYhHa3yC5QZnlwESXOR8km-Cwjzf96D9zAdjXgC',
+        'version': 'gASXTjf7eQuFWVyMA3udDkNmcHLt-L-QzE13mtuIdGIC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3053,7 +3053,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': '-9f30kNlJTXRvIodCv5EFNW12Yj2a_uzRJKvaBnVe-QC',
+        'version': 'WuP1kQZw53N8Kk8nW4to5EMWdKskqQbgitjpfw067TAC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3113,7 +3113,7 @@
       'packages': [
           {
               'package': 'chromium/third_party/android_deps/autorolled',
-              'version': 'XMJzgYMtMJpi77Cx7TW3ztVmBVgv-SHdCPJ1AXexJKgC',
+              'version': 'yaMdtAUdeAxE5zwzhS2saaUyA8jJy-1lxxlWuKUImh0C',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -4445,7 +4445,7 @@
 
   'src/chrome/browser/glic/resources/internal': {
       'url': Var('chrome_git') + '/chrome/browser/glic/resources/internal.git' + '@' +
-        '8b40ed74efe47630c4d0b8d568a4f3e0e2292af8',
+        '92c43ad104487e9b5e8814dee4be94e18656fa27',
       'condition': 'checkout_src_internal',
   },
 
@@ -4701,7 +4701,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        'bfe5c7265c62fcd1f20a90bebeb4a3b7d44aae0d',
+        'ff8ce0b2995198b6076b1a6fc0ac27d0d4bc5d6f',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index ced056f..98bb841 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -919,7 +919,7 @@
             r'content/browser/webid/federated_auth_request_impl\.cc',
             r'media/cast/test/utility/udp_proxy\.h',
             r'sql/recover_module/module_unittest\.cc',
-            r'components/search_engines/template_url_prepopulate_data.cc',
+            r'components/regional_capabilities/regional_capabilities_utils.cc',
             # Do not add new entries to this list. If you have a use case which is
             # not satisfied by the current APIs (i.e. you need an explicitly-seeded
             # sequence, or stability of some sort is required), please contact
@@ -6147,10 +6147,13 @@
             input_api, output_api))
 
     presubmit_py_filter = lambda f: input_api.FilterSourceFile(
-        f, files_to_check=[r'.*PRESUBMIT\.py$'])
-    for f in input_api.AffectedFiles(include_deletes=False,
-                                     file_filter=presubmit_py_filter):
-        full_path = input_api.os_path.dirname(f.AbsoluteLocalPath())
+        f, files_to_check=[r'.*PRESUBMIT(?:_test)?\.py$'])
+    potential_paths = set(
+        map(
+            lambda f: input_api.os_path.dirname(f.AbsoluteLocalPath()),
+            input_api.AffectedFiles(include_deletes=False,
+                                    file_filter=presubmit_py_filter)))
+    for full_path in potential_paths:
         test_file = input_api.os_path.join(full_path, 'PRESUBMIT_test.py')
         # The PRESUBMIT.py file (and the directory containing it) might have
         # been affected by being moved or removed, so only try to run the tests
diff --git a/android_webview/browser/aw_permission_manager.cc b/android_webview/browser/aw_permission_manager.cc
index 04d0653..e98facebd 100644
--- a/android_webview/browser/aw_permission_manager.cc
+++ b/android_webview/browser/aw_permission_manager.cc
@@ -263,7 +263,8 @@
     base::OnceCallback<void(const std::vector<PermissionStatus>&)> callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  auto const& permissions = request_description.permissions;
+  auto const& permissions = blink::PermissionDescriptorToPermissionTypes(
+      request_description.permissions);
   if (permissions.empty()) {
     std::move(callback).Run(std::vector<PermissionStatus>());
     return;
diff --git a/android_webview/browser/aw_permission_manager_unittest.cc b/android_webview/browser/aw_permission_manager_unittest.cc
index d54214d7..466cf94 100644
--- a/android_webview/browser/aw_permission_manager_unittest.cc
+++ b/android_webview/browser/aw_permission_manager_unittest.cc
@@ -14,6 +14,7 @@
 #include "base/functional/callback_helpers.h"
 #include "base/memory/raw_ptr.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/permissions/permission_utils.h"
 #include "url/gurl.h"
@@ -233,8 +234,10 @@
     CHECK(manager);
     manager->RequestPermissions(
         rfh,
-        content::PermissionRequestDescription(permissions, user_gesture,
-                                              requesting_origin),
+        content::PermissionRequestDescription(
+            content::PermissionDescriptorUtil::
+                CreatePermissionDescriptorForPermissionTypes(permissions),
+            user_gesture, requesting_origin),
         std::move(callback));
   }
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/payments/AwPaymentRequestSettingsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/payments/AwPaymentRequestSettingsTest.java
index e81c9dd..4a3c0bc 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/payments/AwPaymentRequestSettingsTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/payments/AwPaymentRequestSettingsTest.java
@@ -104,24 +104,6 @@
     }
 
     /**
-     * If the WEB_PAYMENTS feature is not explicitly modified and the WebView setting enables
-     * PaymentRequest, then then PaymentRequest interface is undefined in JavaScript, because the
-     * default state for WEB_PAYMENTS feature flag in WebView is "disabled".
-     */
-    @Test
-    public void testPaymentRequestUndefinedWithDefaultWebPaymentsFeature() throws Exception {
-        mAwContents.getSettings().setPaymentRequestEnabled(true);
-        loadPage();
-
-        JSUtils.clickNodeWithUserGesture(
-                mAwContents.getWebContents(), "checkPaymentRequestDefined");
-
-        Assert.assertEquals(
-                "PaymentRequest is not defined.",
-                mWebMessageListener.waitForOnPostMessage().getAsString());
-    }
-
-    /**
      * If the WEB_PAYMENTS feature flag is disabled, then the PaymentRequest API interface stays
      * undefined in JavaScript, even if the WebView setting for PaymentRequest API is enabled.
      */
diff --git a/android_webview/tools/cts_config/webview_cts_gcs_path.json b/android_webview/tools/cts_config/webview_cts_gcs_path.json
index bf78f28..c787f28 100644
--- a/android_webview/tools/cts_config/webview_cts_gcs_path.json
+++ b/android_webview/tools/cts_config/webview_cts_gcs_path.json
@@ -244,9 +244,10 @@
             "force_full_mode": true
           }
         ],
-        "includes": [
+        "excludes": [
           {
-            "match": "android.view.inputmethod.cts.KeyboardVisibilityControlTest#testShowHideKeyboardOnWebView"
+            "match": "android.view.inputmethod.cts.KeyboardVisibilityControlTest#testShowHideKeyboardOnWebView",
+            "_bug_id": "crbug.com/408990245"
           }
         ]
       },
@@ -273,6 +274,14 @@
             "_bug_id": "crbug.com/1369088"
           },
           {
+            "match": "android.autofillservice.cts.inline.InlineWebViewActivityTest#testAutofillNoDatasets",
+            "_bug_id": "crbug.com/409004450"
+          },
+          {
+            "match": "android.autofillservice.cts.inline.InlineWebViewActivityTest#testAutofillOneDataset",
+            "_bug_id": "crbug.com/409004450"
+          },
+          {
             "match": "android.autofillservice.cts.inline.InlineAugmentedWebViewActivityTest#testAugmentedAutoFill_startTypingHideInline",
             "_bug_id": "crbug.com/1369088"
           }
@@ -383,6 +392,14 @@
             "_bug_id": "crbug.com/1369088"
           },
           {
+            "match": "android.autofillservice.cts.dropdown.WebViewActivityTest#testAutofillNoDatasets",
+            "_bug_id": "crbug.com/408979469"
+          },
+          {
+            "match": "android.autofillservice.cts.dropdown.WebViewActivityTest#testAutofillOneDataset",
+            "_bug_id": "crbug.com/408979469"
+          },
+          {
             "match": "android.autofillservice.cts.dropdown.WebViewActivityTest#testSaveOnly",
             "_bug_id": "crbug.com/1369088"
           },
@@ -413,9 +430,6 @@
         ],
         "includes": [
           {
-            "match": "android.view.inputmethod.cts.KeyboardVisibilityControlTest#testShowHideKeyboardOnWebView"
-          },
-          {
             "match": "android.view.inputmethod.cts.InputMethodServiceTest#testBatchEdit_commitAndSetComposingRegion_webView"
           },
           {
@@ -424,6 +438,12 @@
           {
             "match": "android.view.inputmethod.cts.InputMethodServiceTest#testBatchEdit_commitSpaceThenSetComposingRegion_webView"
           }
+        ],
+        "excludes": [
+          {
+            "match": "android.view.inputmethod.cts.KeyboardVisibilityControlTest#testShowHideKeyboardOnWebView",
+            "_bug_id": "crbug.com/408990245"
+          }
         ]
       },
       {
@@ -533,6 +553,14 @@
             "_bug_id": "crbug.com/1369088"
           },
           {
+            "match": "android.autofillservice.cts.dropdown.WebViewActivityTest#testAutofillNoDatasets",
+            "_bug_id": "crbug.com/408979469"
+          },
+          {
+            "match": "android.autofillservice.cts.dropdown.WebViewActivityTest#testAutofillOneDataset",
+            "_bug_id": "crbug.com/408979469"
+          },
+          {
             "match": "android.autofillservice.cts.dropdown.WebViewActivityTest#testSaveOnly",
             "_bug_id": "crbug.com/1369088"
           },
@@ -669,6 +697,14 @@
             "_bug_id": "crbug.com/1369088"
           },
           {
+            "match": "android.autofillservice.cts.dropdown.WebViewActivityTest#testAutofillNoDatasets",
+            "_bug_id": "crbug.com/408979469"
+          },
+          {
+            "match": "android.autofillservice.cts.dropdown.WebViewActivityTest#testAutofillOneDataset",
+            "_bug_id": "crbug.com/408979469"
+          },
+          {
             "match": "android.autofillservice.cts.dropdown.WebViewActivityTest#testSaveOnly",
             "_bug_id": "crbug.com/1369088"
           },
@@ -805,6 +841,14 @@
             "_bug_id": "crbug.com/1369088"
           },
           {
+            "match": "android.autofillservice.cts.dropdown.WebViewActivityTest#testAutofillNoDatasets",
+            "_bug_id": "crbug.com/408979469"
+          },
+          {
+            "match": "android.autofillservice.cts.dropdown.WebViewActivityTest#testAutofillOneDataset",
+            "_bug_id": "crbug.com/408979469"
+          },
+          {
             "match": "android.autofillservice.cts.dropdown.WebViewActivityTest#testSaveOnly",
             "_bug_id": "crbug.com/1369088"
           },
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb
index 92f2762..76b9d74 100644
--- a/ash/strings/ash_strings_kk.xtb
+++ b/ash/strings/ash_strings_kk.xtb
@@ -1599,7 +1599,7 @@
 <translation id="6158923546703693047">Контент дереккөзі туралы ақпарат</translation>
 <translation id="615957422585914272">Экрандағы пернетақтаны көрсету</translation>
 <translation id="616543563528926612">Тінтуірдің оң жақ түймесін басу жылдам пәрмені <ph name="LAUNCHER_KEY_NAME" /> пернесі + басу орнына "alt + басу" пәрменіне жаңартылды.</translation>
-<translation id="6165508094623778733">Толығырақ</translation>
+<translation id="6165508094623778733">Толық ақпарат</translation>
 <translation id="6166852626429024716">Құрылғыдан, қолданбалардан, параметрлерден және интернеттен іздеу...</translation>
 <translation id="6168318496333165060">Diagnostics қолданбасын ашу</translation>
 <translation id="6168622430237609329">Орнатылған қолданбаларыңыз</translation>
@@ -2285,7 +2285,7 @@
 <translation id="8437311513256731931">Пікір құралын ашу</translation>
 <translation id="8443879455002739353">"Көшіру"</translation>
 <translation id="8444246603146515890"><ph name="DESK_TITILE" /> үстелі іске қосылды.</translation>
-<translation id="8446884382197647889">Толығырақ</translation>
+<translation id="8446884382197647889">Толық ақпарат</translation>
 <translation id="8456543082656546101"><ph name="SHORTCUT_KEY_NAME" /> + V</translation>
 <translation id="8462305545768648477">Select-to-Speak функциясын жабу</translation>
 <translation id="8466665972451889002"><ph name="GROUP_NAME" /> тобындағы элементтерді көрсету</translation>
diff --git a/ash/wallpaper/wallpaper_utils/wallpaper_file_utils.cc b/ash/wallpaper/wallpaper_utils/wallpaper_file_utils.cc
index 62a269f9..763cf50 100644
--- a/ash/wallpaper/wallpaper_utils/wallpaper_file_utils.cc
+++ b/ash/wallpaper/wallpaper_utils/wallpaper_file_utils.cc
@@ -156,17 +156,6 @@
                             const WallpaperLayout layout,
                             const gfx::Size preferred_size,
                             const std::string& image_metadata) {
-  if (layout == WALLPAPER_LAYOUT_CENTER) {
-    // TODO(b/325498873) remove this.
-    if (base::PathExists(path)) {
-      DVLOG(1) << "Deleting path " << path;
-      base::DeleteFile(path);
-    }
-    DVLOG(1) << "Skipping resize and save for WALLPAPER_LAYOUT_CENTER path "
-             << path;
-    return false;
-  }
-
   gfx::ImageSkia resized_image = ResizeImage(image, layout, preferred_size);
   if (resized_image.isNull()) {
     LOG(WARNING) << "Failed to resize image";
diff --git a/ash/wallpaper/wallpaper_utils/wallpaper_file_utils_unittest.cc b/ash/wallpaper/wallpaper_utils/wallpaper_file_utils_unittest.cc
index 8964b89..0560f289 100644
--- a/ash/wallpaper/wallpaper_utils/wallpaper_file_utils_unittest.cc
+++ b/ash/wallpaper/wallpaper_utils/wallpaper_file_utils_unittest.cc
@@ -115,10 +115,13 @@
 }
 
 TEST_F(ResizeAndSaveWallpaperTest, CenterLayout) {
-  EXPECT_FALSE(ResizeAndSaveWallpaper(gfx::test::CreateImageSkia(400, 200),
-                                      CreateFilePath("cached_wallpaper"),
-                                      WALLPAPER_LAYOUT_CENTER, {400, 200}));
-  EXPECT_FALSE(base::PathExists(CreateFilePath("cached_wallpaper")));
+  const gfx::ImageSkia image_skia = gfx::test::CreateImageSkia(400, 200);
+  ASSERT_TRUE(ResizeAndSaveWallpaper(image_skia,
+                                     CreateFilePath("cached_wallpaper"),
+                                     WALLPAPER_LAYOUT_CENTER, {400, 200}));
+  EXPECT_TRUE(
+      gfx::test::AreImagesClose(gfx::Image(DecodeImageFile("cached_wallpaper")),
+                                gfx::Image(image_skia), kPixelMaxDeviation));
 }
 
 TEST_F(ResizeAndSaveWallpaperTest, DifferentWallpapers) {
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc
index 31100f94..4f2be05 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_alloc_unittest.cc
@@ -4549,7 +4549,9 @@
   }
 
   constexpr uint64_t kCookie = 0x1234567890ABCDEF;
+#if !PA_BUILDFLAG(IS_IOS)
   constexpr uint64_t kQuarantined = 0xEFEFEFEFEFEFEFEF;
+#endif  // !PA_BUILDFLAG(IS_IOS)
 
   size_t alloc_size = 64 - ExtraAllocSize(allocator);
   uint64_t* ptr1 =
@@ -4574,8 +4576,10 @@
   // The allocation shouldn't be reclaimed, and its contents should be zapped.
   // Retag ptr1 to get its correct MTE tag.
   ptr1 = TagPtr(ptr1);
+#if !PA_BUILDFLAG(IS_IOS)
   EXPECT_NE(*ptr1, kCookie);
   EXPECT_EQ(*ptr1, kQuarantined);
+#endif  // !PA_BUILDFLAG(IS_IOS)
 
   // The allocator should not reuse the original slot since its reference count
   // doesn't equal zero.
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc b/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc
index d6c0687..347dc6b 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_root.cc
@@ -1983,7 +1983,11 @@
   if (hook) [[unlikely]] {
     hook(object, usable_size);
   } else {
+// TODO(https://crbug.com/371135823): Enable zapping again once finished
+// investigation.
+#if !PA_BUILDFLAG(IS_IOS)
     internal::SecureMemset(object, internal::kQuarantinedByte, usable_size);
+#endif  // !PA_BUILDFLAG(IS_IOS)
   }
 }
 #endif  // PA_BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/partition_root.h b/base/allocator/partition_allocator/src/partition_alloc/partition_root.h
index f5bb579..ae6968b9 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/partition_root.h
+++ b/base/allocator/partition_allocator/src/partition_alloc/partition_root.h
@@ -1265,6 +1265,7 @@
 
   // Iterating over the entire slot can be really expensive.
 #if PA_BUILDFLAG(EXPENSIVE_DCHECKS_ARE_ON)
+#if !PA_BUILDFLAG(IS_IOS)
   auto hook = PartitionAllocHooks::GetQuarantineOverrideHook();
   // If we have a hook the object segment is not necessarily filled
   // with |kQuarantinedByte|.
@@ -1275,6 +1276,7 @@
       PA_DCHECK(object[i] == kQuarantinedByte);
     }
   }
+#endif  //  !PA_BUILDFLAG(IS_IOS)
   DebugMemset(SlotStartAddr2Ptr(slot_start), kFreedByte,
               slot_span->GetUtilizedSlotSize());
 #endif  // PA_BUILDFLAG(EXPENSIVE_DCHECKS_ARE_ON)
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc
index 5989dbd..cbb3358 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc
@@ -1680,8 +1680,10 @@
   // In debug builds, the use-after-free should be caught immediately.
   EXPECT_DEATH_IF_SUPPORTED(g_volatile_int_to_ignore = *wrapped_ptr1, "");
 #else   // DCHECK_IS_ON() || PA_BUILDFLAG(ENABLE_BACKUP_REF_PTR_SLOW_CHECKS)
+#if !PA_BUILDFLAG(IS_IOS)
   // The allocation should be poisoned since there's a raw_ptr alive.
   EXPECT_NE(*wrapped_ptr1, 42);
+#endif  // !PA_BUILDFLAG(IS_IOS)
 
   // The allocator should not be able to reuse the slot at this point.
   void* raw_ptr2 = allocator_.root()->Alloc(sizeof(int), "");
@@ -2464,7 +2466,7 @@
     raw_ptr<unsigned int, DanglingUntriaged> dangling_ptr =
         partition_alloc::internal::TagPtr(ptr.get());
     EXPECT_DEATH_IF_SUPPORTED(*dangling_ptr = 0, "");
-#else
+#elif !PA_BUILDFLAG(IS_IOS)
     EXPECT_EQ(kQuarantined4Bytes,
               *partition_alloc::internal::TagPtr(ptr.get()));
 #endif
diff --git a/base/pickle.cc b/base/pickle.cc
index 3bb0d90..92a38f1e 100644
--- a/base/pickle.cc
+++ b/base/pickle.cc
@@ -248,6 +248,17 @@
   return true;
 }
 
+[[nodiscard]] std::optional<span<const uint8_t>> PickleIterator::ReadBytes(
+    size_t length) {
+  const char* ptr;
+
+  if (!ReadBytes(&ptr, length)) {
+    return std::nullopt;
+  }
+
+  return as_bytes(UNSAFE_TODO(span(ptr, length)));
+}
+
 Pickle::Attachment::Attachment() = default;
 
 Pickle::Attachment::~Attachment() = default;
diff --git a/base/pickle.h b/base/pickle.h
index 0aa274b..2649abef 100644
--- a/base/pickle.h
+++ b/base/pickle.h
@@ -71,6 +71,9 @@
   // mutated). Do not keep the pointer around!
   [[nodiscard]] bool ReadBytes(const char** data, size_t length);
 
+  // Similar, but using span for convenience.
+  [[nodiscard]] std::optional<span<const uint8_t>> ReadBytes(size_t length);
+
   // A version of ReadInt() that checks for the result not being negative. Use
   // it for reading the object sizes.
   [[nodiscard]] bool ReadLength(size_t* result) {
diff --git a/base/pickle_unittest.cc b/base/pickle_unittest.cc
index ad3a766..6488057 100644
--- a/base/pickle_unittest.cc
+++ b/base/pickle_unittest.cc
@@ -22,6 +22,7 @@
 #include "base/containers/span.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace base {
@@ -661,4 +662,32 @@
   EXPECT_TRUE(b);
 }
 
+// Tests the ReadData() overload that returns a span.
+TEST(PickleTest, ReadDataAsSpan) {
+  constexpr auto kWriteData =
+      std::to_array<uint8_t>({0x01, 0x02, 0x03, 0x61, 0x62, 0x63});
+
+  Pickle pickle;
+  pickle.WriteData(kWriteData);
+  pickle.WriteData(base::span<const uint8_t>());
+
+  PickleIterator iter(pickle);
+  EXPECT_THAT(iter.ReadData(), testing::Optional(kWriteData));
+  EXPECT_THAT(iter.ReadData(), testing::Optional(base::span<const uint8_t>()));
+  EXPECT_FALSE(iter.ReadData());
+}
+
+// Tests the ReadBytes() overload that returns a span.
+TEST(PickleTest, ReadBytesAsSpan) {
+  constexpr auto kWriteData =
+      std::to_array<uint8_t>({0x01, 0x02, 0x03, 0x61, 0x62, 0x63});
+
+  Pickle pickle;
+  pickle.WriteBytes(kWriteData);
+
+  PickleIterator iter(pickle);
+  EXPECT_THAT(iter.ReadBytes(kWriteData.size()), testing::Optional(kWriteData));
+  EXPECT_FALSE(iter.ReadBytes(kWriteData.size()));
+}
+
 }  // namespace base
diff --git a/build/autoroll/fetch_util.py b/build/autoroll/fetch_util.py
index 31755859..9902ba7 100644
--- a/build/autoroll/fetch_util.py
+++ b/build/autoroll/fetch_util.py
@@ -49,6 +49,15 @@
   return version_map_str
 
 
+def hash_files(files):
+  """Returns the sha256 hash of |files| contents."""
+  content_hash = hashlib.sha256()
+  for filepath in files:
+    with open(filepath, 'rb') as f:
+      content_hash.update(f.read())
+  return content_hash.hexdigest()[:_HASH_LENGTH]
+
+
 def fill_template(template_path, output_path, **kwargs):
   """Fills in a template.
 
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 0aa2d1e..b0b194e 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -2229,12 +2229,8 @@
       "/wd4800",  # Disable warning when forcing value to bool.
       "/wd4267",  # TODO(jschuh): size_t to int.
     ]
-  } else {
-    if (is_clang && !is_nacl) {
-      # TODO(thakis): Remove !is_nacl once
-      # https://codereview.webrtc.org/1552863002/ made its way into chromium.
-      cflags += [ "-Wall" ]
-    }
+  } else if (is_clang) {
+    cflags += [ "-Wall" ]
   }
 
   if (is_clang) {
diff --git a/build/config/mac/mac_sdk.gni b/build/config/mac/mac_sdk.gni
index 05cd6f7..4a5abb94 100644
--- a/build/config/mac/mac_sdk.gni
+++ b/build/config/mac/mac_sdk.gni
@@ -47,12 +47,12 @@
   # The SDK version used when making official builds. This is a single exact
   # version, not a minimum. If this version isn't available official builds
   # will fail.
-  mac_sdk_official_version = "15.2"
+  mac_sdk_official_version = "15.4"
 
   # The SDK build version used when making official builds.  This is a single
   # exact version found at "System/Library/CoreServices/SystemVersion.plist"
   # inside the SDK.
-  mac_sdk_official_build_version = "24C94"
+  mac_sdk_official_build_version = "24E241"
 
   # Production builds should use hermetic Xcode. If you want to do production
   # builds with system Xcode to test new SDKs, set this.
diff --git a/build/mac_toolchain.py b/build/mac_toolchain.py
index 9af3c6a..5485da0 100755
--- a/build/mac_toolchain.py
+++ b/build/mac_toolchain.py
@@ -33,8 +33,8 @@
     return plistlib.load(f)
 
 
-# This contains binaries from Xcode 16.2 (16C5032) along with
-# the macOS SDK 15.2 (24C94). To build these packages, see comments in
+# This contains binaries from Xcode 16.3 (16E140) along with
+# the macOS SDK 15.4 (24E241). To build these packages, see comments in
 # build/xcode_binaries.yaml.
 # To update the version numbers, open Xcode's "About Xcode" or run
 # `xcodebuild -version` for the Xcode version, and run
@@ -44,7 +44,7 @@
 # it's the part after the colon.
 
 MAC_BINARIES_LABEL = 'infra_internal/ios/xcode/xcode_binaries/mac-amd64'
-MAC_BINARIES_TAG = 'o5KxJtacGXzkEoORkVUIOEPgGnL2okJzM4Km91eod9EC'
+MAC_BINARIES_TAG = 'mTokcQKuRc0gN_OU1e_CxtZJq6Gy8TnPTbmjyXA5kR4C'
 
 # The toolchain will not be downloaded if the minimum OS version is not met. 19
 # is the major version number for macOS 10.15. Xcode 15.0 only runs on macOS
diff --git a/build/toolchain/apple/compile_xcassets.py b/build/toolchain/apple/compile_xcassets.py
index 3ee9bf9..18049f49 100644
--- a/build/toolchain/apple/compile_xcassets.py
+++ b/build/toolchain/apple/compile_xcassets.py
@@ -81,11 +81,6 @@
   current_section = None
   data_in_section = False
   for line in compiler_output.splitlines():
-    # TODO:(crbug.com/348008793): Ignore Dark and Tintable App Icon unassigned
-    # children warning when building with Xcode 15
-    if 'The app icon set "AppIcon" has 2 unassigned children' in line:
-      continue
-
     match = SECTION_HEADER.search(line)
     if match is not None:
       data_in_section = False
diff --git a/build/xcode_binaries.yaml b/build/xcode_binaries.yaml
index cd5d316..eef9287f 100644
--- a/build/xcode_binaries.yaml
+++ b/build/xcode_binaries.yaml
@@ -10,7 +10,8 @@
 #      a.) The version information can be found in "About Xcode",
 #          or by running `xcodebuild -version`
 # To deploy the newly created cipd package across the fleet, modify
-# ./mac_toolchain.py to point to the new cipd hash.
+# ./mac_toolchain.py to point to the new cipd hash, and update the
+# mac_sdk_official_* variables in build/config/mac/mac_sdk.gni.
 #
 # Note that the Chromium build looks for the mac binaries in
 # build/mac_files/xcode_binaries; it won't see the build/xcode_binaries that
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index f828a8f..72e21983 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -496,7 +496,7 @@
               shared_quad_state, offset_geometry_rect,
               offset_visible_geometry_rect, needs_blending,
               draw_info.resource_id_for_export(), texture_rect,
-              draw_info.resource_size(), draw_info.is_premultiplied(),
+              draw_info.resource_size(), /*is_premultiplied=*/true,
               nearest_neighbor_,
               !layer_tree_impl()->settings().enable_edge_anti_aliasing);
           ValidateQuadResources(quad);
diff --git a/cc/mojo_embedder/viz_layer_context.cc b/cc/mojo_embedder/viz_layer_context.cc
index 6996c499..4321a5f 100644
--- a/cc/mojo_embedder/viz_layer_context.cc
+++ b/cc/mojo_embedder/viz_layer_context.cc
@@ -400,7 +400,9 @@
 
   auto wire = viz::mojom::TileResource::New();
   wire->resource = resources[0];
-  wire->is_premultiplied = draw_info.is_premultiplied();
+
+  // Tile resources are always premultiplied.
+  wire->is_premultiplied = true;
   wire->is_checkered = draw_info.is_checker_imaged();
   return wire;
 }
diff --git a/cc/tiles/tile_draw_info.cc b/cc/tiles/tile_draw_info.cc
index e0271e2..ab12a046 100644
--- a/cc/tiles/tile_draw_info.cc
+++ b/cc/tiles/tile_draw_info.cc
@@ -23,15 +23,14 @@
 }
 
 void TileDrawInfo::SetResource(ResourcePool::InUsePoolResource resource,
-                               bool resource_is_checker_imaged,
-                               bool is_premultiplied) {
+                               bool resource_is_checker_imaged) {
   DCHECK(!resource_);
   DCHECK(resource);
 
   mode_ = RESOURCE_MODE;
   is_resource_ready_to_draw_ = false;
   resource_is_checker_imaged_ = resource_is_checker_imaged;
-  is_premultiplied_ = is_premultiplied;
+
   resource_ = std::move(resource);
 }
 
@@ -46,7 +45,6 @@
   DCHECK(resource_);
   is_resource_ready_to_draw_ = false;
   resource_is_checker_imaged_ = false;
-  is_premultiplied_ = false;
   return std::move(resource_);
 }
 
diff --git a/cc/tiles/tile_draw_info.h b/cc/tiles/tile_draw_info.h
index 98c3779..40cec698 100644
--- a/cc/tiles/tile_draw_info.h
+++ b/cc/tiles/tile_draw_info.h
@@ -68,8 +68,6 @@
     return solid_color_;
   }
 
-  bool is_premultiplied() const { return is_premultiplied_; }
-
   bool requires_resource() const {
     return mode_ == RESOURCE_MODE || mode_ == OOM_MODE;
   }
@@ -93,8 +91,7 @@
   friend class TileManager;
 
   void SetResource(ResourcePool::InUsePoolResource resource,
-                   bool resource_is_checker_imaged,
-                   bool is_premultiplied);
+                   bool resource_is_checker_imaged);
   ResourcePool::InUsePoolResource TakeResource();
 
   void set_resource_ready_for_draw() {
@@ -112,7 +109,6 @@
   Mode mode_ = RESOURCE_MODE;
   SkColor4f solid_color_ = SkColors::kWhite;
   ResourcePool::InUsePoolResource resource_;
-  bool is_premultiplied_ = false;
   bool is_resource_ready_to_draw_ = false;
 
   // Set to true if |resource_| was rasterized with checker-imaged content. The
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
index c0fa8bd..a12c512 100644
--- a/cc/tiles/tile_manager.cc
+++ b/cc/tiles/tile_manager.cc
@@ -775,8 +775,7 @@
     bool exported = resource_pool_->PrepareForExport(
         resource, viz::TransferableResource::ResourceSource::kTest);
     DCHECK(exported);
-    draw_info.SetResource(std::move(resource), false,
-                          /*is_premultiplied=*/true);
+    draw_info.SetResource(std::move(resource), false);
     draw_info.set_resource_ready_for_draw();
   }
 }
@@ -1721,8 +1720,7 @@
   TileDrawInfo& draw_info = tile->draw_info();
   if (exported) {
     draw_info.SetResource(std::move(resource),
-                          raster_task_was_scheduled_with_checker_images,
-                          /*is_premultiplied=*/true);
+                          raster_task_was_scheduled_with_checker_images);
   } else {
     resource_pool_->ReleaseResource(std::move(resource));
     draw_info.set_oom();
diff --git a/chrome/VERSION b/chrome/VERSION
index cbfa0fd7..1ba4ec9 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=137
 MINOR=0
-BUILD=7114
+BUILD=7115
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 054e1b0c..295790ef 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -527,6 +527,7 @@
       "//chrome/browser/ui/android/signin:java",
       "//chrome/browser/ui/android/theme:java",
       "//chrome/browser/ui/android/toolbar:java",
+      "//chrome/browser/ui/android/web_app_header:java",
       "//chrome/browser/ui/android/whats_new:java",
       "//chrome/browser/ui/messages/android:java",
       "//chrome/browser/uid/android:java",
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni
index a84b612..acbf8e2 100644
--- a/chrome/android/chrome_java_resources.gni
+++ b/chrome/android/chrome_java_resources.gni
@@ -619,6 +619,7 @@
   "java/res/values-v27/styles.xml",
   "java/res/values-v28/styles.xml",
   "java/res/values-v31/styles.xml",
+  "java/res/values-w600dp/dimens.xml",
   "java/res/values/attrs.xml",
   "java/res/values/colors.xml",
   "java/res/values/dimens.xml",
diff --git a/chrome/android/features/tab_ui/java/res/values/colors.xml b/chrome/android/features/tab_ui/java/res/values/colors.xml
index 460a3ead5..6c822e6 100644
--- a/chrome/android/features/tab_ui/java/res/values/colors.xml
+++ b/chrome/android/features/tab_ui/java/res/values/colors.xml
@@ -33,7 +33,7 @@
     <color name="incognito_tab_grid_dialog_ungroup_bar_text_color">@color/baseline_primary_80</color>
     <color name="incognito_tab_grid_dialog_ungroup_bar_text_hovered_color">@color/modern_white</color>
 
-    <color name="incognito_tab_list_editor_toolbar_bg_color">@color/toolbar_background_primary_dark</color>
+    <color name="incognito_tab_list_editor_toolbar_bg_color">@color/gm3_baseline_surface_container_low_dark</color>
 
     <!-- Tab Group color picker related colors. These should not be used elsewhere. -->
     <color name="tab_group_color_picker_blue">@color/tab_group_color_picker_blue_dark</color>
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinator.java
index 828f3d3..b966b66 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinator.java
@@ -50,6 +50,7 @@
 import org.chromium.chrome.browser.tasks.tab_management.MessageService.MessageType;
 import org.chromium.chrome.browser.tasks.tab_management.TabListCoordinator.TabListItemSizeChangedObserver;
 import org.chromium.chrome.browser.tasks.tab_management.TabListCoordinator.TabListMode;
+import org.chromium.chrome.browser.tasks.tab_management.TabListEditorCoordinator.CreationMode;
 import org.chromium.chrome.browser.tasks.tab_management.TabListEditorCoordinator.NavigationProvider;
 import org.chromium.chrome.browser.tasks.tab_management.TabListEditorCoordinator.TabListEditorController;
 import org.chromium.chrome.browser.tasks.tab_management.TabListMediator.GridCardOnClickListenerProvider;
@@ -622,7 +623,8 @@
                         mGridCardOnCLickListenerProvider,
                         mModalDialogManager,
                         mDesktopWindowStateManager,
-                        /* edgeToEdgeSupplier= */ null);
+                        /* edgeToEdgeSupplier= */ null,
+                        CreationMode.FULL_SCREEN);
     }
 
     @VisibleForTesting
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator.java
index 7483e2c..703ff8a 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator.java
@@ -42,6 +42,7 @@
 import org.chromium.chrome.browser.tasks.tab_management.ColorPickerCoordinator.ColorPickerLayoutType;
 import org.chromium.chrome.browser.tasks.tab_management.MessageService.MessageType;
 import org.chromium.chrome.browser.tasks.tab_management.TabGridDialogMediator.AnimationSourceViewProvider;
+import org.chromium.chrome.browser.tasks.tab_management.TabListEditorCoordinator.CreationMode;
 import org.chromium.chrome.browser.tasks.tab_management.TabListEditorCoordinator.TabListEditorController;
 import org.chromium.chrome.browser.tasks.tab_management.TabListMediator.GridCardOnClickListenerProvider;
 import org.chromium.chrome.browser.tasks.tab_management.TabProperties.UiType;
@@ -50,7 +51,6 @@
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateManager;
-import org.chromium.components.browser_ui.styles.SemanticColorUtils;
 import org.chromium.components.browser_ui.widget.scrim.ScrimManager;
 import org.chromium.components.collaboration.CollaborationService;
 import org.chromium.components.collaboration.ServiceStatus;
@@ -173,7 +173,9 @@
                         DataSharingServiceFactory.getForProfile(originalProfile);
 
                 @ColorInt
-                int backgroundColor = SemanticColorUtils.getDialogBgColor(mDialogView.getContext());
+                int backgroundColor =
+                        TabUiThemeProvider.getTabGridDialogBackgroundColor(
+                                mDialogView.getContext(), /* isIncognito= */ false);
                 SharedImageTilesConfig config =
                         new SharedImageTilesConfig.Builder(activity)
                                 .setBorderColor(backgroundColor)
@@ -336,7 +338,8 @@
                             mModalDialogManager,
                             // Parent container handles desktop window state.
                             /* desktopWindowStateManager= */ null,
-                            /* edgeToEdgeSupplier= */ null);
+                            /* edgeToEdgeSupplier= */ null,
+                            CreationMode.DIALOG);
         }
 
         return mTabListEditorCoordinator.getController();
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupListBottomSheetCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupListBottomSheetCoordinator.java
index cab4c89db..905106c 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupListBottomSheetCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupListBottomSheetCoordinator.java
@@ -119,7 +119,7 @@
         FaviconResolver faviconResolver =
                 TabGroupListFaviconResolverFactory.build(context, profile, mTabListFaviconProvider);
         @Nullable TabGroupSyncService tabGroupSyncService =
-                TabGroupSyncServiceFactory.getForProfile(profile);
+                profile.isOffTheRecord() ? null : TabGroupSyncServiceFactory.getForProfile(profile);
 
         CollaborationService collaborationService =
                 CollaborationServiceFactory.getForProfile(profile);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupListBottomSheetCoordinatorUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupListBottomSheetCoordinatorUnitTest.java
index 11fd7a3..353c2f52 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupListBottomSheetCoordinatorUnitTest.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupListBottomSheetCoordinatorUnitTest.java
@@ -60,6 +60,7 @@
     @Mock private Tab mTab;
     private final SavedTabGroup mSavedTabGroup = new SavedTabGroup();
     private final SavedTabGroupTab mSavedTabGroupTab = new SavedTabGroupTab();
+    private Context mContext;
     private TabGroupListBottomSheetCoordinator mCoordinator;
 
     @Before
@@ -72,13 +73,13 @@
         when(mTabGroupSyncService.getAllGroupIds()).thenReturn(new String[] {TAB_GROUP_ID_STRING});
         when(mTabGroupSyncService.getGroup(TAB_GROUP_ID_STRING)).thenReturn(mSavedTabGroup);
 
-        Context context =
+        mContext =
                 new ContextThemeWrapper(
                         ApplicationProvider.getApplicationContext(),
                         R.style.Theme_BrowserUI_DayNight);
         mCoordinator =
                 new TabGroupListBottomSheetCoordinator(
-                        context,
+                        mContext,
                         mProfile,
                         ignored -> {},
                         mFilter,
@@ -126,4 +127,12 @@
                         eq(StateChangeReason.INTERACTION_COMPLETE));
         verify(mCoordinator).destroy();
     }
+
+    @Test
+    public void testIncognito_dontFetchTabGroupSyncService() {
+        when(mProfile.isOffTheRecord()).thenReturn(true);
+        // Test that the Coordinator can be constructed without crashing.
+        new TabGroupListBottomSheetCoordinator(
+                mContext, mProfile, ignored -> {}, mFilter, mBottomSheetController, true, false);
+    }
 }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorCoordinator.java
index d6f6db53..633a79a 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorCoordinator.java
@@ -11,6 +11,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 
+import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
@@ -50,13 +51,25 @@
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
 
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 import java.util.List;
 
 /**
- * This class is a coordinator for TabListEditor component. It manages the communication with
- * {@link TabListCoordinator} as well as the life-cycle of shared component.
+ * This class is a coordinator for TabListEditor component. It manages the communication with {@link
+ * TabListCoordinator} as well as the life-cycle of shared component.
  */
 class TabListEditorCoordinator {
+    @IntDef({CreationMode.FULL_SCREEN, CreationMode.DIALOG})
+    @Target(ElementType.TYPE_USE)
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface CreationMode {
+        int FULL_SCREEN = 0;
+        int DIALOG = 1;
+    }
+
     static final String COMPONENT_NAME = "TabListEditor";
 
     // TODO(crbug.com/41467140): Unify similar interfaces in other components that used the
@@ -284,6 +297,7 @@
      * @param modalDialogManager Used for managing the modal dialogs.
      * @param desktopWindowStateManager Manager to get desktop window and app header state.
      * @param edgeToEdgeSupplier Supplier to the {@link EdgeToEdgeController} instance.
+     * @param creationMode Mode in which list is created e.g. full screen mode or in a dialog.
      */
     public TabListEditorCoordinator(
             Activity activity,
@@ -301,7 +315,8 @@
             @Nullable GridCardOnClickListenerProvider gridCardOnClickListenerProvider,
             @NonNull ModalDialogManager modalDialogManager,
             @Nullable DesktopWindowStateManager desktopWindowStateManager,
-            @Nullable ObservableSupplier<EdgeToEdgeController> edgeToEdgeSupplier) {
+            @Nullable ObservableSupplier<EdgeToEdgeController> edgeToEdgeSupplier,
+            @CreationMode int creationMode) {
         try (TraceEvent e = TraceEvent.scoped("TabListEditorCoordinator.constructor")) {
             mActivity = activity;
             mRootView = rootView;
@@ -339,7 +354,8 @@
                             bottomSheetController,
                             mTabListEditorLayout,
                             mTabActionState,
-                            desktopWindowStateManager);
+                            desktopWindowStateManager,
+                            creationMode);
             mTabListEditorMediator.setNavigationProvider(
                     new TabListEditorNavigationProvider(activity, mTabListEditorController));
             mNeedsCleanUp = false;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorManager.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorManager.java
index 0622b32..f7f0abc8 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorManager.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorManager.java
@@ -21,6 +21,7 @@
 import org.chromium.chrome.browser.tasks.tab_management.TabListEditorAction.ButtonType;
 import org.chromium.chrome.browser.tasks.tab_management.TabListEditorAction.IconPosition;
 import org.chromium.chrome.browser.tasks.tab_management.TabListEditorAction.ShowMode;
+import org.chromium.chrome.browser.tasks.tab_management.TabListEditorCoordinator.CreationMode;
 import org.chromium.chrome.browser.tasks.tab_management.TabListEditorCoordinator.TabListEditorController;
 import org.chromium.chrome.browser.tasks.tab_management.TabUiMetricsHelper.TabListEditorOpenMetricGroups;
 import org.chromium.chrome.browser.tinker_tank.TinkerTankDelegate;
@@ -141,7 +142,8 @@
                             /* gridCardOnClickListenerProvider= */ null,
                             mModalDialogManager,
                             mDesktopWindowStateManager,
-                            mEdgeToEdgeSupplier);
+                            mEdgeToEdgeSupplier,
+                            CreationMode.FULL_SCREEN);
             mControllerSupplier.set(mTabListEditorCoordinator.getController());
         }
     }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMediator.java
index 67c507ec..87e27bbf 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMediator.java
@@ -26,6 +26,7 @@
 import org.chromium.chrome.browser.tab_ui.RecyclerViewPosition;
 import org.chromium.chrome.browser.tabmodel.TabGroupModelFilter;
 import org.chromium.chrome.browser.tabmodel.TabModelObserver;
+import org.chromium.chrome.browser.tasks.tab_management.TabListEditorCoordinator.CreationMode;
 import org.chromium.chrome.browser.tasks.tab_management.TabListEditorCoordinator.LifecycleObserver;
 import org.chromium.chrome.browser.tasks.tab_management.TabProperties.TabActionState;
 import org.chromium.chrome.browser.tasks.tab_management.TabUiMetricsHelper.TabListEditorExitMetricGroups;
@@ -34,7 +35,6 @@
 import org.chromium.components.browser_ui.desktop_windowing.AppHeaderState;
 import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateManager;
 import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateManager.AppHeaderObserver;
-import org.chromium.components.browser_ui.styles.ChromeColors;
 import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate;
 import org.chromium.ui.modelutil.ListModelChangeProcessor;
 import org.chromium.ui.modelutil.PropertyKey;
@@ -68,6 +68,7 @@
     private final List<Tab> mVisibleTabs = new ArrayList<>();
     private final TabListEditorLayout mTabListEditorLayout;
     private final @Nullable DesktopWindowStateManager mDesktopWindowStateManager;
+    private final @CreationMode int mCreationMode;
 
     private @Nullable TabListCoordinator mTabListCoordinator;
     private @Nullable TabListEditorCoordinator.ResetHandler mResetHandler;
@@ -100,7 +101,8 @@
             BottomSheetController bottomSheetController,
             TabListEditorLayout tabListEditorLayout,
             @TabActionState int initialTabActionState,
-            @Nullable DesktopWindowStateManager desktopWindowStateManager) {
+            @Nullable DesktopWindowStateManager desktopWindowStateManager,
+            @CreationMode int creationMode) {
         mContext = context;
         mCurrentTabGroupModelFilterSupplier = currentTabGroupModelFilterSupplier;
         mModel = model;
@@ -111,6 +113,7 @@
         mTabListEditorLayout = tabListEditorLayout;
         mTabActionState = initialTabActionState;
         mDesktopWindowStateManager = desktopWindowStateManager;
+        mCreationMode = creationMode;
 
         mTabModelObserver =
                 new TabModelObserver() {
@@ -177,10 +180,14 @@
     }
 
     private void updateColors(boolean isIncognito) {
-        @ColorInt int primaryColor = ChromeColors.getPrimaryBackgroundColor(mContext, isIncognito);
+        @ColorInt
+        int primaryColor =
+                TabUiThemeProvider.getTabGridDialogBackgroundColor(
+                        mContext, isIncognito, mCreationMode);
         @ColorInt
         int toolbarBackgroundColor =
-                TabUiThemeProvider.getTabSelectionToolbarBackground(mContext, isIncognito);
+                TabUiThemeProvider.getTabSelectionToolbarBackground(
+                        mContext, isIncognito, mCreationMode);
         ColorStateList toolbarTintColorList =
                 TabUiThemeProvider.getTabSelectionToolbarIconTintList(mContext, isIncognito);
 
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMediatorUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMediatorUnitTest.java
index 33e5f04e..1575c5e 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMediatorUnitTest.java
@@ -21,6 +21,7 @@
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.chrome.browser.tabmodel.TabGroupModelFilter;
+import org.chromium.chrome.browser.tasks.tab_management.TabListEditorCoordinator.CreationMode;
 import org.chromium.chrome.browser.tasks.tab_management.TabProperties.TabActionState;
 import org.chromium.components.browser_ui.desktop_windowing.AppHeaderState;
 import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateManager;
@@ -52,7 +53,8 @@
                         /* bottomSheetController= */ null,
                         /* tabListEditorLayout= */ null,
                         TabActionState.SELECTABLE,
-                        mDesktopWindowStateManager);
+                        mDesktopWindowStateManager,
+                        CreationMode.FULL_SCREEN);
     }
 
     @After
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiThemeProvider.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiThemeProvider.java
index 264a78e..e53ae65 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiThemeProvider.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiThemeProvider.java
@@ -16,6 +16,7 @@
 import com.google.android.material.elevation.ElevationOverlayProvider;
 
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.tasks.tab_management.TabListEditorCoordinator.CreationMode;
 import org.chromium.components.browser_ui.styles.ChromeColors;
 import org.chromium.components.browser_ui.styles.SemanticColorUtils;
 
@@ -193,6 +194,24 @@
     }
 
     /**
+     * Returns the color used for tab selector list background based on the incognito mode and
+     * creation mode.
+     *
+     * @param context {@link Context} used to retrieve color.
+     * @param isIncognito Whether the color is used for incognito mode.
+     * @param creationMode The mode of creation of the tab selector list.
+     * @return The background color.
+     */
+    public static @ColorInt int getTabGridDialogBackgroundColor(
+            Context context, boolean isIncognito, @CreationMode int creationMode) {
+        if (creationMode == CreationMode.DIALOG) {
+            return getTabGridDialogBackgroundColor(context, isIncognito);
+        } else {
+            return ChromeColors.getPrimaryBackgroundColor(context, isIncognito);
+        }
+    }
+
+    /**
      * Returns the color used for tab grid dialog background based on the incognito mode.
      *
      * @param context {@link Context} used to retrieve color.
@@ -339,13 +358,18 @@
      *
      * @param context {@link Context} used to retrieve color.
      * @param isIncognito Whether the color is used for incognito mode.
+     * @param creationMode The mode of creation of the tab selector list.
      * @return The background color for the toolbar when tab switcher is in selection edit mode.
      */
     public static @ColorInt int getTabSelectionToolbarBackground(
-            Context context, boolean isIncognito) {
+            Context context, boolean isIncognito, @CreationMode int creationMode) {
         if (isIncognito) {
             return context.getColor(R.color.incognito_tab_list_editor_toolbar_bg_color);
         } else {
+            if (creationMode == CreationMode.DIALOG) {
+                return ContextCompat.getColor(context, R.color.tab_grid_dialog_bg_color);
+            }
+
             return MaterialColors.getColor(context, R.attr.colorSurface, TAG);
         }
     }
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb
index 237ce59..2bcdab039 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb
@@ -14,6 +14,7 @@
 Ako je izbrišete, svi će odmah izgubiti pristup grupi kartica "<ph name="TITLE_OF_GROUP" />" i grupa će se izbrisati sa svih uređaja.</translation>
 <translation id="1329584516321524826">Upravo ažurirano</translation>
 <translation id="1340839264183302272">Napusti grupu</translation>
+<translation id="1403729629346559879">{NUMBER_OF_TABS,plural, =1{Proširite dijeljenu grupu kartica <ph name="TITLE_OF_GROUP" /> s <ph name="TABS_COUNT_ONE" /> karticom. Grupa je <ph name="COLOR_NAME" /> i ima oznaku <ph name="CARD_LABEL" />.}one{Proširite dijeljenu grupu kartica <ph name="TITLE_OF_GROUP" /> s <ph name="TABS_COUNT_MANY" /> karticom. Grupa je <ph name="COLOR_NAME" /> i ima oznaku <ph name="CARD_LABEL" />.}few{Proširite dijeljenu grupu kartica <ph name="TITLE_OF_GROUP" /> s <ph name="TABS_COUNT_MANY" /> kartice. Grupa je <ph name="COLOR_NAME" /> i ima oznaku <ph name="CARD_LABEL" />.}other{Proširite dijeljenu grupu kartica <ph name="TITLE_OF_GROUP" /> s <ph name="TABS_COUNT_MANY" /> kartica. Grupa je <ph name="COLOR_NAME" /> i ima oznaku <ph name="CARD_LABEL" />.}}</translation>
 <translation id="1419023007528516122">Ovo će trajno izbrisati grupu s uređaja</translation>
 <translation id="1486715732399361704">Ovdje možete pronaći sve grupe kartica</translation>
 <translation id="149054111719651807">{NUM_MINS,plural, =1{Kreirano je prije <ph name="NUM_MINS_ONE" /> minute}one{Kreirano je prije <ph name="NUM_MINS_MANY" /> minute}few{Kreirano je prije <ph name="NUM_MINS_MANY" /> minute}other{Kreirano je prije <ph name="NUM_MINS_MANY" /> minuta}}</translation>
@@ -108,6 +109,7 @@
 <translation id="4895402777090717310">{TABS_COUNT,plural, =1{Zatvori karticu}one{Zatvori kartice}few{Zatvori kartice}other{Zatvori kartice}}</translation>
 <translation id="4908147833782857886">Sačuvano je više grupa (<ph name="USER_EMAIL" />) (kartice će se zatvoriti, a grupe izbrisati)</translation>
 <translation id="492284538114688557">Primijećen je pad cijene</translation>
+<translation id="4937582754153367435">{NUMBER_OF_TABS,plural, =1{Proširite dijeljenu grupu kartica s <ph name="TABS_COUNT_ONE" /> karticom. Grupa je <ph name="COLOR_NAME" /> i ima oznaku <ph name="CARD_LABEL" />.}one{Proširite dijeljenu grupu kartica s <ph name="TABS_COUNT_MANY" /> karticom. Grupa je <ph name="COLOR_NAME" /> i ima oznaku <ph name="CARD_LABEL" />.}few{Proširite dijeljenu grupu kartica s <ph name="TABS_COUNT_MANY" /> kartice. Grupa je <ph name="COLOR_NAME" /> i ima oznaku <ph name="CARD_LABEL" />.}other{Proširite dijeljenu grupu kartica s <ph name="TABS_COUNT_MANY" /> kartica. Grupa je <ph name="COLOR_NAME" /> i ima oznaku <ph name="CARD_LABEL" />.}}</translation>
 <translation id="5007392906805964215">Pregled</translation>
 <translation id="5073204694187207510">Sakrij mrežu cijelog ekrana</translation>
 <translation id="5076161749301278626">Želite li pogledati recenzije trgovine?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb
index e81b4cc0..bc40ce9 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb
@@ -14,6 +14,7 @@
 Kui te selle kustutate, kaotavad kõik kohe juurdepääsu vahelehegrupile „<ph name="TITLE_OF_GROUP" />“ ja see kustutatakse kõigist seadmetest.</translation>
 <translation id="1329584516321524826">Just värskendatud</translation>
 <translation id="1340839264183302272">Lahku grupist</translation>
+<translation id="1403729629346559879">{NUMBER_OF_TABS,plural, =1{Jagatud vahelehegrupi <ph name="TITLE_OF_GROUP" /> laiendamine <ph name="TABS_COUNT_ONE" /> vahelehega, värv on <ph name="COLOR_NAME" />, silt on <ph name="CARD_LABEL" />.}other{Jagatud vahelehegrupi <ph name="TITLE_OF_GROUP" /> laiendamine <ph name="TABS_COUNT_MANY" /> vahelehega, värv on <ph name="COLOR_NAME" />, silt on <ph name="CARD_LABEL" />.}}</translation>
 <translation id="1419023007528516122">See kustutab grupi jäädavalt teie seadmest.</translation>
 <translation id="1486715732399361704">Siit leiate kõik oma vahelegrupid</translation>
 <translation id="149054111719651807">{NUM_MINS,plural, =1{Loodud <ph name="NUM_MINS_ONE" /> minut tagasi}other{Loodud <ph name="NUM_MINS_MANY" /> minutit tagasi}}</translation>
@@ -108,6 +109,7 @@
 <translation id="4895402777090717310">{TABS_COUNT,plural, =1{Sule vaheleht}other{Sule vahelehed}}</translation>
 <translation id="4908147833782857886"><ph name="USER_EMAIL" /> grupid on salvestatud (sulgeb vahelehed ja kustutab grupid)</translation>
 <translation id="492284538114688557">Märgati hinnalangust</translation>
+<translation id="4937582754153367435">{NUMBER_OF_TABS,plural, =1{Jagatud vahelehegrupi laiendamine <ph name="TABS_COUNT_ONE" /> vahelehega, värv on <ph name="COLOR_NAME" />, silt on <ph name="CARD_LABEL" />.}other{Jagatud vahelehegrupi laiendamine <ph name="TABS_COUNT_MANY" /> vahelehega, värv on <ph name="COLOR_NAME" />, silt on <ph name="CARD_LABEL" />.}}</translation>
 <translation id="5007392906805964215">Vaata üle</translation>
 <translation id="5073204694187207510">Peida täisekraani ruudustik</translation>
 <translation id="5076161749301278626">Kas kuvada poe arvustused?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hr.xtb
index 15772c30..d618186 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hr.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hr.xtb
@@ -14,6 +14,7 @@
 Ako je izbrišete, svi će odmah izgubiti pristup grupi kartica <ph name="TITLE_OF_GROUP" /> i izbrisat će se sa svih uređaja.</translation>
 <translation id="1329584516321524826">Upravo je ažurirano</translation>
 <translation id="1340839264183302272">Napusti grupu</translation>
+<translation id="1403729629346559879">{NUMBER_OF_TABS,plural, =1{Proširite dijeljenu grupu kartica <ph name="TITLE_OF_GROUP" /> s <ph name="TABS_COUNT_ONE" /> karticom. Grupa je <ph name="COLOR_NAME" /> i ima oznaku <ph name="CARD_LABEL" />.}one{Proširite dijeljenu grupu kartica <ph name="TITLE_OF_GROUP" /> s <ph name="TABS_COUNT_MANY" /> karticom. Grupa je <ph name="COLOR_NAME" /> i ima oznaku <ph name="CARD_LABEL" />.}few{Proširite dijeljenu grupu kartica <ph name="TITLE_OF_GROUP" /> s <ph name="TABS_COUNT_MANY" /> kartice. Grupa je <ph name="COLOR_NAME" /> i ima oznaku <ph name="CARD_LABEL" />.}other{Proširite dijeljenu grupu kartica <ph name="TITLE_OF_GROUP" /> s <ph name="TABS_COUNT_MANY" /> kartica. Grupa je <ph name="COLOR_NAME" /> i ima oznaku <ph name="CARD_LABEL" />.}}</translation>
 <translation id="1419023007528516122">Time ćete trajno izbrisati grupu s uređaja</translation>
 <translation id="1486715732399361704">Ovdje možete pronaći sve svoje grupe kartica</translation>
 <translation id="149054111719651807">{NUM_MINS,plural, =1{Izrađeno prije <ph name="NUM_MINS_ONE" /> minutu}one{Izrađeno prije <ph name="NUM_MINS_MANY" /> minutu}few{Izrađeno prije <ph name="NUM_MINS_MANY" /> minute}other{Izrađeno prije <ph name="NUM_MINS_MANY" /> minuta}}</translation>
@@ -108,6 +109,7 @@
 <translation id="4895402777090717310">{TABS_COUNT,plural, =1{Zatvori karticu}one{Zatvori kartice}few{Zatvori kartice}other{Zatvori kartice}}</translation>
 <translation id="4908147833782857886">Spremljeno grupa: <ph name="USER_EMAIL" /> (zatvorit će se kartice i izbrisati grupe)</translation>
 <translation id="492284538114688557">Otkriven je pad cijene</translation>
+<translation id="4937582754153367435">{NUMBER_OF_TABS,plural, =1{Proširite dijeljenu grupu kartica s <ph name="TABS_COUNT_ONE" /> karticom. Grupa je <ph name="COLOR_NAME" /> i ima oznaku <ph name="CARD_LABEL" />.}one{Proširite dijeljenu grupu kartica s <ph name="TABS_COUNT_MANY" /> karticom. Grupa je <ph name="COLOR_NAME" /> i ima oznaku <ph name="CARD_LABEL" />.}few{Proširite dijeljenu grupu kartica s <ph name="TABS_COUNT_MANY" /> kartice. Grupa je <ph name="COLOR_NAME" /> i ima oznaku <ph name="CARD_LABEL" />.}other{Proširite dijeljenu grupu kartica s <ph name="TABS_COUNT_MANY" /> kartica. Grupa je <ph name="COLOR_NAME" /> i ima oznaku <ph name="CARD_LABEL" />.}}</translation>
 <translation id="5007392906805964215">Pregled</translation>
 <translation id="5073204694187207510">Sakrij rešetku na cijelom zaslonu</translation>
 <translation id="5076161749301278626">Pregled recenzija trgovine?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb
index a12b9c2..59f59a2 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb
@@ -14,6 +14,7 @@
 თუ წაშლით, ყველა დაუყოვნებლივ დაკარგავს წვდომა ჩანართების ჯგუფზე „<ph name="TITLE_OF_GROUP" />“ და ის ყველა მოწყობილობიდანაც წაიშლება.</translation>
 <translation id="1329584516321524826">განახლდა ახლახან</translation>
 <translation id="1340839264183302272">ჯგუფიდან გასვლა</translation>
+<translation id="1403729629346559879">{NUMBER_OF_TABS,plural, =1{გააფართოვეთ ჩანართების <ph name="TABS_COUNT_ONE" />-ჩანართიანი გაზიარებული ჯგუფი „<ph name="TITLE_OF_GROUP" />“, <ph name="COLOR_NAME" /> ფერის, ლეიბლით <ph name="CARD_LABEL" />.}other{გააფართოვეთ ჩანართების <ph name="TABS_COUNT_MANY" />-ჩანართიანი გაზიარებული ჯგუფები „<ph name="TITLE_OF_GROUP" />“, <ph name="COLOR_NAME" /> ფერის, ლეიბლით <ph name="CARD_LABEL" />.}}</translation>
 <translation id="1419023007528516122">ამ მოქმედებით თქვენი მოწყობილობა სამუდამოდ ამოიშლება ჯგუფიდან</translation>
 <translation id="1486715732399361704">ჩანართების ყველა ჯგუფს აქ ნახავთ</translation>
 <translation id="149054111719651807">{NUM_MINS,plural, =1{შეიქმნა <ph name="NUM_MINS_ONE" /> წუთის წინ}other{შეიქმნა <ph name="NUM_MINS_MANY" /> წუთის წინ}}</translation>
@@ -108,6 +109,7 @@
 <translation id="4895402777090717310">{TABS_COUNT,plural, =1{ჩანართის დახურვა}other{ჩანართების დახურვა}}</translation>
 <translation id="4908147833782857886"><ph name="USER_EMAIL" />-ის შენახული ჯგუფები (დაიხურება ჩანართები და წაიშლება ჯგუფები)</translation>
 <translation id="492284538114688557">აღმოჩენილია ფასის დაწევა</translation>
+<translation id="4937582754153367435">{NUMBER_OF_TABS,plural, =1{გააფართოვეთ ჩანართების <ph name="TABS_COUNT_ONE" />-ჩანართიანი ჯგუფი, <ph name="COLOR_NAME" /> ფერის, ლეიბლით <ph name="CARD_LABEL" />.}other{გააფართოვეთ ჩანართების <ph name="TABS_COUNT_MANY" />-ჩანართიანი ჯგუფები, <ph name="COLOR_NAME" /> ფერის, ლეიბლით <ph name="CARD_LABEL" />.}}</translation>
 <translation id="5007392906805964215">გადახედვა</translation>
 <translation id="5073204694187207510">სრულეკრანიანი ბადის დამალვა</translation>
 <translation id="5076161749301278626">გსურთ, ნახოთ მიმოხილვები მაღაზიიდან?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb
index bc42f88c..652edecf 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb
@@ -14,6 +14,7 @@
 ನೀವು ಅದನ್ನು ಅಳಿಸಿದರೆ, ಎಲ್ಲರೂ ತಕ್ಷಣವೇ "<ph name="TITLE_OF_GROUP" />" ಟ್ಯಾಬ್ ಗುಂಪಿಗೆ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಕಳೆದುಕೊಳ್ಳುತ್ತಾರೆ ಮತ್ತು ಅದನ್ನು ಎಲ್ಲಾ ಸಾಧನಗಳಿಂದ ಅಳಿಸಲಾಗುತ್ತದೆ.</translation>
 <translation id="1329584516321524826">ಇದೀಗ ಅಪ್‌ಡೇಟ್‌ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="1340839264183302272">ಗುಂಪನ್ನು ತೊರೆಯಿರಿ</translation>
+<translation id="1403729629346559879">{NUMBER_OF_TABS,plural, =1{<ph name="TABS_COUNT_ONE" /> ಟ್ಯಾಬ್, <ph name="COLOR_NAME" /> ಬಣ್ಣ, <ph name="CARD_LABEL" /> ಎಂಬ ಲೇಬಲ್ ಅನ್ನು ಹೊಂದಿರುವ ಹಂಚಿಕೊಳ್ಳಲಾದ <ph name="TITLE_OF_GROUP" /> ಟ್ಯಾಬ್ ಗುಂಪನ್ನು ವಿಸ್ತರಿಸಿ.}one{<ph name="TABS_COUNT_MANY" /> ಟ್ಯಾಬ್‌ಗಳು, <ph name="COLOR_NAME" /> ಬಣ್ಣ, <ph name="CARD_LABEL" /> ಎಂಬ ಲೇಬಲ್ ಅನ್ನು ಹೊಂದಿರುವ ಹಂಚಿಕೊಳ್ಳಲಾದ <ph name="TITLE_OF_GROUP" /> ಟ್ಯಾಬ್ ಗುಂಪನ್ನು ವಿಸ್ತರಿಸಿ.}other{<ph name="TABS_COUNT_MANY" /> ಟ್ಯಾಬ್‌ಗಳು, <ph name="COLOR_NAME" /> ಬಣ್ಣ, <ph name="CARD_LABEL" /> ಎಂಬ ಲೇಬಲ್ ಅನ್ನು ಹೊಂದಿರುವ ಹಂಚಿಕೊಳ್ಳಲಾದ <ph name="TITLE_OF_GROUP" /> ಟ್ಯಾಬ್ ಗುಂಪನ್ನು ವಿಸ್ತರಿಸಿ.}}</translation>
 <translation id="1419023007528516122">ಇದು ನಿಮ್ಮ ಸಾಧನದಿಂದ ಗುಂಪನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸುತ್ತದೆ</translation>
 <translation id="1486715732399361704">ನಿಮ್ಮ ಎಲ್ಲಾ ಟ್ಯಾಬ್ ಗುಂಪುಗಳನ್ನು ನೀವು ಇಲ್ಲಿ ಕಾಣಬಹುದು</translation>
 <translation id="149054111719651807">{NUM_MINS,plural, =1{<ph name="NUM_MINS_ONE" /> ನಿಮಿಷದ ಹಿಂದೆ ರಚಿಸಲಾಗಿದೆ}one{<ph name="NUM_MINS_MANY" /> ನಿಮಿಷಗಳ ಹಿಂದೆ ರಚಿಸಲಾಗಿದೆ}other{<ph name="NUM_MINS_MANY" /> ನಿಮಿಷಗಳ ಹಿಂದೆ ರಚಿಸಲಾಗಿದೆ}}</translation>
@@ -108,6 +109,7 @@
 <translation id="4895402777090717310">{TABS_COUNT,plural, =1{ಟ್ಯಾಬ್ ಅನ್ನು ಮುಚ್ಚಿರಿ}one{ಟ್ಯಾಬ್‌ಗಳನ್ನು ಮುಚ್ಚಿರಿ}other{ಟ್ಯಾಬ್‌ಗಳನ್ನು ಮುಚ್ಚಿರಿ}}</translation>
 <translation id="4908147833782857886"><ph name="USER_EMAIL" /> ಗುಂಪುಗಳನ್ನು ಸೇವ್‌ಮಾಡಲಾಗಿದೆ (ಟ್ಯಾಬ್‌ಗಳನ್ನು ಮುಚ್ಚುತ್ತದೆ ಮತ್ತು ಗುಂಪುಗಳನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ)</translation>
 <translation id="492284538114688557">ದರ ಇಳಿಕೆ ಕಂಡುಬಂದಿದೆ</translation>
+<translation id="4937582754153367435">{NUMBER_OF_TABS,plural, =1{<ph name="TABS_COUNT_ONE" /> ಟ್ಯಾಬ್, <ph name="COLOR_NAME" /> ಬಣ್ಣ, <ph name="CARD_LABEL" /> ಎಂಬ ಲೇಬಲ್ ಅನ್ನು ಹೊಂದಿರುವ ಹಂಚಿಕೊಳ್ಳಲಾದ ಟ್ಯಾಬ್ ಗುಂಪನ್ನು ವಿಸ್ತರಿಸಿ.}one{<ph name="TABS_COUNT_MANY" /> ಟ್ಯಾಬ್‌ಗಳು, <ph name="COLOR_NAME" /> ಬಣ್ಣ, <ph name="CARD_LABEL" /> ಎಂಬ ಲೇಬಲ್ ಅನ್ನು ಹೊಂದಿರುವ ಹಂಚಿಕೊಳ್ಳಲಾದ ಟ್ಯಾಬ್ ಗುಂಪನ್ನು ವಿಸ್ತರಿಸಿ.}other{<ph name="TABS_COUNT_MANY" /> ಟ್ಯಾಬ್‌ಗಳು, <ph name="COLOR_NAME" /> ಬಣ್ಣ, <ph name="CARD_LABEL" /> ಎಂಬ ಲೇಬಲ್ ಅನ್ನು ಹೊಂದಿರುವ ಹಂಚಿಕೊಳ್ಳಲಾದ ಟ್ಯಾಬ್ ಗುಂಪನ್ನು ವಿಸ್ತರಿಸಿ.}}</translation>
 <translation id="5007392906805964215">ಪರಿಶೀಲಿಸಿ</translation>
 <translation id="5073204694187207510">ಪೂರ್ಣ ಸ್ಕ್ರೀನ್ ಗ್ರಿಡ್‌ ಅನ್ನು ಮರೆಮಾಡಿ</translation>
 <translation id="5076161749301278626">ಸ್ಟೋರ್ ವಿಮರ್ಶೆಗಳನ್ನು ನೋಡಬೇಕೆ?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb
index 02b5f22c..ac253fe 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb
@@ -14,6 +14,7 @@
 ဖျက်လိုက်ပါက လူတိုင်းသည် “<ph name="TITLE_OF_GROUP" />” တဘ်အုပ်စုသုံးခွင့် ချက်ချင်းဆုံးရှုံးမည်ဖြစ်ပြီး ၎င်းကို စက်အားလုံးမှ ဖျက်ပါမည်။</translation>
 <translation id="1329584516321524826">ယခုလေးတင် အပ်ဒိတ်လုပ်ထားသည်</translation>
 <translation id="1340839264183302272">အဖွဲ့မှထွက်ရန်</translation>
+<translation id="1403729629346559879">{NUMBER_OF_TABS,plural, =1{တဘ် <ph name="TABS_COUNT_ONE" /> ခု၊ <ph name="COLOR_NAME" /> ရောင်၊ <ph name="CARD_LABEL" /> အညွှန်းဖြင့် မျှဝေထားသော <ph name="TITLE_OF_GROUP" /> တဘ်အုပ်စုကို ပိုပြပါ။}other{တဘ် <ph name="TABS_COUNT_MANY" /> ခု၊ <ph name="COLOR_NAME" /> ရောင်၊ <ph name="CARD_LABEL" /> အညွှန်းဖြင့် မျှဝေထားသော <ph name="TITLE_OF_GROUP" /> တဘ်အုပ်စုကို ပိုပြပါ။}}</translation>
 <translation id="1419023007528516122">၎င်းသည် သင့်စက်မှအဖွဲ့ကို အပြီးဖျက်ပါမည်</translation>
 <translation id="1486715732399361704">သင့်တဘ်အုပ်စုအားလုံးကို ဤနေရာတွင် တွေ့နိုင်သည်</translation>
 <translation id="149054111719651807">{NUM_MINS,plural, =1{ပြီးခဲ့သော <ph name="NUM_MINS_ONE" /> မိနစ်က ပြုလုပ်ထားသည်}other{ပြီးခဲ့သော <ph name="NUM_MINS_MANY" /> မိနစ်က ပြုလုပ်ထားသည်}}</translation>
@@ -108,6 +109,7 @@
 <translation id="4895402777090717310">{TABS_COUNT,plural, =1{တဘ် ပိတ်ရန်}other{တဘ်များ ပိတ်ရန်}}</translation>
 <translation id="4908147833782857886">အုပ်စု <ph name="USER_EMAIL" /> ခု သိမ်းလိုက်ပြီ (တဘ်များပိတ်ပြီး အုပ်စုများကို ဖျက်ပါမည်)</translation>
 <translation id="492284538114688557">ဈေးကျသွားသည်ကို တွေ့သည်</translation>
+<translation id="4937582754153367435">{NUMBER_OF_TABS,plural, =1{တဘ် <ph name="TABS_COUNT_ONE" /> ခု၊ <ph name="COLOR_NAME" /> ရောင်၊ <ph name="CARD_LABEL" /> အညွှန်းဖြင့် မျှဝေထားသော တဘ်အုပ်စုကို ပိုပြပါ။}other{တဘ် <ph name="TABS_COUNT_MANY" /> ခု၊ <ph name="COLOR_NAME" /> ရောင်၊ <ph name="CARD_LABEL" /> အညွှန်းဖြင့် မျှဝေထားသော တဘ်အုပ်စုကို ပိုပြပါ။}}</translation>
 <translation id="5007392906805964215">ပြန်ကြည့်ရန်</translation>
 <translation id="5073204694187207510">မျက်နှာပြင်ပြည့် ဇယားကွက်ကို ဝှက်ရန်</translation>
 <translation id="5076161749301278626">ဆိုင်အကြောင်း သုံးသပ်ချက်များ ကြည့်မလား။</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pa.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pa.xtb
index e79acaf..30259d1b 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pa.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pa.xtb
@@ -14,6 +14,7 @@
 ਜੇ ਤੁਸੀਂ ਇਸਨੂੰ ਮਿਟਾਉਂਦੇ ਹੋ, ਤਾਂ ਹਰ ਕੋਈ "<ph name="TITLE_OF_GROUP" />" ਟੈਬ ਗਰੁੱਪ ਤੱਕ ਤੁਰੰਤ ਪਹੁੰਚ ਗੁਆ ਦੇਵੇਗਾ ਅਤੇ ਇਸਨੂੰ ਸਾਰੇ ਡੀਵਾਈਸਾਂ ਤੋਂ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।</translation>
 <translation id="1329584516321524826">ਬਿਲਕੁਲ ਹੁਣੇ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ</translation>
 <translation id="1340839264183302272">ਗਰੁੱਪ ਛੱਡੋ</translation>
+<translation id="1403729629346559879">{NUMBER_OF_TABS,plural, =1{<ph name="TABS_COUNT_ONE" /> ਟੈਬ, <ph name="COLOR_NAME" /> ਰੰਗ ਅਤੇ <ph name="CARD_LABEL" /> ਲੇਬਲ ਵਾਲੇ ਸਾਂਝੇ ਕੀਤੇ <ph name="TITLE_OF_GROUP" /> ਟੈਬ ਗਰੁੱਪ ਦਾ ਵਿਸਤਾਰ ਕਰੋ।}one{<ph name="TABS_COUNT_MANY" /> ਟੈਬ, <ph name="COLOR_NAME" /> ਰੰਗ ਅਤੇ <ph name="CARD_LABEL" /> ਲੇਬਲ ਵਾਲੇ ਸਾਂਝੇ ਕੀਤੇ <ph name="TITLE_OF_GROUP" /> ਟੈਬ ਗਰੁੱਪ ਦਾ ਵਿਸਤਾਰ ਕਰੋ।}other{<ph name="TABS_COUNT_MANY" /> ਟੈਬਾਂ, <ph name="COLOR_NAME" /> ਰੰਗ ਅਤੇ <ph name="CARD_LABEL" /> ਲੇਬਲ ਵਾਲੇ ਸਾਂਝੇ ਕੀਤੇ <ph name="TITLE_OF_GROUP" /> ਟੈਬ ਗਰੁੱਪ ਦਾ ਵਿਸਤਾਰ ਕਰੋ।}}</translation>
 <translation id="1419023007528516122">ਇਸ ਨਾਲ ਗਰੁੱਪ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਤੋਂ ਪੱਕੇ ਤੌਰ 'ਤੇ ਮਿਟ ਜਾਵੇਗਾ</translation>
 <translation id="1486715732399361704">ਤੁਸੀਂ ਇੱਥੇ ਆਪਣੇ ਸਾਰੇ ਟੈਬ ਗਰੁੱਪਾਂ ਨੂੰ ਦੇਖ ਸਕਦੇ ਹੋ</translation>
 <translation id="149054111719651807">{NUM_MINS,plural, =1{<ph name="NUM_MINS_ONE" /> ਮਿੰਟ ਪਹਿਲਾਂ ਬਣਾਇਆ ਗਿਆ}one{<ph name="NUM_MINS_MANY" /> ਮਿੰਟ ਪਹਿਲਾਂ ਬਣਾਇਆ ਗਿਆ}other{<ph name="NUM_MINS_MANY" /> ਮਿੰਟ ਪਹਿਲਾਂ ਬਣਾਇਆ ਗਿਆ}}</translation>
@@ -108,6 +109,7 @@
 <translation id="4895402777090717310">{TABS_COUNT,plural, =1{ਟੈਬ ਨੂੰ ਬੰਦ ਕਰੋ}one{ਟੈਬ ਨੂੰ ਬੰਦ ਕਰੋ}other{ਟੈਬਾਂ ਨੂੰ ਬੰਦ ਕਰੋ}}</translation>
 <translation id="4908147833782857886"><ph name="USER_EMAIL" /> ਗਰੁੱਪ ਰੱਖਿਅਤ ਕੀਤੇ ਗਏ (ਇਸ ਨਾਲ ਟੈਬਾਂ ਬੰਦ ਹੋ ਜਾਣਗੀਆਂ ਅਤੇ ਗਰੁੱਪ ਮਿਟਾ ਦਿੱਤੇ ਜਾਣਗੇ)</translation>
 <translation id="492284538114688557">ਕੀਮਤ ਘਟਣ ਦਾ ਪਤਾ ਲੱਗਿਆ</translation>
+<translation id="4937582754153367435">{NUMBER_OF_TABS,plural, =1{<ph name="TABS_COUNT_ONE" /> ਟੈਬ, <ph name="COLOR_NAME" /> ਰੰਗ ਅਤੇ <ph name="CARD_LABEL" /> ਲੇਬਲ ਵਾਲੇ ਸਾਂਝੇ ਕੀਤੇ ਟੈਬ ਗਰੁੱਪ ਦਾ ਵਿਸਤਾਰ ਕਰੋ।}one{<ph name="TABS_COUNT_MANY" /> ਟੈਬ, <ph name="COLOR_NAME" /> ਰੰਗ ਅਤੇ <ph name="CARD_LABEL" /> ਲੇਬਲ ਵਾਲੇ ਸਾਂਝੇ ਕੀਤੇ ਟੈਬ ਗਰੁੱਪ ਦਾ ਵਿਸਤਾਰ ਕਰੋ।}other{<ph name="TABS_COUNT_MANY" /> ਟੈਬਾਂ, <ph name="COLOR_NAME" /> ਰੰਗ ਅਤੇ <ph name="CARD_LABEL" /> ਲੇਬਲ ਵਾਲੇ ਸਾਂਝੇ ਕੀਤੇ ਟੈਬ ਗਰੁੱਪ ਦਾ ਵਿਸਤਾਰ ਕਰੋ।}}</translation>
 <translation id="5007392906805964215">ਸਮੀਖਿਆ ਕਰੋ</translation>
 <translation id="5073204694187207510">ਪੂਰੀ-ਸਕ੍ਰੀਨ ਗ੍ਰਿਡ ਨੂੰ ਲੁਕਾਓ</translation>
 <translation id="5076161749301278626">ਕੀ ਸਟੋਰ ਦੀਆਂ ਸਮੀਖਿਆਵਾਂ ਦੇਖਣੀਆਂ ਹਨ?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr-Latn.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr-Latn.xtb
index 5843c38..522c90d 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr-Latn.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr-Latn.xtb
@@ -14,6 +14,7 @@
 Ako je izbrišete, svi će odmah izgubiti pristup grupi kartica <ph name="TITLE_OF_GROUP" /> i ona će biti izbrisana sa svih uređaja.</translation>
 <translation id="1329584516321524826">Ažurirano je malopre</translation>
 <translation id="1340839264183302272">Napusti grupu</translation>
+<translation id="1403729629346559879">{NUMBER_OF_TABS,plural, =1{Proširite deljenu grupu kartica <ph name="TITLE_OF_GROUP" /> sa <ph name="TABS_COUNT_ONE" /> karticom, boje <ph name="COLOR_NAME" />, sa oznakom <ph name="CARD_LABEL" />.}one{Proširite deljenu grupu kartica <ph name="TITLE_OF_GROUP" /> sa <ph name="TABS_COUNT_MANY" /> karticom, boje <ph name="COLOR_NAME" />, sa oznakom <ph name="CARD_LABEL" />.}few{Proširite deljenu grupu kartica <ph name="TITLE_OF_GROUP" /> sa <ph name="TABS_COUNT_MANY" /> kartice, boje <ph name="COLOR_NAME" />, sa oznakom <ph name="CARD_LABEL" />.}other{Proširite deljenu grupu kartica <ph name="TITLE_OF_GROUP" /> sa <ph name="TABS_COUNT_MANY" /> kartica, boje <ph name="COLOR_NAME" />, sa oznakom <ph name="CARD_LABEL" />.}}</translation>
 <translation id="1419023007528516122">Ovim ćete trajno izbrisati grupu sa uređaja</translation>
 <translation id="1486715732399361704">Ovde možete da pronađete sve grupe kartica</translation>
 <translation id="149054111719651807">{NUM_MINS,plural, =1{Napravljeno je pre <ph name="NUM_MINS_ONE" /> minut}one{Napravljeno je pre <ph name="NUM_MINS_MANY" /> minut}few{Napravljeno je pre <ph name="NUM_MINS_MANY" /> minuta}other{Napravljeno je pre <ph name="NUM_MINS_MANY" /> minuta}}</translation>
@@ -108,6 +109,7 @@
 <translation id="4895402777090717310">{TABS_COUNT,plural, =1{Zatvori karticu}one{Zatvori kartice}few{Zatvori kartice}other{Zatvori kartice}}</translation>
 <translation id="4908147833782857886">Grupe (<ph name="USER_EMAIL" />) su sačuvane (zatvoriće se kartice i izbrisati grupe)</translation>
 <translation id="492284538114688557">Uočeno je sniženje</translation>
+<translation id="4937582754153367435">{NUMBER_OF_TABS,plural, =1{Proširite deljenu grupu kartica sa <ph name="TABS_COUNT_ONE" /> karticom, boje <ph name="COLOR_NAME" />, sa oznakom <ph name="CARD_LABEL" />.}one{Proširite deljenu grupu kartica sa <ph name="TABS_COUNT_MANY" /> karticom, boje <ph name="COLOR_NAME" />, sa oznakom <ph name="CARD_LABEL" />.}few{Proširite deljenu grupu kartica sa <ph name="TABS_COUNT_MANY" /> kartice, boje <ph name="COLOR_NAME" />, sa oznakom <ph name="CARD_LABEL" />.}other{Proširite deljenu grupu kartica sa <ph name="TABS_COUNT_MANY" /> kartica, boje <ph name="COLOR_NAME" />, sa oznakom <ph name="CARD_LABEL" />.}}</translation>
 <translation id="5007392906805964215">Pregledaj</translation>
 <translation id="5073204694187207510">Sakrijte prikaz mreže na celom ekranu</translation>
 <translation id="5076161749301278626">Želite da vidite recenzije prodavnica?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb
index db17497..2a5d812 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb
@@ -14,6 +14,7 @@
 Ако је избришете, сви ће одмах изгубити приступ групи картица <ph name="TITLE_OF_GROUP" /> и она ће бити избрисана са свих уређаја.</translation>
 <translation id="1329584516321524826">Ажурирано је малопре</translation>
 <translation id="1340839264183302272">Напусти групу</translation>
+<translation id="1403729629346559879">{NUMBER_OF_TABS,plural, =1{Проширите дељену групу картица <ph name="TITLE_OF_GROUP" /> са <ph name="TABS_COUNT_ONE" /> картицом, боје <ph name="COLOR_NAME" />, са ознаком <ph name="CARD_LABEL" />.}one{Проширите дељену групу картица <ph name="TITLE_OF_GROUP" /> са <ph name="TABS_COUNT_MANY" /> картицом, боје <ph name="COLOR_NAME" />, са ознаком <ph name="CARD_LABEL" />.}few{Проширите дељену групу картица <ph name="TITLE_OF_GROUP" /> са <ph name="TABS_COUNT_MANY" /> картице, боје <ph name="COLOR_NAME" />, са ознаком <ph name="CARD_LABEL" />.}other{Проширите дељену групу картица <ph name="TITLE_OF_GROUP" /> са <ph name="TABS_COUNT_MANY" /> картица, боје <ph name="COLOR_NAME" />, са ознаком <ph name="CARD_LABEL" />.}}</translation>
 <translation id="1419023007528516122">Овим ћете трајно избрисати групу са уређаја</translation>
 <translation id="1486715732399361704">Овде можете да пронађете све групе картица</translation>
 <translation id="149054111719651807">{NUM_MINS,plural, =1{Направљено је пре <ph name="NUM_MINS_ONE" /> минут}one{Направљено је пре <ph name="NUM_MINS_MANY" /> минут}few{Направљено је пре <ph name="NUM_MINS_MANY" /> минута}other{Направљено је пре <ph name="NUM_MINS_MANY" /> минута}}</translation>
@@ -108,6 +109,7 @@
 <translation id="4895402777090717310">{TABS_COUNT,plural, =1{Затвори картицу}one{Затвори картице}few{Затвори картице}other{Затвори картице}}</translation>
 <translation id="4908147833782857886">Групе (<ph name="USER_EMAIL" />) су сачуване (затвориће се картице и избрисати групе)</translation>
 <translation id="492284538114688557">Уочено је снижење</translation>
+<translation id="4937582754153367435">{NUMBER_OF_TABS,plural, =1{Проширите дељену групу картица са <ph name="TABS_COUNT_ONE" /> картицом, боје <ph name="COLOR_NAME" />, са ознаком <ph name="CARD_LABEL" />.}one{Проширите дељену групу картица са <ph name="TABS_COUNT_MANY" /> картицом, боје <ph name="COLOR_NAME" />, са ознаком <ph name="CARD_LABEL" />.}few{Проширите дељену групу картица са <ph name="TABS_COUNT_MANY" /> картице, боје <ph name="COLOR_NAME" />, са ознаком <ph name="CARD_LABEL" />.}other{Проширите дељену групу картица са <ph name="TABS_COUNT_MANY" /> картица, боје <ph name="COLOR_NAME" />, са ознаком <ph name="CARD_LABEL" />.}}</translation>
 <translation id="5007392906805964215">Прегледај</translation>
 <translation id="5073204694187207510">Сакријте приказ мреже на целом екрану</translation>
 <translation id="5076161749301278626">Желите да видите рецензије продавница?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_te.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_te.xtb
index a84317e..789eb84 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_te.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_te.xtb
@@ -14,6 +14,7 @@
 మీరు దీన్ని తొలగించినట్లయితే, అందరూ వెంటనే "<ph name="TITLE_OF_GROUP" />" ట్యాబ్ గ్రూప్‌నకు యాక్సెస్ కోల్పోతారు, ఇంకా ఇది అన్ని పరికరాల నుండి తొలగించబడుతుంది.</translation>
 <translation id="1329584516321524826">ఇప్పుడే అప్‌డేట్ చేయబడింది</translation>
 <translation id="1340839264183302272">గ్రూప్ నుండి నిష్క్రమించండి</translation>
+<translation id="1403729629346559879">{NUMBER_OF_TABS,plural, =1{<ph name="TABS_COUNT_ONE" /> ట్యాబ్, <ph name="COLOR_NAME" /> రంగు, <ph name="CARD_LABEL" /> లేబుల్ ఉన్న షేర్ చేసిన <ph name="TITLE_OF_GROUP" /> ట్యాబ్ గ్రూప్‌ను విస్తరించండి.}other{<ph name="TABS_COUNT_MANY" /> ట్యాబ్‌లు, <ph name="COLOR_NAME" /> రంగు, <ph name="CARD_LABEL" /> లేబుల్ ఉన్న షేర్ చేసిన <ph name="TITLE_OF_GROUP" /> ట్యాబ్ గ్రూప్‌ను విస్తరించండి.}}</translation>
 <translation id="1419023007528516122">ఇలా చేస్తే, మీ పరికరం నుండి గ్రూప్ శాశ్వతంగా తొలగించబడుతుంది</translation>
 <translation id="1486715732399361704">మీరు మీ అన్ని ట్యాబ్ గ్రూప్‌లను ఇక్కడ కనుగొనవచ్చు</translation>
 <translation id="149054111719651807">{NUM_MINS,plural, =1{<ph name="NUM_MINS_ONE" /> నిమిషం క్రితం క్రియేట్ చేయడం జరిగింది}other{<ph name="NUM_MINS_MANY" /> నిమిషాల క్రితం క్రియేట్ చేయడం జరిగింది}}</translation>
@@ -108,6 +109,7 @@
 <translation id="4895402777090717310">{TABS_COUNT,plural, =1{ట్యాబ్‌ను మూసివేయండి}other{ట్యాబ్‌లను మూసివేయండి}}</translation>
 <translation id="4908147833782857886"><ph name="USER_EMAIL" /> గ్రూప్‌లు సేవ్ చేయబడ్డాయి (ట్యాబ్‌లను మూసివేసి, గ్రూప్‌లను తొలగిస్తుంది)</translation>
 <translation id="492284538114688557">ధర తగ్గింపు గుర్తించబడింది</translation>
+<translation id="4937582754153367435">{NUMBER_OF_TABS,plural, =1{<ph name="TABS_COUNT_ONE" /> ట్యాబ్, <ph name="COLOR_NAME" /> రంగు, <ph name="CARD_LABEL" /> లేబుల్ ఉన్న షేర్ చేసిన ట్యాబ్ గ్రూప్‌ను విస్తరించండి.}other{<ph name="TABS_COUNT_MANY" /> ట్యాబ్‌లు, <ph name="COLOR_NAME" /> రంగు, <ph name="CARD_LABEL" /> లేబుల్ ఉన్న షేర్ చేసిన ట్యాబ్ గ్రూప్‌ను విస్తరించండి.}}</translation>
 <translation id="5007392906805964215">రివ్యూ చేయండి</translation>
 <translation id="5073204694187207510">ఫుల్-స్క్రీన్‌ గ్రిడ్‌‌ను దాచిపెట్టు</translation>
 <translation id="5076161749301278626">స్టోర్ రివ్యూలను చూడాలనుకుంటున్నారా?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uz.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uz.xtb
index a94aa09..206d372 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uz.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uz.xtb
@@ -14,6 +14,7 @@
 Agar tark etsangiz, “<ph name="TITLE_OF_GROUP" />” varaqlar guruhiga boshqa kira olmaysiz hamda u barcha qurilmalardan oʻchirib tashlanadi.</translation>
 <translation id="1329584516321524826">Hozir yangilandi</translation>
 <translation id="1340839264183302272">Guruhni tark etish</translation>
+<translation id="1403729629346559879">{NUMBER_OF_TABS,plural, =1{Umumiy varaqlar guruhini (<ph name="TITLE_OF_GROUP" />) yoyish, varaqlari: <ph name="TABS_COUNT_ONE" /> ta, rangi: <ph name="COLOR_NAME" />, nomi: <ph name="CARD_LABEL" />.}other{Umumiy varaqlar guruhini (<ph name="TITLE_OF_GROUP" />) yoyish, varaqlari: <ph name="TABS_COUNT_MANY" /> ta, rangi: <ph name="COLOR_NAME" />, nomi: <ph name="CARD_LABEL" />.}}</translation>
 <translation id="1419023007528516122">Bunda guruh qurilmadan butunlay oʻchirib tashlanadi.</translation>
 <translation id="1486715732399361704">Barcha varaqlar guruhi shu yerda chiqadi</translation>
 <translation id="149054111719651807">{NUM_MINS,plural, =1{<ph name="NUM_MINS_ONE" /> daqiqa oldin yaratilgan}other{<ph name="NUM_MINS_MANY" /> daqiqa oldin yaratilgan}}</translation>
@@ -108,6 +109,7 @@
 <translation id="4895402777090717310">{TABS_COUNT,plural, =1{Varaqni yopish}other{Varaqlarni yopish}}</translation>
 <translation id="4908147833782857886"><ph name="USER_EMAIL" /> guruhlari saqlanib qoladi (varaqlar yopiladi va guruhlar oʻchiriladi)</translation>
 <translation id="492284538114688557">Narx pasayishi aniqlandi</translation>
+<translation id="4937582754153367435">{NUMBER_OF_TABS,plural, =1{Umumiy varaqlar guruhini yoyish, varaqlari: <ph name="TABS_COUNT_ONE" /> ta, rangi: <ph name="COLOR_NAME" />, nomi: <ph name="CARD_LABEL" />.}other{Umumiy varaqlar guruhini yoyish, varaqlari: <ph name="TABS_COUNT_MANY" /> ta, rangi: <ph name="COLOR_NAME" />, nomi: <ph name="CARD_LABEL" />.}}</translation>
 <translation id="5007392906805964215">Tekshirish</translation>
 <translation id="5073204694187207510">Butun ekranga chiqarilgan jadval shaklini yopish</translation>
 <translation id="5076161749301278626">Doʻkon sharhlari ochilsinmi?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb
index b5fa6a8..4d610c6 100644
--- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb
+++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb
@@ -14,6 +14,7 @@
 如果删除,所有人将立即失去对标签页分组“<ph name="TITLE_OF_GROUP" />”的访问权限,并且该分组将从所有设备中删除。</translation>
 <translation id="1329584516321524826">上次更新时间:刚才</translation>
 <translation id="1340839264183302272">退出分组</translation>
+<translation id="1403729629346559879">{NUMBER_OF_TABS,plural, =1{展开包含 <ph name="TABS_COUNT_ONE" /> 个标签页的“<ph name="TITLE_OF_GROUP" />”共享标签页分组,颜色为<ph name="COLOR_NAME" />,标签为“<ph name="CARD_LABEL" />”。}other{展开包含 <ph name="TABS_COUNT_MANY" /> 个标签页的“<ph name="TITLE_OF_GROUP" />”共享标签页分组,颜色为<ph name="COLOR_NAME" />,标签为“<ph name="CARD_LABEL" />”。}}</translation>
 <translation id="1419023007528516122">此操作会将该分组从您的设备中永久删除</translation>
 <translation id="1486715732399361704">您可在此处找到您的所有标签页分组</translation>
 <translation id="149054111719651807">{NUM_MINS,plural, =1{创建时间:<ph name="NUM_MINS_ONE" /> 分钟前}other{创建时间:<ph name="NUM_MINS_MANY" /> 分钟前}}</translation>
@@ -108,6 +109,7 @@
 <translation id="4895402777090717310">{TABS_COUNT,plural, =1{关闭标签页}other{关闭标签页}}</translation>
 <translation id="4908147833782857886">已保存 <ph name="USER_EMAIL" /> 个分组(将关闭标签页并删除分组)</translation>
 <translation id="492284538114688557">发现了降价商品</translation>
+<translation id="4937582754153367435">{NUMBER_OF_TABS,plural, =1{展开包含 <ph name="TABS_COUNT_ONE" /> 个标签页的共享标签页分组,颜色为<ph name="COLOR_NAME" />,标签为“<ph name="CARD_LABEL" />”。}other{展开包含 <ph name="TABS_COUNT_MANY" /> 个标签页的共享标签页分组,颜色为<ph name="COLOR_NAME" />,标签为“<ph name="CARD_LABEL" />”。}}</translation>
 <translation id="5007392906805964215">查看</translation>
 <translation id="5073204694187207510">隐藏“全屏网格状视图”按钮</translation>
 <translation id="5076161749301278626">查看商店评价?</translation>
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/ClosableTabListEditorTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/ClosableTabListEditorTest.java
index c2f241d..22d9bf6f 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/ClosableTabListEditorTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/ClosableTabListEditorTest.java
@@ -32,6 +32,7 @@
 import org.chromium.chrome.browser.tab_ui.RecyclerViewPosition;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
+import org.chromium.chrome.browser.tasks.tab_management.TabListEditorCoordinator.CreationMode;
 import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeController;
 import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
@@ -106,7 +107,8 @@
                                     /* gridCardOnClickListenerProvider= */ null,
                                     mModalDialogManager,
                                     /* desktopWindowStateManager= */ null,
-                                    mEdgeToEdgeSupplier);
+                                    mEdgeToEdgeSupplier,
+                                    CreationMode.FULL_SCREEN);
 
                     mTabListEditorController = mTabListEditorCoordinator.getController();
                     mTabListEditorLayout =
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/SelectableTabListEditorTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/SelectableTabListEditorTest.java
index 3f9ec8a..b9a27c25 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/SelectableTabListEditorTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/SelectableTabListEditorTest.java
@@ -93,6 +93,7 @@
 import org.chromium.chrome.browser.tasks.tab_management.TabListEditorAction.ButtonType;
 import org.chromium.chrome.browser.tasks.tab_management.TabListEditorAction.IconPosition;
 import org.chromium.chrome.browser.tasks.tab_management.TabListEditorAction.ShowMode;
+import org.chromium.chrome.browser.tasks.tab_management.TabListEditorCoordinator.CreationMode;
 import org.chromium.chrome.browser.tasks.tab_management.TabProperties.TabActionState;
 import org.chromium.chrome.browser.ui.desktop_windowing.AppHeaderCoordinator;
 import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeController;
@@ -224,7 +225,8 @@
                                     /* gridCardOnClickListenerProvider= */ null,
                                     mModalDialogManager,
                                     mAppHeaderStateProvider,
-                                    mEdgeToEdgeSupplier);
+                                    mEdgeToEdgeSupplier,
+                                    CreationMode.FULL_SCREEN);
 
                     mTabListEditorController = mTabListEditorCoordinator.getController();
                     mTabListEditorLayout =
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupDialogPTTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupDialogPTTest.java
index 736a6a3..a09c854 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupDialogPTTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupDialogPTTest.java
@@ -20,12 +20,14 @@
 
 import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Features.DisableFeatures;
 import org.chromium.base.test.util.Features.EnableFeatures;
 import org.chromium.chrome.browser.collaboration.CollaborationServiceFactory;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.R;
 import org.chromium.chrome.test.transit.AutoResetCtaTransitTestRule;
 import org.chromium.chrome.test.transit.ChromeTransitTestRules;
 import org.chromium.chrome.test.transit.Journeys;
@@ -37,9 +39,12 @@
 import org.chromium.chrome.test.transit.ntp.IncognitoNewTabPageStation;
 import org.chromium.chrome.test.transit.ntp.RegularNewTabPageStation;
 import org.chromium.chrome.test.transit.page.WebPageStation;
+import org.chromium.chrome.test.util.ChromeRenderTestRule;
 import org.chromium.components.collaboration.CollaborationService;
 import org.chromium.components.collaboration.ServiceStatus;
 
+import java.io.IOException;
+
 /** Public transit tests for the Tab Group Dialog representing tab groups. */
 @RunWith(ChromeJUnit4ClassRunner.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
@@ -55,6 +60,13 @@
 
     @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
 
+    @Rule
+    public ChromeRenderTestRule mRenderTestRule =
+            ChromeRenderTestRule.Builder.withPublicCorpus()
+                    .setRevision(1)
+                    .setBugComponent(ChromeRenderTestRule.Component.UI_BROWSER_MOBILE_TAB_GROUPS)
+                    .build();
+
     @Mock private CollaborationService mCollaborationService;
     @Mock private ServiceStatus mServiceStatus;
 
@@ -68,7 +80,8 @@
 
     @Test
     @MediumTest
-    public void testNewTabCreation() {
+    @Feature({"RenderTest"})
+    public void testNewTabCreation() throws IOException {
         WebPageStation firstPage = mCtaTestRule.startOnBlankPage();
         WebPageStation pageStation =
                 Journeys.prepareTabsWithThumbnails(
@@ -78,6 +91,10 @@
         TabSwitcherGroupCardFacility groupCard = Journeys.mergeAllTabsToNewGroup(tabSwitcher);
 
         TabGroupDialogFacility<TabSwitcherStation> tabGroupDialogFacility = groupCard.clickCard();
+        mRenderTestRule.render(
+                mCtaTestRule.getActivity().findViewById(R.id.dialog_container_view),
+                "tab_grid_dialog-normal_mode");
+
         RegularNewTabPageStation secondPage = tabGroupDialogFacility.openNewRegularTab();
 
         // Assert we have gone back to PageStation for InitialStateRule to reset
@@ -86,7 +103,8 @@
 
     @Test
     @MediumTest
-    public void testIncognitoNewTabCreation() {
+    @Feature({"RenderTest"})
+    public void testIncognitoNewTabCreation() throws IOException {
         WebPageStation firstPage = mCtaTestRule.startOnBlankPage();
         WebPageStation pageStation =
                 Journeys.prepareTabsWithThumbnails(
@@ -96,6 +114,10 @@
         TabSwitcherGroupCardFacility groupCard = Journeys.mergeAllTabsToNewGroup(tabSwitcher);
 
         TabGroupDialogFacility<TabSwitcherStation> tabGroupDialogFacility = groupCard.clickCard();
+        mRenderTestRule.render(
+                mCtaTestRule.getActivity().findViewById(R.id.dialog_container_view),
+                "tab_grid_dialog-incognito_mode");
+
         IncognitoNewTabPageStation secondPage = tabGroupDialogFacility.openNewIncognitoTab();
 
         // Assert we have gone back to PageStation for InitialStateRule to reset
diff --git a/chrome/android/java/res/values-w600dp/dimens.xml b/chrome/android/java/res/values-w600dp/dimens.xml
new file mode 100644
index 0000000..38f4a029
--- /dev/null
+++ b/chrome/android/java/res/values-w600dp/dimens.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright 2025 The Chromium Authors
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<resources>
+    <!-- Bookmark bar -->
+    <dimen name="bookmark_bar_item_max_width">187dp</dimen>
+</resources>
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
index 3976100..b67380cbd 100644
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
@@ -201,7 +201,7 @@
     <dimen name="bookmark_bar_button_icon_size">24dp</dimen>
     <dimen name="bookmark_bar_divider_height">20dp</dimen>
     <dimen name="bookmark_bar_divider_width">2dp</dimen>
-    <dimen name="bookmark_bar_item_max_width">187dp</dimen>
+    <dimen name="bookmark_bar_item_max_width">124dp</dimen>
     <dimen name="bookmark_bar_item_spacing">@dimen/bookmark_bar_spacing</dimen>
     <dimen name="bookmark_bar_overflow_button_size">24dp</dimen>
     <dimen name="bookmark_bar_padding">8dp</dimen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestrator.java b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestrator.java
index f8c1271..f7f2d124 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestrator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestrator.java
@@ -32,6 +32,7 @@
 import org.chromium.chrome.browser.tab.TabArchiver;
 import org.chromium.chrome.browser.tab.TabArchiverImpl;
 import org.chromium.chrome.browser.tab.tab_restore.HistoricalTabModelObserver;
+import org.chromium.chrome.browser.tab_group_sync.TabGroupSyncServiceFactory;
 import org.chromium.chrome.browser.tab_ui.TabContentManager;
 import org.chromium.chrome.browser.tabmodel.ArchivedTabCreator;
 import org.chromium.chrome.browser.tabmodel.ArchivedTabModelSelectorHolder;
@@ -47,6 +48,7 @@
 import org.chromium.chrome.browser.tabmodel.TabPersistentStore;
 import org.chromium.chrome.browser.tabmodel.TabWindowManager;
 import org.chromium.chrome.browser.tabmodel.TabbedModeTabPersistencePolicy;
+import org.chromium.components.tab_group_sync.TabGroupSyncService;
 import org.chromium.ui.base.WindowAndroid;
 
 import java.lang.ref.WeakReference;
@@ -489,6 +491,8 @@
 
         mTabArchiveSettings = new TabArchiveSettings(ChromeSharedPreferences.getInstance());
         mTabArchiveSettings.addObserver(mTabArchiveSettingsObserver);
+        TabGroupSyncService tabGroupSyncService =
+                TabGroupSyncServiceFactory.getForProfile(mProfile);
         mTabArchiver =
                 new TabArchiverImpl(
                         mTabModelSelector
@@ -496,7 +500,8 @@
                                 .getTabGroupModelFilter(/* isIncognito= */ false),
                         mArchivedTabCreator,
                         mTabArchiveSettings,
-                        System::currentTimeMillis);
+                        System::currentTimeMillis,
+                        tabGroupSyncService);
         mTabArchiver.addObserver(mTabArchiverObserver);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
index 970c1f9..940eb107 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
@@ -4,6 +4,9 @@
 
 package org.chromium.chrome.browser.dom_distiller;
 
+import static org.chromium.components.embedder_support.util.UrlConstants.CHROME_NATIVE_SCHEME;
+import static org.chromium.components.embedder_support.util.UrlConstants.CHROME_SCHEME;
+
 import android.app.Activity;
 import android.content.Intent;
 import android.content.res.Resources;
@@ -33,6 +36,7 @@
 import org.chromium.chrome.browser.customtabs.IncognitoCustomTabIntentDataProvider;
 import org.chromium.chrome.browser.document.ChromeLauncherActivity;
 import org.chromium.chrome.browser.dom_distiller.TabDistillabilityProvider.DistillabilityObserver;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.fullscreen.BrowserControlsManager;
 import org.chromium.chrome.browser.fullscreen.BrowserControlsManagerSupplier;
@@ -255,6 +259,18 @@
     }
 
     @Override
+    public void onPageLoadFinished(Tab tab, GURL url) {
+        if (!ChromeFeatureList.isEnabled(ChromeFeatureList.READER_MODE_AUTO_DISTILL)
+                || url.getScheme().equals(DOM_DISTILLER_SCHEME)
+                || url.getScheme().equals(CHROME_SCHEME)
+                || url.getScheme().equals(CHROME_NATIVE_SCHEME)) {
+            return;
+        }
+
+        distillInCustomTab();
+    }
+
+    @Override
     public void onShown(Tab shownTab, @TabSelectionType int type) {
         // If the reader mode prompt was dismissed, stop here.
         if (mIsDismissed) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabArchiverImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabArchiverImpl.java
index 6ee2862..80764b8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabArchiverImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabArchiverImpl.java
@@ -18,6 +18,7 @@
 import org.chromium.base.supplier.ObservableSupplierImpl;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.tab.TabArchiver.Observer;
 import org.chromium.chrome.browser.tab.state.ArchivePersistedTabData;
@@ -27,12 +28,17 @@
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.tabmodel.TabModelUtils;
+import org.chromium.components.tab_group_sync.LocalTabGroupId;
+import org.chromium.components.tab_group_sync.SavedTabGroup;
+import org.chromium.components.tab_group_sync.TabGroupSyncService;
 import org.chromium.url.GURL;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
 /** Responsible for moving tabs to/from the archived {@link TabModel}. */
@@ -49,6 +55,7 @@
     private final TabGroupModelFilter mArchivedTabGroupModelFilter;
     private final TabCreator mArchivedTabCreator;
     private final TabArchiveSettings mTabArchiveSettings;
+    private final TabGroupSyncService mTabGroupSyncService;
 
     private Clock mClock;
 
@@ -56,17 +63,20 @@
      * @param archivedTabGroupModelFilter The archived {@link TabGroupModelFilter}.
      * @param archivedTabCreator The {@link TabCreator} for the archived TabModel.
      * @param tabArchiveSettings The settings for tab archiving/deletion.
-     * @param clock A clock object to get the current time..
+     * @param clock A clock object to get the current time.
+     * @param tabGroupSyncService The {@link TabGroupSyncService}.
      */
     public TabArchiverImpl(
             TabGroupModelFilter archivedTabGroupModelFilter,
             TabCreator archivedTabCreator,
             TabArchiveSettings tabArchiveSettings,
-            Clock clock) {
+            Clock clock,
+            TabGroupSyncService tabGroupSyncService) {
         mArchivedTabGroupModelFilter = archivedTabGroupModelFilter;
         mArchivedTabCreator = archivedTabCreator;
         mTabArchiveSettings = tabArchiveSettings;
         mClock = clock;
+        mTabGroupSyncService = tabGroupSyncService;
     }
 
     @Override
@@ -208,12 +218,32 @@
         ThreadUtils.assertOnUiThread();
 
         List<Tab> archivedTabs = new ArrayList<>();
+        Set<Token> archivedTabGroupIds = new HashSet<>();
         // Add tabs to the archived tab model first to prevent tab loss if the operation is aborted.
         for (Tab tab : tabs) {
             TabState tabState = prepareTabState(tab);
             Tab archivedTab =
                     mArchivedTabCreator.createFrozenTab(tabState, tab.getId(), INVALID_TAB_INDEX);
             archivedTabs.add(archivedTab);
+
+            @Nullable Token tabGroupId = tab.getTabGroupId();
+            if (ChromeFeatureList.sAndroidTabDeclutterArchiveTabGroups.isEnabled()
+                    && tabGroupId != null
+                    && !archivedTabGroupIds.contains(tabGroupId)) {
+                archivedTabGroupIds.add(tabGroupId);
+            }
+        }
+
+        if (ChromeFeatureList.sAndroidTabDeclutterArchiveTabGroups.isEnabled()
+                && mTabGroupSyncService != null) {
+            for (Token tabGroupId : archivedTabGroupIds) {
+                LocalTabGroupId localTabGroupId = new LocalTabGroupId(tabGroupId);
+                SavedTabGroup savedTabGroup = mTabGroupSyncService.getGroup(localTabGroupId);
+                if (savedTabGroup != null) {
+                    mTabGroupSyncService.updateArchivalStatus(
+                            savedTabGroup.syncId, /* archivalStatus= */ true);
+                }
+            }
         }
 
         int tabCount = tabs.size();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
index 364f123..9036e24 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -1673,6 +1673,7 @@
             mBookmarkBarCoordinator =
                     new BookmarkBarCoordinator(
                             mActivity,
+                            mActivityLifecycleDispatcher,
                             mBrowserControlsManager,
                             /* heightChangeCallback= */ (height) -> updateTopControlsHeight(),
                             mProfileSupplier,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarRenderTest.java
index d1f83d9..d505919 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarRenderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarRenderTest.java
@@ -37,6 +37,7 @@
 import org.chromium.chrome.browser.bookmarks.BookmarkManagerOpener;
 import org.chromium.chrome.browser.bookmarks.BookmarkOpener;
 import org.chromium.chrome.browser.fullscreen.BrowserControlsManager;
+import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate;
 import org.chromium.chrome.test.util.ChromeRenderTestRule;
 import org.chromium.components.browser_ui.widget.CoordinatorLayoutForPointer;
@@ -70,6 +71,7 @@
                     .setBugComponent(ChromeRenderTestRule.Component.UI_BROWSER_BOOKMARKS)
                     .build();
 
+    @Mock private ActivityLifecycleDispatcher mActivityLifecycleDispatcher;
     @Mock private BrowserControlsManager mBrowserControlsManager;
     @Mock private BookmarkOpener mBookmarkOpener;
     @Mock private BookmarkManagerOpener mBookmarkManagerOpener;
@@ -98,6 +100,7 @@
                     mCoordinator =
                             new BookmarkBarCoordinator(
                                     activity,
+                                    mActivityLifecycleDispatcher,
                                     mBrowserControlsManager,
                                     /* heightChangeCallback= */ (h) -> {},
                                     /* profileSupplier= */ new ObservableSupplierImpl<>(),
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/javascript/CloseWatcherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/javascript/CloseWatcherTest.java
index 094d1970..df4d279 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/javascript/CloseWatcherTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/javascript/CloseWatcherTest.java
@@ -6,20 +6,18 @@
 
 import androidx.test.filters.MediumTest;
 
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.util.Batch;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.UrlUtils;
-import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
-import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
-import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
-import org.chromium.chrome.test.util.browser.TabTitleObserver;
+import org.chromium.chrome.test.transit.ChromeTransitTestRules;
+import org.chromium.chrome.test.transit.ReusedCtaTransitTestRule;
+import org.chromium.chrome.test.transit.page.WebPageStation;
 
 /** Unit tests for CloseWatcher's ability to receive signals from the system back button. */
 @RunWith(ChromeJUnit4ClassRunner.class)
@@ -28,44 +26,56 @@
     "enable-experimental-web-platform-features",
     "enable-features=CloseWatcher"
 })
+@Batch(Batch.PER_CLASS)
 public class CloseWatcherTest {
-    @Rule
-    public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
 
-    private static final String TEST_URL =
+    @Rule
+    public ReusedCtaTransitTestRule<WebPageStation> mTestRule =
+            ChromeTransitTestRules.blankPageStartReusedActivityRule();
+
+    // Define constants for URLs and expected title
+    private static final String CLOSE_WATCHER_TEST_URL =
             UrlUtils.encodeHtmlDataUri(
                     "<body><script>let watcher = new CloseWatcher(); watcher.onclose = () =>"
                             + " window.document.title = 'SUCCESS';</script></body>");
 
-    private Tab mTab;
+    private static final String DIALOG_ELEMENT_TEST_URL =
+            UrlUtils.encodeHtmlDataUri(
+                    "<dialog id=mydialog>hello</dialog>"
+                            + "<script>mydialog.showModal();mydialog.onclose = () =>"
+                            + " window.document.title = 'SUCCESS';</script>");
 
-    @Before
-    public void setUp() {
-        mActivityTestRule.startMainActivityOnBlankPage();
-        mTab =
-                ThreadUtils.runOnUiThreadBlocking(
-                        () -> mActivityTestRule.getActivity().getActivityTab());
+    private static final String EXPECTED_TITLE_SUCCESS = "SUCCESS";
+
+    @Test
+    @MediumTest
+    public void testBackButtonTriggersCloseWatcher() {
+        WebPageStation initialStation = mTestRule.start();
+        WebPageStation loadedPage =
+                initialStation.loadWebPageProgrammatically(CLOSE_WATCHER_TEST_URL);
+        WebPageStation finalStationExpected =
+                WebPageStation.newBuilder()
+                        .initFrom(loadedPage)
+                        .withExpectedTitle(EXPECTED_TITLE_SUCCESS)
+                        .build();
+        loadedPage.pressBack(finalStationExpected);
+
+        // No explicit assertion needed; pressBack ensures the transition completed successfully.
     }
 
     @Test
     @MediumTest
-    public void testBackButtonTriggersCloseWatcher() throws Throwable {
-        ChromeTabbedActivity activity = mActivityTestRule.getActivity();
-        mActivityTestRule.loadUrl(TEST_URL);
-        ThreadUtils.runOnUiThreadBlocking(() -> activity.onBackPressed());
-        new TabTitleObserver(mTab, "SUCCESS").waitForTitleUpdate(3);
-    }
+    public void testBackButtonClosesDialogElement() {
+        WebPageStation initialStation = mTestRule.start();
+        WebPageStation loadedPage =
+                initialStation.loadWebPageProgrammatically(DIALOG_ELEMENT_TEST_URL);
+        WebPageStation finalStationExpected =
+                WebPageStation.newBuilder()
+                        .withExpectedTitle(EXPECTED_TITLE_SUCCESS)
+                        .initFrom(loadedPage)
+                        .build();
+        loadedPage.pressBack(finalStationExpected);
 
-    @Test
-    @MediumTest
-    public void testBackButtonClosesDialogElement() throws Throwable {
-        ChromeTabbedActivity activity = mActivityTestRule.getActivity();
-        mActivityTestRule.loadUrl(
-                UrlUtils.encodeHtmlDataUri(
-                        "<dialog id=mydialog>hello</dialog>"
-                                + "<script>mydialog.showModal();mydialog.onclose = () =>"
-                                + " window.document.title = 'SUCCESS';</script>"));
-        ThreadUtils.runOnUiThreadBlocking(() -> activity.onBackPressed());
-        new TabTitleObserver(mTab, "SUCCESS").waitForTitleUpdate(3);
+        // No explicit assertion needed.
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabArchiverTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabArchiverTest.java
index 4e894d1..c11d5d8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabArchiverTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabArchiverTest.java
@@ -10,11 +10,14 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import static org.chromium.base.ThreadUtils.runOnUiThreadBlocking;
 import static org.chromium.chrome.browser.tab.Tab.INVALID_TAB_ID;
@@ -60,6 +63,9 @@
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
+import org.chromium.components.tab_group_sync.LocalTabGroupId;
+import org.chromium.components.tab_group_sync.SavedTabGroup;
+import org.chromium.components.tab_group_sync.TabGroupSyncService;
 
 import java.util.Arrays;
 import java.util.concurrent.TimeUnit;
@@ -93,6 +99,7 @@
     private @Mock Tab mTab;
     private @Mock TabGroupModelFilterProvider mTabGroupModelFilterProvider;
     private @Mock TabGroupModelFilter mTabGroupModelFilter;
+    private @Mock TabGroupSyncService mTabGroupSyncService;
 
     private ArchivedTabModelOrchestrator mArchivedTabModelOrchestrator;
     private TabArchiverImpl mTabArchiver;
@@ -153,7 +160,8 @@
                                         archivedTabGroupModelFilter,
                                         mArchivedTabCreator,
                                         mTabArchiveSettings,
-                                        mClock));
+                                        mClock,
+                                        mTabGroupSyncService));
         mUserActionTester = new UserActionTester();
     }
 
@@ -292,6 +300,60 @@
 
     @Test
     @MediumTest
+    @EnableFeatures(ChromeFeatureList.ANDROID_TAB_DECLUTTER_ARCHIVE_TAB_GROUPS)
+    public void testArchiveTabGroups() {
+        String syncId = "sync_id";
+        SavedTabGroup savedTabGroup = new SavedTabGroup();
+        savedTabGroup.syncId = syncId;
+        when(mTabGroupSyncService.getGroup(any(LocalTabGroupId.class))).thenReturn(savedTabGroup);
+
+        Tab tab =
+                sActivityTestRule.loadUrlInNewTab(
+                        sActivityTestRule.getTestServer().getURL(TEST_PATH),
+                        /* incognito= */ false);
+
+        // Simulate the first tab being added to a group.
+        runOnUiThreadBlocking(
+                () -> {
+                    TabGroupModelFilter filter =
+                            mRegularTabModelSelector
+                                    .getTabGroupModelFilterProvider()
+                                    .getTabGroupModelFilter(false);
+                    filter.createSingleTabGroup(tab);
+                });
+
+        assertEquals(2, mRegularTabModel.getCount());
+        assertEquals(0, mArchivedTabModel.getCount());
+
+        HistogramWatcher watcher =
+                HistogramWatcher.newBuilder()
+                        .expectIntRecords("Tabs.TabArchived.TabCount", 1)
+                        .build();
+        runOnUiThreadBlocking(
+                () -> mTabArchiver.archiveAndRemoveTabs(mRegularTabModel, Arrays.asList(tab)));
+        watcher.assertExpected();
+        verify(mTabGroupSyncService, times(1)).updateArchivalStatus(eq(syncId), eq(true));
+
+        assertEquals(1, mRegularTabModel.getCount());
+        assertEquals(1, mArchivedTabModel.getCount());
+        runOnUiThreadBlocking(
+                () ->
+                        assertEquals(
+                                Tab.INVALID_TAB_ID, mArchivedTabModel.getTabAt(0).getParentId()));
+        runOnUiThreadBlocking(
+                () ->
+                        assertEquals(
+                                mArchivedTabModel.getTabAt(0).getId(),
+                                mArchivedTabModel.getTabAt(0).getRootId()));
+
+        watcher =
+                HistogramWatcher.newBuilder()
+                        .expectIntRecords("Tabs.ArchivedTabRestored.TabCount", 1)
+                        .build();
+    }
+
+    @Test
+    @MediumTest
     @DisableFeatures(ChromeFeatureList.ANDROID_TAB_DECLUTTER_ARCHIVE_TAB_GROUPS)
     public void testGroupedTabsAreNotArchived() {
         sActivityTestRule.loadUrlInNewTab(
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/AutofillImageFetcherTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/AutofillImageFetcherTest.java
index 7a06d13..f9b66aab 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/AutofillImageFetcherTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/AutofillImageFetcherTest.java
@@ -54,7 +54,7 @@
 
     @Test
     @SmallTest
-    public void testPrefetchImages_validUrl_successfulImageFetch() {
+    public void testPrefetchCardArtImages_validUrl_successfulImageFetch() {
         GURL validUrl1 = new GURL("https://www.google.com/valid-image-url-1");
         GURL validUrl2 = new GURL("https://www.google.com/valid-image-url-2");
         CardIconSpecs cardIconSpecsSmall =
@@ -80,7 +80,7 @@
                 AutofillUiUtils.resizeAndAddRoundedCornersAndGreyBorder(
                         TEST_CARD_ART_IMAGE, cardIconSpecsLarge, true);
 
-        mImageFetcher.prefetchImages(
+        mImageFetcher.prefetchCardArtImages(
                 new GURL[] {validUrl1, validUrl2}, new int[] {ImageSize.SMALL, ImageSize.LARGE});
         Map<String, Bitmap> cachedImages = mImageFetcher.getCachedImagesForTesting();
 
@@ -95,22 +95,22 @@
 
     @Test
     @SmallTest
-    public void testPrefetchImages_validUrl_unsuccessfulImageFetch() {
+    public void testPrefetchCardArtImages_validUrl_unsuccessfulImageFetch() {
         mImageFetcher = new AutofillImageFetcher(new TestImageFetcher(null));
         GURL validUrl = new GURL("https://www.google.com/valid-image-url");
 
-        mImageFetcher.prefetchImages(new GURL[] {validUrl}, new int[] {ImageSize.SMALL});
+        mImageFetcher.prefetchCardArtImages(new GURL[] {validUrl}, new int[] {ImageSize.SMALL});
 
         assertTrue(mImageFetcher.getCachedImagesForTesting().isEmpty());
     }
 
     @Test
     @SmallTest
-    public void testPrefetchImages_invalidOrEmptyUrl() {
+    public void testPrefetchCardArtImages_invalidOrEmptyUrl() {
         GURL invalidUrl = new GURL("invalid-image-url");
         GURL emptyUrl = new GURL("");
 
-        mImageFetcher.prefetchImages(
+        mImageFetcher.prefetchCardArtImages(
                 new GURL[] {invalidUrl, emptyUrl}, new int[] {ImageSize.SMALL});
 
         assertTrue(mImageFetcher.getCachedImagesForTesting().isEmpty());
@@ -118,10 +118,10 @@
 
     @Test
     @SmallTest
-    public void testPrefetchImages_capitalOneStaticImageUrl_notFetched() {
+    public void testPrefetchCardArtImages_capitalOneStaticImageUrl_notFetched() {
         GURL capitalOneStaticImageUrl = new GURL(AutofillUiUtils.CAPITAL_ONE_ICON_URL);
 
-        mImageFetcher.prefetchImages(
+        mImageFetcher.prefetchCardArtImages(
                 new GURL[] {capitalOneStaticImageUrl}, new int[] {ImageSize.SMALL});
 
         assertTrue(mImageFetcher.getCachedImagesForTesting().isEmpty());
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarCoordinatorTest.java
index 9df1c27..893cfe7f 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarCoordinatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarCoordinatorTest.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.bookmarks.bar;
 
+import static android.util.TypedValue.COMPLEX_UNIT_DIP;
+import static android.util.TypedValue.applyDimension;
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
 import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
 
@@ -15,8 +17,10 @@
 import static org.mockito.Mockito.when;
 
 import android.app.Activity;
+import android.content.res.Resources;
 import android.graphics.Rect;
 import android.view.View;
+import android.view.View.MeasureSpec;
 import android.view.ViewGroup.LayoutParams;
 import android.view.ViewGroup.MarginLayoutParams;
 import android.view.ViewStub;
@@ -38,6 +42,8 @@
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 import org.robolectric.Robolectric;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
 
 import org.chromium.base.Callback;
 import org.chromium.base.supplier.ObservableSupplier;
@@ -52,6 +58,8 @@
 import org.chromium.chrome.browser.bookmarks.FakeBookmarkModel;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
 import org.chromium.chrome.browser.fullscreen.BrowserControlsManager;
+import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
+import org.chromium.chrome.browser.lifecycle.ConfigurationChangedObserver;
 import org.chromium.chrome.browser.page_image_service.ImageServiceBridgeJni;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.ui.favicon.FaviconHelperJni;
@@ -75,6 +83,7 @@
 
     @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
 
+    @Mock private ActivityLifecycleDispatcher mActivityLifecycleDispatcher;
     @Mock private BrowserControlsManager mBrowserControlsManager;
     @Mock private FaviconHelperJni mFaviconHelperJni;
     @Mock private Callback<Integer> mHeightChangeCallback;
@@ -121,6 +130,12 @@
         assertEquals(item.getTitle(), renderedItem.getTitleForTesting());
     }
 
+    private void assertItemWidthAtIndex(int index, int width) {
+        final var renderedItem = (BookmarkBarButton) mItemsContainer.getChildAt(index);
+        assertNotNull(renderedItem);
+        assertEquals(width, renderedItem.getWidth());
+    }
+
     private void assertItemsRenderedCount(int count) {
         // NOTE: Use `Criteria` rather than `Assert` to allow polling via `CriteriaHelper`.
         Criteria.checkThat(mItemsContainer.getChildCount(), equalTo(count));
@@ -139,6 +154,7 @@
         mCoordinator =
                 new BookmarkBarCoordinator(
                         activity,
+                        mActivityLifecycleDispatcher,
                         mBrowserControlsManager,
                         mHeightChangeCallback,
                         mProfileSupplier,
@@ -352,6 +368,55 @@
 
     @Test
     @SmallTest
+    @Config(qualifiers = "w600dp")
+    public void testOnConfigurationChanged() {
+        onActivity(
+                activity -> {
+                    // Verify observer registration.
+                    var observer = ArgumentCaptor.forClass(ConfigurationChangedObserver.class);
+                    verify(mActivityLifecycleDispatcher).register(observer.capture());
+
+                    // Set up item with a long title.
+                    setItemsWithinDesktopFolder(List.of("Title".repeat(100)));
+                    Robolectric.flushForegroundThreadScheduler();
+
+                    // Verify item max width constraint at "w600dp".
+                    var metrics = activity.getResources().getDisplayMetrics();
+                    assertItemsRenderedCount(1);
+                    assertItemWidthAtIndex(
+                            /* index= */ 0,
+                            /* width= */ Math.round(
+                                    applyDimension(COMPLEX_UNIT_DIP, 187, metrics)));
+
+                    // Change configuration to below "w600dp".
+                    RuntimeEnvironment.setQualifiers("w599dp");
+                    var newConfig = Resources.getSystem().getConfiguration();
+                    activity.onConfigurationChanged(newConfig);
+                    observer.getValue().onConfigurationChanged(newConfig);
+
+                    // NOTE: Robolectric does not automatically re-measure/-layout the view.
+                    mItemsContainer.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+                    mItemsContainer.layout(
+                            mItemsContainer.getLeft(),
+                            mItemsContainer.getTop(),
+                            mItemsContainer.getRight(),
+                            mItemsContainer.getBottom());
+
+                    // Verify item max width constraint below "w600dp".
+                    assertItemsRenderedCount(1);
+                    assertItemWidthAtIndex(
+                            /* index= */ 0,
+                            /* width= */ Math.round(
+                                    applyDimension(COMPLEX_UNIT_DIP, 124, metrics)));
+
+                    // Verify observer unregistration.
+                    mCoordinator.destroy();
+                    verify(mActivityLifecycleDispatcher).unregister(observer.getValue());
+                });
+    }
+
+    @Test
+    @SmallTest
     public void testOnItemsOverflowChanged() {
         onActivity(
                 activity -> {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsLayoutManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsLayoutManagerTest.java
index 5846199..855c303 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsLayoutManagerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsLayoutManagerTest.java
@@ -14,6 +14,7 @@
 import static org.mockito.Mockito.verify;
 
 import android.view.View;
+import android.view.View.MeasureSpec;
 import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
@@ -81,6 +82,7 @@
         mItemSpacing = res.getDimensionPixelSize(R.dimen.bookmark_bar_item_spacing);
 
         mLayoutManager = new BookmarkBarItemsLayoutManager(context);
+        mLayoutManager.setItemMaxWidth(mItemMaxWidth);
 
         mView = new RecyclerView(context);
         mView.setAdapter(mAdapter);
@@ -243,6 +245,20 @@
             final int itemWidth = Math.min(itemWidths.get(i), mItemMaxWidth);
             assertEquals(itemWidth, itemView.getWidth());
         }
+
+        // Update constraints.
+        mItemMaxWidth -= 1;
+        mLayoutManager.setItemMaxWidth(mItemMaxWidth);
+
+        // Perform measure/layout of view and validate widths do not exceed constraints.
+        mView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+        mView.layout(0, 0, calculateLayoutWidth(itemWidths), itemHeight);
+        assertEquals(itemWidths.size(), mView.getChildCount());
+        for (int i = 0; i < itemWidths.size(); i++) {
+            final var itemView = mView.getChildAt(i);
+            final int itemWidth = Math.min(itemWidths.get(i), mItemMaxWidth);
+            assertEquals(itemWidth, itemView.getWidth());
+        }
     }
 
     @Test
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabArchiverUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabArchiverUnitTest.java
index feac8548..652ea94 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabArchiverUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabArchiverUnitTest.java
@@ -34,6 +34,7 @@
 import org.chromium.chrome.browser.tabmodel.TabList;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.test.util.browser.tabmodel.MockTabModelSelector;
+import org.chromium.components.tab_group_sync.TabGroupSyncService;
 
 /** Tests for {@link TabArchiveSettings}. */
 @RunWith(BaseRobolectricTestRunner.class)
@@ -50,6 +51,7 @@
     private @Mock Profile mProfile;
     private @Mock Profile mIncognitoProfile;
     private @Mock WebContentsState mWebContentsState;
+    private @Mock TabGroupSyncService mTabGroupSyncService;
 
     private MockTab mArchivedTab;
     private MockTabModelSelector mTabModelSelector;
@@ -78,7 +80,8 @@
                         mArchivedTabGroupModelFilter,
                         mArchivedTabCreator,
                         mTabArchiveSettings,
-                        mClock);
+                        mClock,
+                        mTabGroupSyncService);
     }
 
     private void setupTabModels() {
diff --git a/chrome/app/chrome_command_ids.h b/chrome/app/chrome_command_ids.h
index 9edd68c..ba41561 100644
--- a/chrome/app/chrome_command_ids.h
+++ b/chrome/app/chrome_command_ids.h
@@ -282,7 +282,7 @@
 #define IDC_CREATE_NEW_COMPARISON_TABLE_WITH_TAB 40292
 #define IDC_SHOW_HISTORY_SIDE_PANEL     40293
 #define IDC_OPEN_GLIC                   40294
-#define IDC_EXPLORE_EXTENSIONS  40295
+#define IDC_FIND_EXTENSIONS  40295
 
 // Spell-check
 // Insert any additional suggestions before _LAST; these have to be consecutive.
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 4d2b0cf..3f6b3d6 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -1736,8 +1736,8 @@
         <message name="IDS_SHOW_DOWNLOADS" desc="The show downloads menu in the app menu">
           &amp;Downloads
         </message>
-        <message name="IDS_EXPLORE_EXTENSIONS" desc="The explore extensions menu item in the app menu">
-          Explore &amp;Extensions
+        <message name="IDS_FIND_EXTENSIONS" desc="The find extensions menu item in the app menu">
+          Find &amp;Extensions
         </message>
         <message name="IDS_SHOW_EXTENSIONS" desc="The show extensions menu in the app menu">
           &amp;Extensions
@@ -1795,8 +1795,8 @@
         <message name="IDS_SHOW_DOWNLOADS" desc="In Title Case: The show downloads menu in the app menu">
           &amp;Downloads
         </message>
-        <message name="IDS_EXPLORE_EXTENSIONS" desc="In Title Case: The explore extensions menu item in the app menu">
-          Explore &amp;Extensions
+        <message name="IDS_FIND_EXTENSIONS" desc="In Title Case: The find extensions menu item in the app menu">
+          Find &amp;Extensions
         </message>
         <message name="IDS_SHOW_EXTENSIONS" desc="In Title Case: The show extensions menu in the app menu">
           &amp;Extensions
diff --git a/chrome/app/generated_resources_grd/IDS_EXPLORE_EXTENSIONS.png.sha1 b/chrome/app/generated_resources_grd/IDS_FIND_EXTENSIONS.png.sha1
similarity index 100%
rename from chrome/app/generated_resources_grd/IDS_EXPLORE_EXTENSIONS.png.sha1
rename to chrome/app/generated_resources_grd/IDS_FIND_EXTENSIONS.png.sha1
diff --git a/chrome/app/resources/chromium_strings_af.xtb b/chrome/app/resources/chromium_strings_af.xtb
index 063a993..b8d1199 100644
--- a/chrome/app/resources/chromium_strings_af.xtb
+++ b/chrome/app/resources/chromium_strings_af.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">Inkomende reël vir Chromium om mDNS-verkeer toe te laat.</translation>
 <translation id="4893347770495441059">Begin weer om &amp;Chromium op te dateer</translation>
 <translation id="4918844574251943176">Prent is gekopieer</translation>
-<translation id="4942295735032723435">Jy het macOS 11 of nuwer nodig om in die toekoms Chromium-opdaterings te kry. Hierdie rekenaar gebruik macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium is in agtergrondmodus.</translation>
 <translation id="494490797786467921">Klik om die Chromium-aanmeldingdialoog toe te maak</translation>
 <translation id="4950660488495335294">Met Chromium-profiele kan jy al jou Chromium-goed skei. Skep profiele vir vriende en familielede, of verdeel tussen werk en pret.</translation>
diff --git a/chrome/app/resources/chromium_strings_am.xtb b/chrome/app/resources/chromium_strings_am.xtb
index 70d90cf..0544f4f 100644
--- a/chrome/app/resources/chromium_strings_am.xtb
+++ b/chrome/app/resources/chromium_strings_am.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">Chromium ለmDNS ትራፊክ ለመፍቀድ የውስጥ ደንብ።</translation>
 <translation id="4893347770495441059">&amp;Chromiumን ለማዘመን ዳግም ያስነሱት</translation>
 <translation id="4918844574251943176">ምስል ተቀድቷል</translation>
-<translation id="4942295735032723435">የወደፊት የChromium ዝማኔዎችን ለማግኘት macOS 11 ወይም ከዚያ በላይ ያስፈልግዎታል። ይህ ኮምፒውተር macOS 10.15 እየተጠቀመ ነው።</translation>
 <translation id="4943838377383847465">Chromium በጀርባ ሁነታ ላይ ነው።</translation>
 <translation id="494490797786467921">የChromium የመለያ መግቢያ መገናኛን ለመዝጋት ጠቅ ያድርጉ</translation>
 <translation id="4950660488495335294">በChromium መገለጫዎች ሁሉንም የChromium ነገሮችዎን መለየት ይችላሉ። ለጓደኞች እና ለቤተሰብ መገለጫዎችን ይፍጠሩ፣ ወይም በሥራ እና በመዝናኛ መካከል ይከፋፈሉ።</translation>
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb
index f49cab5..224b20d 100644
--- a/chrome/app/resources/chromium_strings_ar.xtb
+++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">‏قاعدة الوارد إلى Chromium للسماح بحركة مرور mDNS.</translation>
 <translation id="4893347770495441059">‏إعادة تشغيل متصفِّح Chromium لتحديثه</translation>
 <translation id="4918844574251943176">تم نسخ الصورة.</translation>
-<translation id="4942295735032723435">‏للحصول على تحديثات Chromium في المستقبل، يجب استخدام جهاز يعمل بنظام التشغيل macOS 11 أو إصدار أحدث. ويعمل هذا الكمبيوتر بنظام التشغيل macOS 10.15.</translation>
 <translation id="4943838377383847465">‏Chromium في وضع الخلفية.</translation>
 <translation id="494490797786467921">‏انقر لإغلاق مربّع حوار تسجيل الدخول إلى Chromium</translation>
 <translation id="4950660488495335294">‏باستخدام ميزة الملفات الشخصية على Chromium، يمكنك الفصل بين جميع بيانات Chromium. وبإمكانك إنشاء ملفات شخصية للأصدقاء والعائلة أو الفصل بين البيانات المرتبطة بالعمل وتلك المرتبطة بالأنشطة الترفيهية.</translation>
diff --git a/chrome/app/resources/chromium_strings_as.xtb b/chrome/app/resources/chromium_strings_as.xtb
index 7379151..98a4848a 100644
--- a/chrome/app/resources/chromium_strings_as.xtb
+++ b/chrome/app/resources/chromium_strings_as.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">mDNS ট্ৰেফিকক অনুমতি দিবলৈ Chromium অন্তৰ্গামী নিয়ম।</translation>
 <translation id="4893347770495441059">&amp;Chromium আপডে'ট কৰিবলৈ পুনৰ লঞ্চ কৰক</translation>
 <translation id="4918844574251943176">প্ৰতিচ্ছবি প্ৰতিলিপি কৰা হ’ল</translation>
-<translation id="4942295735032723435">Chromiumৰ ভৱিষ্যতৰ আপডে’টসমূহ পাবলৈ আপোনাক macOS 11 অথবা তাৰ পাছৰ সংস্কৰণৰ আৱশ্যক হ’ব। এই কম্পিউটাৰটোৱে macOS 10.15 ব্যৱহাৰ কৰি আছে।</translation>
 <translation id="4943838377383847465">Chromium নেপথ্য ম’ডত আছে।</translation>
 <translation id="494490797786467921">Chromiumৰ ছাইন-ইন ডায়লগটো বন্ধ কৰিবলৈ ক্লিক কৰক</translation>
 <translation id="4950660488495335294">Chromiumৰ প্ৰ’ফাইলৰ জৰিয়তে আপুনি নিজৰ আটাইবোৰ Chromiumৰ বস্তু পৃথক কৰিব পাৰে। বন্ধুবৰ্গ আৰু পৰিয়ালৰ বাবে প্ৰ’ফাইল সৃষ্টি কৰক বা কৰ্মস্থান আৰু মনোৰঞ্জনৰ মাজত বিভাজন কৰক।</translation>
diff --git a/chrome/app/resources/chromium_strings_az.xtb b/chrome/app/resources/chromium_strings_az.xtb
index 3eda8c6..9393162 100644
--- a/chrome/app/resources/chromium_strings_az.xtb
+++ b/chrome/app/resources/chromium_strings_az.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">mDNS trafikinə imkan vermək üçün Chromium üçün daxil olan qayda.</translation>
 <translation id="4893347770495441059">&amp;Chromium'u Güncəlləmək üçün yenidən başladın</translation>
 <translation id="4918844574251943176">Şəkil kopyalandı</translation>
-<translation id="4942295735032723435">Chromium güncəlləmələri əldə etmək üçün macOS 11 və ya yeni versiya tələb olunur. Bu kompüter macOS 10.15 istifadə edir.</translation>
 <translation id="4943838377383847465">Chromium arxa fon rejimindədir.</translation>
 <translation id="494490797786467921">Klikləyərək Chromium giriş dialoqunu bağlayın</translation>
 <translation id="4950660488495335294">Chromium profilləri ilə bütün Chromium elementlərinizi ayıra bilərsiniz. Dostlarınız və ailəniz üçün profillər yaradın, yaxud iş və əyləncə olaraq ayırın.</translation>
diff --git a/chrome/app/resources/chromium_strings_be.xtb b/chrome/app/resources/chromium_strings_be.xtb
index 71975c8e..e60fcc6 100644
--- a/chrome/app/resources/chromium_strings_be.xtb
+++ b/chrome/app/resources/chromium_strings_be.xtb
@@ -287,7 +287,6 @@
 <translation id="4888717733111232871">Уваходнае правіла для Chromium, якое дазваляе трафік mDNS.</translation>
 <translation id="4893347770495441059">Перазапусціць, каб абнавіць &amp;Chromium</translation>
 <translation id="4918844574251943176">Відарыс скапіраваны</translation>
-<translation id="4942295735032723435">Каб атрымліваць будучыя абнаўленні Chromium, патрабуецца macOS 11 ці пазнейшай версіі. На гэтым камп’ютары выкарыстоўваецца macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium працуе ў фонавым рэжыме.</translation>
 <translation id="494490797786467921">Націсніце, каб закрыць дыялогавае акно ўваходу ў Chromium</translation>
 <translation id="4950660488495335294">Профілі Chromium патрэбныя для раздзельнага выкарыстання браўзера рознымі людзьмі і ў розных мэтах. Стварайце профілі для сяброў і родных або раздзяляйце работу і забавы.</translation>
diff --git a/chrome/app/resources/chromium_strings_bg.xtb b/chrome/app/resources/chromium_strings_bg.xtb
index a0cafed7a..5d25bba 100644
--- a/chrome/app/resources/chromium_strings_bg.xtb
+++ b/chrome/app/resources/chromium_strings_bg.xtb
@@ -284,7 +284,6 @@
 <translation id="4888717733111232871">Правило за Chromium за допускане на входящия трафик за mDNS.</translation>
 <translation id="4893347770495441059">Повторно стартиране за актуализиране на &amp;Chromium</translation>
 <translation id="4918844574251943176">Изображението е копирано</translation>
-<translation id="4942295735032723435">За да получавате бъдещи актуализации на Chromium, трябва да използвате macOS 11 или по-нова версия. Компютърът ви работи с macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium работи на заден план.</translation>
 <translation id="494490797786467921">Кликнете, за да затворите диалоговия прозорец за вход в Chromium</translation>
 <translation id="4950660488495335294">С помощта на потребителските профили в Chromium можете да разделите данните си в браузъра. Създайте потребителски профили за близки и приятели или за разделяне на работата от забавленията.</translation>
diff --git a/chrome/app/resources/chromium_strings_bn.xtb b/chrome/app/resources/chromium_strings_bn.xtb
index 27ebdd8..1150a17 100644
--- a/chrome/app/resources/chromium_strings_bn.xtb
+++ b/chrome/app/resources/chromium_strings_bn.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">mDNS ট্রাফিকের অনুমতি দিতে Chromium এর জন্য ইনবাউন্ড নিয়ম।</translation>
 <translation id="4893347770495441059">&amp;Chromium আপডেট করতে আবার লঞ্চ করুন</translation>
 <translation id="4918844574251943176">ছবি কপি করা হয়েছে</translation>
-<translation id="4942295735032723435">ভবিষ্যতে Chromium আপডেট পেতে হলে, আপনার কাছে macOS 11 বা তার পরবর্তী ভার্সন থাকতে হবে। এই কম্পিউটারে macOS 10.15 ভার্সন ব্যবহার করা হচ্ছে।</translation>
 <translation id="4943838377383847465">Chromium পটভূমিতে চলছে৷</translation>
 <translation id="494490797786467921">Chromium-এ সাইন-ইন করার জন্য় ডায়ালগ বন্ধ করতে, ক্লিক করুন</translation>
 <translation id="4950660488495335294">Chromium প্রোফাইল থেকে আপনার সব Chromium-এ থাকা ডেটা আলাদা করতে পারবেন। বন্ধু এবং পরিবারের জন্য প্রোফাইল তৈরি করুন অথবা অফিস এবং বিনোদনের প্রোফাইল আলাদা আলাদা রাখুন।</translation>
diff --git a/chrome/app/resources/chromium_strings_bs.xtb b/chrome/app/resources/chromium_strings_bs.xtb
index 4c94367..c6ac108 100644
--- a/chrome/app/resources/chromium_strings_bs.xtb
+++ b/chrome/app/resources/chromium_strings_bs.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">Ulazno pravilo da Chromium dozvoli mDNS saobraćaj.</translation>
 <translation id="4893347770495441059">Ponovo pokrenite da ažurirate &amp;Chromium</translation>
 <translation id="4918844574251943176">Slika je kopirana</translation>
-<translation id="4942295735032723435">Da primate buduća ažuriranja za Chromium, trebat će vam macOS 11 ili novija verzija. Ovaj računar koristi macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium je u pozadinskom načinu rada.</translation>
 <translation id="494490797786467921">Zatvaranje dijaloškog okvira za prijavu u Chromium klikom</translation>
 <translation id="4950660488495335294">Pomoću Chromium profila možete odvojiti sve svoje sadržaje u Chromiumu. Kreirajte profile za prijatelje i porodicu ili razdvojite posao i zabavu.</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb
index e6e2b2e3..51d8614 100644
--- a/chrome/app/resources/chromium_strings_ca.xtb
+++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">Regla d'entrada de Chromium per permetre el trànsit de mDNS.</translation>
 <translation id="4893347770495441059">Reinicia per actualitzar &amp;Chromium</translation>
 <translation id="4918844574251943176">La imatge s'ha copiat</translation>
-<translation id="4942295735032723435">Per obtenir actualitzacions de Chromium en un futur, necessitaràs macOS 11 o una versió posterior. Aquest ordinador utilitza macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium està en mode de segon pla.</translation>
 <translation id="494490797786467921">Fes clic per tancar el quadre de diàleg d'inici de sessió de Chromium</translation>
 <translation id="4950660488495335294">Els perfils de Chromium et permeten separar tot el contingut de Chromium. Crea perfils per a amics i familiars, o separa la feina de la diversió.</translation>
diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb
index 05cdfec..c244ad2 100644
--- a/chrome/app/resources/chromium_strings_cs.xtb
+++ b/chrome/app/resources/chromium_strings_cs.xtb
@@ -287,7 +287,6 @@
 <translation id="4888717733111232871">Pravidlo příchozího provozu pro prohlížeč Chromium, které povolí provoz mDNS.</translation>
 <translation id="4893347770495441059">Znovu spustit a aktualizovat &amp;Chromium</translation>
 <translation id="4918844574251943176">Obrázek byl zkopírován</translation>
-<translation id="4942295735032723435">Pokud chcete v budoucnu dostávat aktualizace prohlížeče Chromium, budete potřebovat systém macOS 11 nebo novější. Tento počítač používá systém macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium je v režimu na pozadí.</translation>
 <translation id="494490797786467921">Kliknutím zavřete přihlašovací dialogové okno prohlížeče Chromium</translation>
 <translation id="4950660488495335294">Pomocí profilů Chromium můžete všechny své údaje v prohlížeči Chromium uchovávat odděleně. Vytvořte profily pro přátele a rodinu nebo rozdělte činnosti mezi práci a zábavu.</translation>
diff --git a/chrome/app/resources/chromium_strings_cy.xtb b/chrome/app/resources/chromium_strings_cy.xtb
index b1d2fef..0ae83bc 100644
--- a/chrome/app/resources/chromium_strings_cy.xtb
+++ b/chrome/app/resources/chromium_strings_cy.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">Rheol dod i mewn ar gyfer Chromium i ganiatáu traffig mDNS.</translation>
 <translation id="4893347770495441059">Ail-lansiwch i Ddiweddaru &amp;Chromium</translation>
 <translation id="4918844574251943176">Llun wedi'i gopïo</translation>
-<translation id="4942295735032723435">I gael diweddariadau Chromium yn y dyfodol, bydd angen macOS 11 neu'n hwyrach arnoch. Mae'r cyfrifiadur hwn yn defnyddio macOS 10.15.</translation>
 <translation id="4943838377383847465">Mae Chromium yn y modd cefndir.</translation>
 <translation id="494490797786467921">Cliciwch i gau'r deialog mewngofnodi Chromium</translation>
 <translation id="4950660488495335294">Gallwch wahanu eich holl bethau Chromium gyda phroffiliau Chromium. Creu proffiliau ar gyfer eich ffrindiau a'ch teulu, neu rannu rhwng gwaith a hwyl.</translation>
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb
index 5029ac5..f574758 100644
--- a/chrome/app/resources/chromium_strings_da.xtb
+++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">Indgående regel for Chromium om at tillade mDNS-trafik.</translation>
 <translation id="4893347770495441059">Genstart og opdater &amp;Chromium</translation>
 <translation id="4918844574251943176">Billedet er blevet kopieret</translation>
-<translation id="4942295735032723435">Hvis du vil have fremtidige Chromium-opdateringer, skal du have macOS 11 eller nyere. Denne computer anvender macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium kører i baggrunden.</translation>
 <translation id="494490797786467921">Klik for at lukke dialogboksen til login i Chromium</translation>
 <translation id="4950660488495335294">Du kan organisere alle dine ting i Chromium ved hjælp af Chromium-profiler. Opret profiler til venner og familie, eller brug dem til at holde arbejde og fornøjelse adskilt.</translation>
diff --git a/chrome/app/resources/chromium_strings_de.xtb b/chrome/app/resources/chromium_strings_de.xtb
index a4537b2..06a9ed5 100644
--- a/chrome/app/resources/chromium_strings_de.xtb
+++ b/chrome/app/resources/chromium_strings_de.xtb
@@ -285,7 +285,6 @@
 <translation id="4888717733111232871">Eingangsregel für die Zulassung von mDNS-Verkehr in Chromium</translation>
 <translation id="4893347770495441059">Neu starten, um &amp;Chromium zu aktualisieren</translation>
 <translation id="4918844574251943176">Bild kopiert</translation>
-<translation id="4942295735032723435">Du benötigst macOS 11 oder höher, um zukünftige Chromium-Updates zu erhalten. Auf diesem Computer wird macOS 10.15 ausgeführt.</translation>
 <translation id="4943838377383847465">Chromium wird im Hintergrundmodus ausgeführt.</translation>
 <translation id="494490797786467921">Klicken, um Dialogfeld zur Anmeldung in Chromium zu schließen</translation>
 <translation id="4950660488495335294">Mit Chromium-Profilen kannst du Chromium-Inhalte voneinander trennen. Du kannst Profile für Freunde und Familie erstellen oder Inhalte in Arbeit und Freizeit einteilen.</translation>
diff --git a/chrome/app/resources/chromium_strings_el.xtb b/chrome/app/resources/chromium_strings_el.xtb
index 5da1bba..cb29722 100644
--- a/chrome/app/resources/chromium_strings_el.xtb
+++ b/chrome/app/resources/chromium_strings_el.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">Εισερχόμενος κανόνας για το Chromium για να επιτρέπεται η κυκλοφορία του mDNS.</translation>
 <translation id="4893347770495441059">Επανεκκίνηση για ενημέρωση του &amp;Chromium</translation>
 <translation id="4918844574251943176">Η εικόνα αντιγράφηκε</translation>
-<translation id="4942295735032723435">Για τη λήψη μελλοντικών ενημερώσεων του Chromium, θα χρειαστείτε macOS 11 ή νεότερη έκδοση. Αυτός ο υπολογιστής χρησιμοποιεί macOS 10.15.</translation>
 <translation id="4943838377383847465">Το Chromium εκτελείται στο παρασκήνιο.</translation>
 <translation id="494490797786467921">Κάντε κλικ για να κλείσετε το παράθυρο διαλόγου σύνδεσης του Chromium</translation>
 <translation id="4950660488495335294">Με τα προφίλ του Chromium μπορείτε να διαχωρίσετε όλη τη δραστηριότητα και το περιεχόμενό σας στο Chromium. Δημιουργήστε προφίλ για φίλους και μέλη της οικογένειας ή διαχωρίστε την εργασία και τη διασκέδαση.</translation>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb
index fafea95..5139f53e 100644
--- a/chrome/app/resources/chromium_strings_en-GB.xtb
+++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">Inbound rule for Chromium to allow mDNS traffic.</translation>
 <translation id="4893347770495441059">Relaunch to Update &amp;Chromium</translation>
 <translation id="4918844574251943176">Image copied</translation>
-<translation id="4942295735032723435">To get future Chromium updates, you'll need macOS 11 or later. This computer is using macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium is in background mode.</translation>
 <translation id="494490797786467921">Click to close the Chromium sign-in dialogue</translation>
 <translation id="4950660488495335294">With Chromium profiles, you can separate all your Chromium stuff. Create profiles for friends and family, or split between work and fun.</translation>
diff --git a/chrome/app/resources/chromium_strings_es-419.xtb b/chrome/app/resources/chromium_strings_es-419.xtb
index 8f51e5f..d4f2a965 100644
--- a/chrome/app/resources/chromium_strings_es-419.xtb
+++ b/chrome/app/resources/chromium_strings_es-419.xtb
@@ -284,7 +284,6 @@
 <translation id="4888717733111232871">Regla de entrada para que Chromium permita el tráfico mDNS.</translation>
 <translation id="4893347770495441059">Reiniciar para actualizar &amp;Chromium</translation>
 <translation id="4918844574251943176">Se copió la imagen</translation>
-<translation id="4942295735032723435">Para obtener las próximas actualizaciones de Chromium, necesitarás macOS 11 o versiones posteriores. Esta computadora usa macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium está en modo de segundo plano</translation>
 <translation id="494490797786467921">Hacer clic para cerrar el diálogo de acceso de Chromium</translation>
 <translation id="4950660488495335294">Con los perfiles de Chromium, puedes separar todo lo que tienes en Chromium. Crea perfiles para amigos y familiares, o diferencia el trabajo de la diversión.</translation>
diff --git a/chrome/app/resources/chromium_strings_es.xtb b/chrome/app/resources/chromium_strings_es.xtb
index 54dd787..4ca7343 100644
--- a/chrome/app/resources/chromium_strings_es.xtb
+++ b/chrome/app/resources/chromium_strings_es.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">Regla entrante para que Chromium permita tráfico mDNS.</translation>
 <translation id="4893347770495441059">Reiniciar para actualizar &amp;Chromium</translation>
 <translation id="4918844574251943176">Imagen copiada</translation>
-<translation id="4942295735032723435">Para recibir futuras actualizaciones de Chromium, necesitarás macOS 11 o una versión posterior. Este ordenador usa macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium está en modo de segundo plano.</translation>
 <translation id="494490797786467921">Haz clic para cerrar el cuadro de diálogo de inicio de sesión de Chromium</translation>
 <translation id="4950660488495335294">Con los perfiles de Chromium, puedes separar todos tus elementos de Chromium. Crea perfiles para amigos y familiares, o un perfil de trabajo y otro de ocio.</translation>
diff --git a/chrome/app/resources/chromium_strings_et.xtb b/chrome/app/resources/chromium_strings_et.xtb
index fa70b5ef..5ec15a0 100644
--- a/chrome/app/resources/chromium_strings_et.xtb
+++ b/chrome/app/resources/chromium_strings_et.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">Sissetuleku reegel Chromiumile mDNS-liikluse lubamiseks.</translation>
 <translation id="4893347770495441059">Taaskäivitage &amp;Chromiumi värskendamiseks</translation>
 <translation id="4918844574251943176">Pilt kopeeriti</translation>
-<translation id="4942295735032723435">Chromiumi tulevaste värskenduste saamiseks on teil vaja operatsioonisüsteemi macOS 11 või uuemat versiooni. See arvuti kasutab operatsioonisüsteemi macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium on taustarežiimis.</translation>
 <translation id="494490797786467921">Klõpsake, et Chromiumi sisselogimise dialoog sulgeda</translation>
 <translation id="4950660488495335294">Chromiumi profiilidega saate eraldada kogu oma Chromiumi sisu. Looge profiile sõprade või pereliikmete jaoks või eraldage nende abil töö ja lõbu.</translation>
diff --git a/chrome/app/resources/chromium_strings_eu.xtb b/chrome/app/resources/chromium_strings_eu.xtb
index 08337f1..d8322f4 100644
--- a/chrome/app/resources/chromium_strings_eu.xtb
+++ b/chrome/app/resources/chromium_strings_eu.xtb
@@ -287,7 +287,6 @@
 <translation id="4888717733111232871">Chromium-ek mDNS trafikoa baimentzeko sarrerako araua.</translation>
 <translation id="4893347770495441059">Exekuta ezazu berriro &amp;Chromium eguneratzeko</translation>
 <translation id="4918844574251943176">Kopiatu da irudia</translation>
-<translation id="4942295735032723435">Etorkizunean Chromium-en eguneratzeak eskuratzeko, macOS 11 edo berriago bat beharko duzu. Ordenagailu hau macOS 10.15 erabiltzen ari da.</translation>
 <translation id="4943838377383847465">Chromium atzeko planoko moduan dago.</translation>
 <translation id="494490797786467921">Chromium-en saioa hasteko leihoa ixteko, sakatu hau</translation>
 <translation id="4950660488495335294">Chromium-eko profilekin, Chromium-en dituzun gauza guztiak bereiz ditzakezu. Sortu profilak lagunentzat eta familiako kideentzat, edo banandu gauza pertsonalak eta lanekoak.</translation>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb
index 3590b4c..d219eff 100644
--- a/chrome/app/resources/chromium_strings_fa.xtb
+++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -285,7 +285,6 @@
 <translation id="4888717733111232871">‏قانون ترافیک ورودی برای Chromium جهت اجازه به ترافیک mDNS.</translation>
 <translation id="4893347770495441059">‏راه‌اندازی مجدد برای به‌روزرسانی Chromium</translation>
 <translation id="4918844574251943176">تصویر کپی شد</translation>
-<translation id="4942295735032723435">‏برای دریافت به‌روزرسانی‌های بعدی Chromium، باید macOS نسخه ۱۱ یا بالاتر داشته باشید. این رایانه از macOS نسخه ۱۰.۱۵ استفاده می‌کند.</translation>
 <translation id="4943838377383847465">‏Chromium در حالت پس‌زمینه است.</translation>
 <translation id="494490797786467921">‏برای بستن کادر گفتگوی ورود به سیستم Chromium، کلیک کنید</translation>
 <translation id="4950660488495335294">‏با نمایه‌های Chromium می‌توانید همه چیزهای مربوط به Chromium را از هم جدا کنید. برای دوستان و اعضای خانواده نمایه ایجاد کنید، یا کار و سرگرمی را ازهم جدا کنید.</translation>
diff --git a/chrome/app/resources/chromium_strings_fi.xtb b/chrome/app/resources/chromium_strings_fi.xtb
index d0538dc..2bdc6c8 100644
--- a/chrome/app/resources/chromium_strings_fi.xtb
+++ b/chrome/app/resources/chromium_strings_fi.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">Chromiumin saapuvien yhteyksien sääntö, joka sallii mDNS-liikenteen.</translation>
 <translation id="4893347770495441059">Päivitä &amp;Chromium käynnistämällä se uudelleen</translation>
 <translation id="4918844574251943176">Kuva kopioitu</translation>
-<translation id="4942295735032723435">Sinulla on oltava macOS 11 tai uudempi, jotta saat tulevia Chromiumin päivityksiä. Tällä tietokoneella on macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium on käynnissä taustalla</translation>
 <translation id="494490797786467921">Sulje Chromiumin kirjautumisikkuna klikkaamalla</translation>
 <translation id="4950660488495335294">Kun käytät Chromium-profiileja, voit pitää kaiken Chromium-sisällön erillään. Luo profiileja kavereita ja perhettä varten tai tee ero työn ja hauskanpidon välille.</translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb
index b09f54b6..ae56458 100644
--- a/chrome/app/resources/chromium_strings_fil.xtb
+++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">Inbound na panuntunan para sa Chromium upang payagan ang trapiko ng mDNS.</translation>
 <translation id="4893347770495441059">Ilunsad Ulit para Ma-update ang Chromium</translation>
 <translation id="4918844574251943176">Nakopya na ang larawan</translation>
-<translation id="4942295735032723435">Para makatanggap ng mga update sa Chromium sa hinaharap, kakailanganin mo ng macOS 11 o mas bago. Gumagamit ng macOS 10.15 ang computer na ito.</translation>
 <translation id="4943838377383847465">Nasa background mode ang Chromium.</translation>
 <translation id="494490797786467921">I-click para isara ang dialog ng pag-sign in sa Chromium</translation>
 <translation id="4950660488495335294">Gamit ang mga profile sa Chromium, magagawa mong paghiwalayin ang lahat ng iyong bagay-bagay sa Chromium. Gumawa ng mga profile para sa mga kaibigan at kapamilya, o gumawa ng magkahiwalay na profile para sa trabaho at kasiyahan.</translation>
diff --git a/chrome/app/resources/chromium_strings_fr-CA.xtb b/chrome/app/resources/chromium_strings_fr-CA.xtb
index 5a89cf66..70baf19 100644
--- a/chrome/app/resources/chromium_strings_fr-CA.xtb
+++ b/chrome/app/resources/chromium_strings_fr-CA.xtb
@@ -287,7 +287,6 @@
 <translation id="4888717733111232871">Règle de trafic entrant pour Chrome afin d'autoriser le trafic mDNS.</translation>
 <translation id="4893347770495441059">Relancer &amp;Chromium pour le mettre à jour</translation>
 <translation id="4918844574251943176">Image copiée</translation>
-<translation id="4942295735032723435">Vous devez disposer de macOS 11 ou d'une version ultérieure pour recevoir les futures mises à jour de Chromium. Cet ordinateur fonctionne sous macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium fonctionne en mode arrière-plan.</translation>
 <translation id="494490797786467921">Cliquer sur le bouton pour fermer la boîte de dialogue de connexion à Chromium</translation>
 <translation id="4950660488495335294">Avec les profils Chromium, vous pouvez séparer toutes vos données Chromium. Créez des profils pour vos amis et votre famille, ou pour dissocier travail et divertissement.</translation>
diff --git a/chrome/app/resources/chromium_strings_fr.xtb b/chrome/app/resources/chromium_strings_fr.xtb
index 70dbb14..e593f56 100644
--- a/chrome/app/resources/chromium_strings_fr.xtb
+++ b/chrome/app/resources/chromium_strings_fr.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">Règle de trafic entrant pour Chromium autorisant le trafic mDNS</translation>
 <translation id="4893347770495441059">Relancer et mettre à jour &amp;Chromium</translation>
 <translation id="4918844574251943176">Image copiée</translation>
-<translation id="4942295735032723435">Vous devez disposer de macOS 11 ou d'une version ultérieure pour recevoir les futures mises à jour de Chromium. macOS 10.15 est installé sur cet ordinateur.</translation>
 <translation id="4943838377383847465">Chromium est exécuté en mode arrière-plan</translation>
 <translation id="494490797786467921">Cliquer pour fermer la boîte de dialogue de connexion Chromium</translation>
 <translation id="4950660488495335294">Utilisez les profils Chromium pour dissocier toutes vos données Chromium. Créez des profils pour vos amis et votre famille, ou créez un profil pour travailler et un autre pour vous divertir.</translation>
diff --git a/chrome/app/resources/chromium_strings_gl.xtb b/chrome/app/resources/chromium_strings_gl.xtb
index a4457465..d45d811 100644
--- a/chrome/app/resources/chromium_strings_gl.xtb
+++ b/chrome/app/resources/chromium_strings_gl.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">Norma de entrada para Chromium para permitir tráfico mDNS.</translation>
 <translation id="4893347770495441059">Reiniciar para actualizar &amp;Chromium</translation>
 <translation id="4918844574251943176">Copiouse a imaxe</translation>
-<translation id="4942295735032723435">Se queres recibir actualizacións de Chromium no futuro, debes instalar o sistema operativo macOS 11 ou unha versión posterior. Este ordenador ten macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium está no modo de segundo plano.</translation>
 <translation id="494490797786467921">Fai clic para pechar o cadro de diálogo de inicio de sesión de Chromium</translation>
 <translation id="4950660488495335294">Cos perfís de Chromium podes separar todo o contido que teñas neste navegador. Crea perfís para os amigos e a familia ou ben crea un para o traballo e outro para o lecer.</translation>
diff --git a/chrome/app/resources/chromium_strings_gu.xtb b/chrome/app/resources/chromium_strings_gu.xtb
index bb57930..6350b51 100644
--- a/chrome/app/resources/chromium_strings_gu.xtb
+++ b/chrome/app/resources/chromium_strings_gu.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">mDNS ટ્રાફિકને મંજૂરી આપવા Chromium માટે ઇનબાઉન્ડ નિયમ.</translation>
 <translation id="4893347770495441059">&amp;Chromium અપડેટ કરવા માટે, ફરીથી લૉન્ચ કરો</translation>
 <translation id="4918844574251943176">છબી કૉપિ કરી</translation>
-<translation id="4942295735032723435">Chromiumની ભાવિ અપડેટ મેળવવા માટે, તમારે macOS 11 કે તે પછીના વર્ઝન પર અપડેટ કરવું જરૂરી રહેશે. આ કમ્પ્યૂટર macOS 10.15નો ઉપયોગ કરી રહ્યું છે.</translation>
 <translation id="4943838377383847465">Chromium બૅકગ્રાઉન્ડ મોડમાં છે.</translation>
 <translation id="494490797786467921">Chromiumમાં સાઇન ઇન કરવાનો સંવાદ બંધ કરવા માટે ક્લિક કરો</translation>
 <translation id="4950660488495335294">Chromium પ્રોફાઇલ વડે, તમે તમારી બધી વસ્તુઓ Chromium પર અલગ-અલગ રાખી શકો છો. મિત્રો અને કુટુંબ માટે પ્રોફાઇલ બનાવો અથવા તેને ઑફિસ અને મનોરંજન વચ્ચે વિભાજિત કરો.</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb
index f2a9cd36..ac68dec 100644
--- a/chrome/app/resources/chromium_strings_hi.xtb
+++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -285,7 +285,6 @@
 <translation id="4888717733111232871">mDNS ट्रैफ़िक की अनुमति देने के लिए क्रोमियम के लिए इनबाउंड नियम.</translation>
 <translation id="4893347770495441059">&amp;Chromium को अपडेट करने के लिए फिर से लॉन्च करें</translation>
 <translation id="4918844574251943176">इमेज को कॉपी किया गया</translation>
-<translation id="4942295735032723435">आगे भी Chromium के अपडेट पाते रहने के लिए, आपके कंप्यूटर में macOS 11 या इसके बाद का वर्शन इंस्टॉल होना चाहिए. फ़िलहाल, इस कंप्यूटर में macOS 10.15 का इस्तेमाल किया जा रहा है.</translation>
 <translation id="4943838377383847465">क्रोमियम पृष्ठभूमि मोड में है.</translation>
 <translation id="494490797786467921">Chromium का साइन इन डायलॉग बॉक्स बंद करने के लिए क्लिक करें</translation>
 <translation id="4950660488495335294">Chromium प्रोफ़ाइलों का इस्तेमाल करके, Chromium से जुड़ी अपनी सभी चीज़ों को अलग-अलग रखा जा सकता है. अपने दोस्तों और परिवार या काम और मनोरंजन की चीज़ों को अलग-अलग रखने के लिए, प्रोफ़ाइलें बनाएं.</translation>
diff --git a/chrome/app/resources/chromium_strings_hr.xtb b/chrome/app/resources/chromium_strings_hr.xtb
index 2899a4e79..5343afb 100644
--- a/chrome/app/resources/chromium_strings_hr.xtb
+++ b/chrome/app/resources/chromium_strings_hr.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">Ulazno pravilo kako bi Chromium dopustio mDNS promet.</translation>
 <translation id="4893347770495441059">Ponovno pokretanje radi ažuriranja &amp;Chromiuma</translation>
 <translation id="4918844574251943176">Slika je kopirana</translation>
-<translation id="4942295735032723435">Da biste primali buduća Chromiumova ažuriranja, trebat će vam macOS 11 ili novija verzija. Na ovom se računalu upotrebljava macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium radi u pozadini.</translation>
 <translation id="494490797786467921">Kliknite da biste zatvorili dijaloški okvir za prijavu u Chromium</translation>
 <translation id="4950660488495335294">Pomoću Chromiumovih profila možete razdvojiti sve svoje sadržaje u Chromiumu. Izradite profile za prijatelje i obitelj ili odvojite posao i zabavu.</translation>
diff --git a/chrome/app/resources/chromium_strings_hu.xtb b/chrome/app/resources/chromium_strings_hu.xtb
index 9c63557..995d888 100644
--- a/chrome/app/resources/chromium_strings_hu.xtb
+++ b/chrome/app/resources/chromium_strings_hu.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">Bejövő szabály a Chromiumhoz az mDNS forgalom engedélyezése céljából.</translation>
 <translation id="4893347770495441059">Indítsa újra a Chromium frissítéshez</translation>
 <translation id="4918844574251943176">Kép másolva</translation>
-<translation id="4942295735032723435">Ha a jövőben Chromium-frissítéseket szeretne kapni, akkor a macOS 11-es vagy újabb verziójára lesz szüksége. Ezen a számítógépen a macOS 10.15 fut.</translation>
 <translation id="4943838377383847465">A Chromium háttérmódban van.</translation>
 <translation id="494490797786467921">Kattintson a Chromium bejelentkezési párbeszédpaneljének bezárásához</translation>
 <translation id="4950660488495335294">A Chromium-profilokkal különválaszthatja minden Chromium-anyagát. Létrehozhat profilokat ismerőseinek és családtagjainak, vagy elkülönítheti egymástól a munkát és a szórakozást.</translation>
diff --git a/chrome/app/resources/chromium_strings_hy.xtb b/chrome/app/resources/chromium_strings_hy.xtb
index 1aa8b91..73a2fff 100644
--- a/chrome/app/resources/chromium_strings_hy.xtb
+++ b/chrome/app/resources/chromium_strings_hy.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">Թույլատրել Chromium-ում տվյալների մուտքային հոսքի փոխանցումը mDNS հաղորդակարգով:</translation>
 <translation id="4893347770495441059">Վերագործարկել՝ &amp;Chromium-ը թարմացնելու համար</translation>
 <translation id="4918844574251943176">Պատկերը պատճենվեց</translation>
-<translation id="4942295735032723435">Chromium-ի հետագա թարմացումները ստանալու համար ձեզ անհրաժեշտ է macOS 11 կամ ավելի նոր տարբերակ։ Այս համակարգիչն օգտագործում է macOS 10.15 տարբերակը։</translation>
 <translation id="4943838377383847465">Chromium-ն աշխատում է ֆոնային ռեժիմում:</translation>
 <translation id="494490797786467921">Սեղմեք՝ Chromium մտնելու երկխոսության պատուհանը փակելու համար</translation>
 <translation id="4950660488495335294">Chromium պրոֆիլների միջոցով դուք կարող եք օգտագործել դիտարկիչն առանձին այլ օգտատերերից։ Ստեղծեք պրոֆիլներ ձեր ընկերների և ընտանիքի անդամների կամ գործնական և անձնական նպատակների համար։</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb
index 9603c66b..502f1e1 100644
--- a/chrome/app/resources/chromium_strings_id.xtb
+++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">Inbound rule untuk Chromium guna mengizinkan lalu lintas mDNS.</translation>
 <translation id="4893347770495441059">Luncurkan kembali untuk Mengupdate &amp;Chromium</translation>
 <translation id="4918844574251943176">Gambar disalin</translation>
-<translation id="4942295735032723435">Untuk mendapatkan update Chromium berikutnya, Anda perlu macOS 11 atau yang lebih baru. Komputer ini menggunakan macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium berjalan di mode latar belakang.</translation>
 <translation id="494490797786467921">Klik untuk menutup dialog login Chromium</translation>
 <translation id="4950660488495335294">Dengan profil Chromium, Anda dapat memisahkan semua aktivitas Chromium Anda. Buat profil untuk teman dan keluarga, atau pisahkan antara aktivitas kerja dan hiburan.</translation>
diff --git a/chrome/app/resources/chromium_strings_is.xtb b/chrome/app/resources/chromium_strings_is.xtb
index c18eb09..73fc793 100644
--- a/chrome/app/resources/chromium_strings_is.xtb
+++ b/chrome/app/resources/chromium_strings_is.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">Regla á innleið til að láta Chromium leyfa mDNS-umferð.</translation>
 <translation id="4893347770495441059">Endurræstu til að uppfæra &amp;Chromium</translation>
 <translation id="4918844574251943176">Mynd afrituð</translation>
-<translation id="4942295735032723435">Til að fá frekari uppfærslur á Chromium þarftu macOS 11 eða nýrri útgáfu. Þessi tölva notar macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium er í bakgrunnsstillingu.</translation>
 <translation id="494490797786467921">Smelltu til að loka innskráningarglugga Chromium</translation>
 <translation id="4950660488495335294">Þú getur aðskilið allt efnið þitt á Chromium með Chromium-prófílum. Stofnaðu prófíla fyrir vini og fjölskyldu eða skiptu á milli vinnu og afþreyingar.</translation>
diff --git a/chrome/app/resources/chromium_strings_it.xtb b/chrome/app/resources/chromium_strings_it.xtb
index 97adb24..24a77c5c 100644
--- a/chrome/app/resources/chromium_strings_it.xtb
+++ b/chrome/app/resources/chromium_strings_it.xtb
@@ -285,7 +285,6 @@
 <translation id="4888717733111232871">Regola inbound per consentire il traffico mDNS in Chromium.</translation>
 <translation id="4893347770495441059">Riavvia per aggiornare &amp;Chromium</translation>
 <translation id="4918844574251943176">Immagine copiata</translation>
-<translation id="4942295735032723435">Per ricevere gli aggiornamenti futuri di Chromium, devi avere macOS 11 o versioni successive. Su questo computer è installato macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium è in modalità background.</translation>
 <translation id="494490797786467921">Fai clic per chiudere la finestra di dialogo di accesso a Chromium</translation>
 <translation id="4950660488495335294">Con i profili Chromium puoi separare tutti i tuoi contenuti di Chromium. Crea profili per amici e familiari oppure dividi i dati di lavoro e i contenuti di svago.</translation>
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb
index 37a85970..87efc29b 100644
--- a/chrome/app/resources/chromium_strings_iw.xtb
+++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -284,7 +284,6 @@
 <translation id="4888717733111232871">‏כלל נכנס עבור Chromium על מנת לאפשר תנועת mDNS.</translation>
 <translation id="4893347770495441059">‏הפעלה מחדש לצורך עדכון &amp;Chromium</translation>
 <translation id="4918844574251943176">התמונה הועתקה</translation>
-<translation id="4942295735032723435">‏כדי לקבל עדכונים של Chromium בעתיד, צריך להשתמש ב-macOS מגרסה 11 ואילך. במחשב הזה פועלת גרסה 10.15 של macOS.</translation>
 <translation id="4943838377383847465">‏Chromium נמצא במצב רקע.</translation>
 <translation id="494490797786467921">‏אפשר ללחוץ כדי לסגור את תיבת הדו-שיח של הכניסה ל-Chromium</translation>
 <translation id="4950660488495335294">‏באמצעות פרופילים ב-Chromium, אפשר להפריד את כל הפריטים ב-Chromium. אפשר ליצור פרופילים שמיועדים לחברים ולבני משפחה או פרופילים נפרדים לעבודה ולבילויים בשעות הפנאי.</translation>
diff --git a/chrome/app/resources/chromium_strings_ja.xtb b/chrome/app/resources/chromium_strings_ja.xtb
index 567e318f..2f62bb4 100644
--- a/chrome/app/resources/chromium_strings_ja.xtb
+++ b/chrome/app/resources/chromium_strings_ja.xtb
@@ -285,7 +285,6 @@
 <translation id="4888717733111232871">mDNS トラフィックを許可する Chromium のインバウンド ルールです。</translation>
 <translation id="4893347770495441059">再起動して Chromium を更新(&amp;C)</translation>
 <translation id="4918844574251943176">画像をコピーしました</translation>
-<translation id="4942295735032723435">今後、Chromium のアップデートを受信するには、macOS 11 以降が必要となります。このコンピュータでは macOS 10.15 が実行されています。</translation>
 <translation id="4943838377383847465">Chromium はバックグラウンド モードです。</translation>
 <translation id="494490797786467921">クリックすると、Chromium のログイン ダイアログを閉じます</translation>
 <translation id="4950660488495335294">Chromium プロフィールを使うと、Chromium のあらゆる項目や設定を個別に管理できます。友達や家族のプロフィールを作成したり、仕事とプライベートでプロフィールを使い分けたりできます。</translation>
diff --git a/chrome/app/resources/chromium_strings_ka.xtb b/chrome/app/resources/chromium_strings_ka.xtb
index d9282866..897ab67 100644
--- a/chrome/app/resources/chromium_strings_ka.xtb
+++ b/chrome/app/resources/chromium_strings_ka.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">Chromium-ის შემავალი წესი დაუშვას mDNS მოძრაობა.</translation>
 <translation id="4893347770495441059">ხელახლა გაშვება &amp;Chromium-ის გასაახლებლად</translation>
 <translation id="4918844574251943176">სურათი დაკოპირდა</translation>
-<translation id="4942295735032723435">მომავალში Chromium-ის განახლებების მისაღებად დაგჭირდებათ macOS 11 ან უფრო ახალი ვერსია. ეს კომპიუტერი იყენებს macOS 10.15-ს.</translation>
 <translation id="4943838377383847465">Chromium ფონურ რეჟიმშია.</translation>
 <translation id="494490797786467921">დააწკაპუნეთ Chromium-ის შესვლის დიალოგის დასახურად</translation>
 <translation id="4950660488495335294">Chromium პროფილები Chromium-ში არსებული თქვენი კონტენტის განცალკევების საშუალებას გაძლევთ. შექმენით პროფილები ოჯახის წევრებისა და მეგობრებისთვის, ან განაცალკევეთ სამსახურებრივი და პირადი მონაცემები.</translation>
diff --git a/chrome/app/resources/chromium_strings_kk.xtb b/chrome/app/resources/chromium_strings_kk.xtb
index 9081fb5..d61cc64 100644
--- a/chrome/app/resources/chromium_strings_kk.xtb
+++ b/chrome/app/resources/chromium_strings_kk.xtb
@@ -287,7 +287,6 @@
 <translation id="4888717733111232871">mDNS трафигіне рұқсат беретін Chromium кіріс ережесі.</translation>
 <translation id="4893347770495441059">&amp;Chromium-ді жаңарту үшін қайта іске қосу</translation>
 <translation id="4918844574251943176">Сурет көшірілді.</translation>
-<translation id="4942295735032723435">Chromium-нің жаңа нұсқаларын алып тұру үшін macOS 11 не одан кейінгі операциялық жүйе керек болады. Бұл компьютерде macOS 10.15 нұсқасы орнатылған.</translation>
 <translation id="4943838377383847465">Chromium фондық режимде.</translation>
 <translation id="494490797786467921">Chromium-ге кірудің диалогтік терезесін жабу үшін басыңыз.</translation>
 <translation id="4950660488495335294">Chromium профильдері арқылы Chromium-дегі барлық материалыңызды бөле аласыз. Достар мен отбасыңызға арналған немесе жұмысқа не көңіл көтеруге бөлек профильдер жасаңыз.</translation>
@@ -368,7 +367,7 @@
 <translation id="6132897690380286411">Chromium жақын арада жабылып, деректерді жояды</translation>
 <translation id="6145820983052037069">Осы жерде Chromium профильдерін ауыстыра аласыз.</translation>
 <translation id="615103374448673771">Егер cookie файлдарына рұқсат берсеңіз, Chromium оларды алдын ала жүктеу кезінде пайдалануы мүмкін.</translation>
-<translation id="6165508094623778733">Толығырақ</translation>
+<translation id="6165508094623778733">Толық ақпарат</translation>
 <translation id="6173308241973263798">Аккаунттағы Chromium деректерін тазалау</translation>
 <translation id="6174920971222007286">Бұл файл қауіпті болуы мүмкін.<ph name="LINE_BREAK" />Құпия сөзді көрсетсеңіз, Chromium бұл жүктеп алу әрекетін тексере алады. Файл туралы ақпарат Google Safe Browsing қызметіне жіберіледі, бірақ файл контенті мен құпия сөз құрылғыңызда қалады.</translation>
 <translation id="6182736845697986886">Орнатылмады, себебі жаңарту серверінде ішкі қате пайда болды.</translation>
diff --git a/chrome/app/resources/chromium_strings_km.xtb b/chrome/app/resources/chromium_strings_km.xtb
index 7197bd46..5485d545 100644
--- a/chrome/app/resources/chromium_strings_km.xtb
+++ b/chrome/app/resources/chromium_strings_km.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">វិន័យត្រលប់ចូលសម្រាប់ Chromium ដើម្បីអនុញ្ញាតចរាចរណ៍ mDNS។</translation>
 <translation id="4893347770495441059">ចាប់​ផ្តើមឡើងវិញដើម្បីដំឡើងកំណែ &amp;Chromium</translation>
 <translation id="4918844574251943176">បានចម្លង​រូបភាព</translation>
-<translation id="4942295735032723435">ដើម្បីទទួលបានកំណែថ្មីរបស់ Chromium ក្នុងពេលអនាគត អ្នកនឹងត្រូវការ macOS 11 ឬកំណែខ្ពស់ជាងនេះ។ កុំព្យូទ័រនេះកំពុងប្រើ macOS 10.15។</translation>
 <translation id="4943838377383847465">Chromium នៅក្នុងរបៀបផ្ទៃខាងក្រោយ។</translation>
 <translation id="494490797786467921">ចុចដើម្បីបិទប្រអប់ចូលគណនី Chromium</translation>
 <translation id="4950660488495335294">តាមរយៈកម្រង​ព័ត៌មាន Chromium អ្នកអាច​បែងចែក​អ្វីៗទាំងអស់​របស់អ្នក​នៅលើ Chromium បាន។ បង្កើត​កម្រងព័ត៌មាន​សម្រាប់​មិត្តភក្ដិ និង​គ្រួសារ ឬបែងចែក​រវាងការងារ និង​ការកម្សាន្ត។</translation>
diff --git a/chrome/app/resources/chromium_strings_kn.xtb b/chrome/app/resources/chromium_strings_kn.xtb
index 3b07b92..58acd6a8 100644
--- a/chrome/app/resources/chromium_strings_kn.xtb
+++ b/chrome/app/resources/chromium_strings_kn.xtb
@@ -284,7 +284,6 @@
 <translation id="4888717733111232871">mDNS ಟ್ರಾಫಿಕ್‌ಗೆ ಅನುಮತಿಸುವ ನಿಟ್ಟಿನಲ್ಲಿ Chromium ಗೆ ಒಳಬರುವ ನಿಯಮ.</translation>
 <translation id="4893347770495441059">&amp;Chromium ಅಪ್‌ಡೇಟ್ ಮಾಡಲು ಮರುಪ್ರಾರಂಭಿಸಿ</translation>
 <translation id="4918844574251943176">ಚಿತ್ರವನ್ನು ನಕಲಿಸಲಾಗಿದೆ</translation>
-<translation id="4942295735032723435">ಭವಿಷ್ಯದ Chromium ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಪಡೆಯಲು, ನಿಮಗೆ macOS 11 ಅಥವಾ ಅದರ ನಂತರದ ಆವೃತ್ತಿಗಳ ಅಗತ್ಯವಿದೆ. ಈ ಕಂಪ್ಯೂಟರ್ macOS 10.15 ಅನ್ನು ಬಳಸುತ್ತಿದೆ.</translation>
 <translation id="4943838377383847465">Chromium ಹಿನ್ನೆಲೆ ಮೋಡ್‌ನಲ್ಲಿದೆ.</translation>
 <translation id="494490797786467921">Chromium ಸೈನ್ ಇನ್ ಡೈಲಾಗ್ ಅನ್ನು ಮುಚ್ಚಲು ಕ್ಲಿಕ್ ಮಾಡಿ</translation>
 <translation id="4950660488495335294">Chromium ಪ್ರೊಫೈಲ್‌ಗಳನ್ನು ಬಳಸಿಕೊಂಡು Chromium ಗೆ ಸಂಬಂಧಿಸಿದ ನಿಮ್ಮ ಎಲ್ಲಾ ಸಂಗತಿಗಳನ್ನು ನೀವು ಪ್ರತ್ಯೇಕವಾಗಿಸಬಹುದು. ಸ್ನೇಹಿತರು ಮತ್ತು ಕುಟುಂಬದವರಿಗಾಗಿ ಪ್ರೊಫೈಲ್‌ಗಳನ್ನು ರಚಿಸಿ ಅಥವಾ ಕೆಲಸ ಮತ್ತು ಮೋಜಿನ ವಿಷಯಗಳನ್ನು ಪ್ರತ್ಯೇಕವಾಗಿಸಿ.</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb
index 10088ca..c5d382b 100644
--- a/chrome/app/resources/chromium_strings_ko.xtb
+++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -287,7 +287,6 @@
 <translation id="4888717733111232871">Chromium이 mDNS 트래픽을 허용하는 인바운드 규칙입니다.</translation>
 <translation id="4893347770495441059">다시 실행하여 Chromium 업데이트</translation>
 <translation id="4918844574251943176">이미지 복사됨</translation>
-<translation id="4942295735032723435">향후 Chromium 업데이트를 받으려면 macOS 11 이상이 필요합니다. 이 컴퓨터에서는 macOS 10.15를 사용 중입니다.</translation>
 <translation id="4943838377383847465">Chromium이 백그라운드 모드로 실행 중입니다.</translation>
 <translation id="494490797786467921">클릭하여 Chromium 로그인 대화상자 닫기</translation>
 <translation id="4950660488495335294">Chromium 프로필을 사용하면 모든 Chromium 데이터를 분리할 수 있습니다. 친구와 가족을 위한 프로필을 만들거나 업무용과 개인용 프로필을 구분하세요</translation>
diff --git a/chrome/app/resources/chromium_strings_ky.xtb b/chrome/app/resources/chromium_strings_ky.xtb
index 80931cdc..6cb208e 100644
--- a/chrome/app/resources/chromium_strings_ky.xtb
+++ b/chrome/app/resources/chromium_strings_ky.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">mDNS трафигине уруксат берүү үчүн Chromium'дун кирүү эрежеси.</translation>
 <translation id="4893347770495441059">&amp;Chromium'ду жаңыртуу үчүн кайра иштетиңиз</translation>
 <translation id="4918844574251943176">Сүрөт көчүрүлдү</translation>
-<translation id="4942295735032723435">Chromium жаңыртууларын алып туруу үчүн macOS 11 же андан кийинки версиясын орнотушуңуз керек. Бул компьютерде macOS 10.15 версиясы колдонулууда.</translation>
 <translation id="4943838377383847465">Chromium фондук режимде.</translation>
 <translation id="494490797786467921">Chromium'га кирүү диалогун жабуу үчүн басыңыз</translation>
 <translation id="4950660488495335294">Chromium профилдери менен Chromium'дагы маалыматты өзүнчө сактай аласыз. Досторуңуз менен үй-бүлөңүз үчүн профилдерди түзүңүз же жумуш менен эс алууну бири-бири менен аралаштырбаңыз.</translation>
diff --git a/chrome/app/resources/chromium_strings_lo.xtb b/chrome/app/resources/chromium_strings_lo.xtb
index dda6f9c..a85d2d99 100644
--- a/chrome/app/resources/chromium_strings_lo.xtb
+++ b/chrome/app/resources/chromium_strings_lo.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">ກົດລະບຽບຂາເຂົ້າສໍາລັບ Chromium ເພື່ອອະນຸຍາດການຈາລະຈອນ mDNS.</translation>
 <translation id="4893347770495441059">ເລີ່ມເປີດໃຊ້ໃໝ່ເພື່ອອັບເດດ &amp;Chromium</translation>
 <translation id="4918844574251943176">ສຳເນົາຮູບແລ້ວ</translation>
-<translation id="4942295735032723435">ເພື່ອຮັບການອັບເດດ Chromium ໃນອະນາຄົດ, ທ່ານຈະຕ້ອງໃຊ້ macOS 11 ຂຶ້ນໄປ. ຄອມພິວເຕີເຄື່ອງນີ້ກຳລັງໃຊ້ macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium ຢູ່ໃນໂໝດພື້ນຫຼັງ.</translation>
 <translation id="494490797786467921">ຄລິກເພື່ອປິດກ່ອງໂຕ້ຕອບການເຂົ້າສູ່ລະບົບ Chromium</translation>
 <translation id="4950660488495335294">ໂປຣໄຟລ໌ Chromium ຊ່ວຍໃຫ້ທ່ານສາມາດແຍກຂໍ້ມູນທັງໝົດໃນ Chromium ຂອງທ່ານອອກຈາກກັນໄດ້. ສ້າງໂປຣໄຟລ໌ສຳລັບໝູ່ ແລະ ຄອບຄົວ, ຫຼື ແຍກການເຮັດວຽກອອກຈາກຄວາມບັນເທີງ.</translation>
diff --git a/chrome/app/resources/chromium_strings_lt.xtb b/chrome/app/resources/chromium_strings_lt.xtb
index 05fd4d6..520c9c8 100644
--- a/chrome/app/resources/chromium_strings_lt.xtb
+++ b/chrome/app/resources/chromium_strings_lt.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">„Chromium“ skirta taisyklė, pagal kurią leidžiamas mDNS srautas.</translation>
 <translation id="4893347770495441059">Paleisti iš naujo atnaujinant „&amp;Chromium“</translation>
 <translation id="4918844574251943176">Vaizdas nukopijuotas</translation>
-<translation id="4942295735032723435">Jei norite gauti būsimus „Chromium“ naujinius, jums reikės 11 ar naujesnės „macOS“ versijos. Šiame kompiuteryje naudojama 10.15 versijos „macOS“.</translation>
 <translation id="4943838377383847465">„Chromium“ veikia fono režimu.</translation>
 <translation id="494490797786467921">Spustelėkite, kad uždarytumėte „Chromium“ prisijungimo dialogo langą</translation>
 <translation id="4950660488495335294">Naudodami „Chromium“ profilius galite atskirti visus savo „Chromium“ duomenis. Sukurkite profilius draugams ir šeimos nariams arba atskirkite darbą ir pramogas.</translation>
diff --git a/chrome/app/resources/chromium_strings_lv.xtb b/chrome/app/resources/chromium_strings_lv.xtb
index aeed20e..6412421 100644
--- a/chrome/app/resources/chromium_strings_lv.xtb
+++ b/chrome/app/resources/chromium_strings_lv.xtb
@@ -285,7 +285,6 @@
 <translation id="4888717733111232871">Ienākošo savienojumu kārtula pārlūkam Chromium, lai atļautu mDNS datplūsmu.</translation>
 <translation id="4893347770495441059">Atkārtoti palaist, lai atjauninātu &amp;Chromium</translation>
 <translation id="4918844574251943176">Attēls ir nokopēts</translation>
-<translation id="4942295735032723435">Lai saņemtu turpmākus Chromium atjauninājumus, nepieciešama operētājsistēma macOS 11 vai jaunāka versija. Šajā datorā tiek izmantota operētājsistēma macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium darbojas fona režīmā.</translation>
 <translation id="494490797786467921">Noklikšķiniet, lai aizvērtu Chromium pierakstīšanās dialoglodziņu</translation>
 <translation id="4950660488495335294">Izmantojot Chromium profilus, varat nodalīt visu savu Chromium saturu. Izveidojiet profilus draugiem un ģimenes locekļiem vai nodaliet darba un izklaides saturu.</translation>
diff --git a/chrome/app/resources/chromium_strings_mk.xtb b/chrome/app/resources/chromium_strings_mk.xtb
index 979800c..d622237 100644
--- a/chrome/app/resources/chromium_strings_mk.xtb
+++ b/chrome/app/resources/chromium_strings_mk.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">Дојдовно правило за Chromium да дозволи mDNS сообраќај.</translation>
 <translation id="4893347770495441059">Рестартирајте за да се ажурира &amp;Chromium</translation>
 <translation id="4918844574251943176">Сликата е копирана</translation>
-<translation id="4942295735032723435">За да добивате идни ажурирања на Chromium, потребен ви е macOS 11 или понова верзија. Компјутеров користи macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium е во заднински режим.</translation>
 <translation id="494490797786467921">Кликнете за да се затвори дијалогот за најавување на Chromium</translation>
 <translation id="4950660488495335294">Со профилите на Chromium може да ги одделите сите ваши работи на Chromium. Создајте профили за пријателите и семејството или поделете ги меѓу работа и забава.</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb
index 245c9929..65e07530 100644
--- a/chrome/app/resources/chromium_strings_ml.xtb
+++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">mDNS ട്രാഫിക്ക് അനുവദിക്കാൻ Chromium-നുള്ള ഇൻബൗണ്ട് നയം.</translation>
 <translation id="4893347770495441059">&amp;Chromium അപ്‌ഡേറ്റ് ചെയ്യാൻ വീണ്ടും ആരംഭിക്കുക</translation>
 <translation id="4918844574251943176">ചിത്രം പകർത്തി</translation>
-<translation id="4942295735032723435">ഭാവിയിൽ Chromium അപ്ഡേറ്റുകൾ ലഭിക്കാൻ, നിങ്ങൾക്ക് macOS 11 അല്ലെങ്കിൽ അതിന് ശേഷമുള്ള പതിപ്പ് ആവശ്യമാണ്. ഈ കമ്പ്യൂട്ടർ macOS 10.15 ആണ് ഉപയോഗിക്കുന്നത്.</translation>
 <translation id="4943838377383847465">Chromium പശ്ചാത്തല മോഡിലാണ്.</translation>
 <translation id="494490797786467921">Chromium സൈൻ ഇൻ ഡയലോഗ് അടയ്ക്കാൻ ക്ലിക്ക് ചെയ്യുക</translation>
 <translation id="4950660488495335294">Chromium പ്രൊഫൈലുകൾ ഉപയോഗിച്ച് നിങ്ങളുടെ എല്ലാ Chromium ഉള്ളടക്കവും വേർതിരിക്കാം. സുഹൃത്തുക്കൾക്കും കുടുംബത്തിനും വ്യത്യസ്‌ത പ്രൊഫൈലുകൾ സൃഷ്‌ടിക്കുക അല്ലെങ്കിൽ ജോലികാര്യങ്ങളും വിനോദവും പ്രത്യേകമായി തരംതിരിക്കുക.</translation>
diff --git a/chrome/app/resources/chromium_strings_mn.xtb b/chrome/app/resources/chromium_strings_mn.xtb
index 847d533..0ce6e6e 100644
--- a/chrome/app/resources/chromium_strings_mn.xtb
+++ b/chrome/app/resources/chromium_strings_mn.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">MDNS урсгалыг зөвшөөрөхийн тулд Chromium-д зориулсан хөндлөнгийн дүрэм.</translation>
 <translation id="4893347770495441059">&amp;Chromium-г шинэчлэхийн тулд дахин ачаалах</translation>
 <translation id="4918844574251943176">Зургийг хуулсан</translation>
-<translation id="4942295735032723435">Chromium-н цаашдын шинэчлэлтийг авахын тулд танд macOS 11 эсвэл түүнээс хойших хувилбар хэрэгтэй болно. Энэ компьютер macOS 10.15. хувилбарыг ашиглаж байна.</translation>
 <translation id="4943838377383847465">Chromium нь суурь горимд байна.</translation>
 <translation id="494490797786467921">Chromium-н нэвтрэх харилцах цонхыг хаахын тулд товшино уу</translation>
 <translation id="4950660488495335294">Та Chromium профайлаар Chromium-н бүх зүйлээ тусгаарлах боломжтой. Найз, гэр бүлийнхэндээ зориулж профайл үүсгэх эсвэл ажил, зугааг ялгаж салгаарай.</translation>
diff --git a/chrome/app/resources/chromium_strings_mr.xtb b/chrome/app/resources/chromium_strings_mr.xtb
index 5049b0b..fa09751 100644
--- a/chrome/app/resources/chromium_strings_mr.xtb
+++ b/chrome/app/resources/chromium_strings_mr.xtb
@@ -287,7 +287,6 @@
 <translation id="4888717733111232871">mDNS रहदारीस अनुमती देण्यासाठी Chromium साठी अंतर्गामी नियम.</translation>
 <translation id="4893347770495441059">&amp;Chromium अपडेट करण्यासाठी पुन्हा लाँच करा</translation>
 <translation id="4918844574251943176">इमेज कॉपी केली</translation>
-<translation id="4942295735032723435">भविष्यातील Chromium अपडेट मिळवण्यासाठी, तुमच्याकडे macOS 11 किंवा त्यावरील आवृत्ती असणे आवश्यक आहे. हा कॉंप्युटर macOS 10.15 वापरत आहे.</translation>
 <translation id="4943838377383847465">Chromium पार्श्वभूमी मोड मध्ये आहे.</translation>
 <translation id="494490797786467921">Chromium साइन-इन डायलॉग बंद करण्यासाठी क्लिक करा</translation>
 <translation id="4950660488495335294">Chromium प्रोफाइल वापरून तुम्ही तुमच्या Chromium शी संबंधित सर्व गोष्टींची विभागणी करू शकता. मित्रमैत्रिणी आणि कुटुंबासाठी प्रोफाइल तयार करा किंवा त्यांची काम व मनोरंजन यामध्ये विभागणी करा.</translation>
diff --git a/chrome/app/resources/chromium_strings_ms.xtb b/chrome/app/resources/chromium_strings_ms.xtb
index 61185d4..b2c7429e 100644
--- a/chrome/app/resources/chromium_strings_ms.xtb
+++ b/chrome/app/resources/chromium_strings_ms.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">Peraturan masuk bagi Chromium untuk membolehkan trafik mDNS.</translation>
 <translation id="4893347770495441059">Lancarkan Semula untuk Mengemas Kini &amp;Chromium</translation>
 <translation id="4918844574251943176">Imej disalin</translation>
-<translation id="4942295735032723435">Untuk mendapatkan kemaskinian Chromium yang akan datang, anda memerlukan macOS 11 atau yang lebih baharu. Komputer ini menggunakan macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium dalam mod latar belakang.</translation>
 <translation id="494490797786467921">Klik untuk menutup dialog log masuk Chromium</translation>
 <translation id="4950660488495335294">Dengan profil Chromium, anda dapat mengasingkan semua bahan Chromium anda. Buat profil untuk rakan dan keluarga atau asingkan pekerjaan daripada keseronokan.</translation>
diff --git a/chrome/app/resources/chromium_strings_my.xtb b/chrome/app/resources/chromium_strings_my.xtb
index acb1d386..34a756d 100644
--- a/chrome/app/resources/chromium_strings_my.xtb
+++ b/chrome/app/resources/chromium_strings_my.xtb
@@ -289,7 +289,6 @@
 <translation id="4888717733111232871">Chromium အတွက် mDNS သွားလာမှု ခွင့်ပြုရေး အဝင် စည်းကမ်းချက်</translation>
 <translation id="4893347770495441059">&amp;Chromium အပ်ဒိတ်လုပ်ရန် ပြန်ဖွင့်ပါ</translation>
 <translation id="4918844574251943176">ပုံကူးပြီးပြီ</translation>
-<translation id="4942295735032723435">နောက်ပိုင်းထွက်မည့် Chromium အပ်ဒိတ်များ ရယူရန် macOS 11 နှင့်အထက် လိုအပ်မည်။ ဤကွန်ပျူတာက macOS 10.15 သုံးနေသည်။</translation>
 <translation id="4943838377383847465">Chromium သည် နောက်ခံ မုဒ်ထဲမှာ ရှိနေသည်။</translation>
 <translation id="494490797786467921">Chromium လက်မှတ်ထိုးဝင်ခြင်း ဒိုင်ယာလော့ကို ပိတ်ရန် နှိပ်ပါ</translation>
 <translation id="4950660488495335294">သင်၏ Chromium လုပ်ဆောင်ချက်အားလုံးကို Chromium ပရိုဖိုင်များဖြင့် သီးသန့်ခွဲခြားနိုင်သည်။ မိသားစုနှင့် မိတ်ဆွေများအတွက် ပရိုဖိုင်များ ပြုလုပ်ပါ (သို့) အလုပ်နှင့် ပျော်စရာအကြား ခွဲခြားအသုံးပြုပါ။</translation>
diff --git a/chrome/app/resources/chromium_strings_ne.xtb b/chrome/app/resources/chromium_strings_ne.xtb
index df0d742a..989a5b5a2 100644
--- a/chrome/app/resources/chromium_strings_ne.xtb
+++ b/chrome/app/resources/chromium_strings_ne.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">mDNS ट्राफिक अनुमति दिन Chromium को लागि इन्बाउन्ड नियम।</translation>
 <translation id="4893347770495441059">&amp;Chromium अपडेट गर्न पुनः सुरु गर्नुहोस्</translation>
 <translation id="4918844574251943176">फोटो कपी गरिएको छ</translation>
-<translation id="4942295735032723435">तपाईंको कम्प्युटरमा macOS ११ वा सोभन्दा नयाँ संस्करण इन्स्टल गरिएको छ भने मात्र तपाईं भविष्यमा Chromium का अपडेट प्राप्त गर्नुहुन्छ। यो कम्प्युटरमा macOS १०.१५ प्रयोग भइरहेको छ।</translation>
 <translation id="4943838377383847465">Chromium पृष्ठभूमि मोडमा छ।</translation>
 <translation id="494490797786467921">Chromium मा साइन इन गर्ने डायलग बन्द गर्न क्लिक गर्नुहोस्</translation>
 <translation id="4950660488495335294">तपाईं Chromium प्रोफाइलहरू प्रयोग गरी Chromium मा भएका आफ्ना सबै कुराहरू छुट्याएर राख्न सक्नुहुन्छ। साथीभाइ तथा परिवारका सदस्यहरूका लागि अलग्गै प्रोफाइल बनाइदिनुहोस् वा काम तथा मनोरञ्जनसँग सम्बन्धित कुराहरू छुट्याएर राख्नुहोस्।</translation>
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb
index c2c3698..e14dd72 100644
--- a/chrome/app/resources/chromium_strings_nl.xtb
+++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -287,7 +287,6 @@
 <translation id="4888717733111232871">Inkomende regel zodat Chromium mDNS-verkeer toestaat.</translation>
 <translation id="4893347770495441059">Opnieuw starten om &amp;Chromium te updaten</translation>
 <translation id="4918844574251943176">Afbeelding gekopieerd</translation>
-<translation id="4942295735032723435">Als je toekomstige Chromium-updates wilt krijgen, heb je macOS 11 of hoger nodig. Deze computer gebruikt macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium bevindt zich in de achtergrondmodus.</translation>
 <translation id="494490797786467921">Klik om het inlogdialoogvenster van Chromium te sluiten</translation>
 <translation id="4950660488495335294">Met Chromium-profielen kun je alle Chromium-gegevens gescheiden houden. Maak profielen voor vrienden en familie of maak onderscheid tussen werk en privé.</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb
index 9c510b1..17c2770 100644
--- a/chrome/app/resources/chromium_strings_no.xtb
+++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">Regel om innkommende trafikk for Chromium for å tillate mDNS-trafikk.</translation>
 <translation id="4893347770495441059">Start på nytt for å oppdatere &amp;Chromium</translation>
 <translation id="4918844574251943176">Bildet er kopiert</translation>
-<translation id="4942295735032723435">For å få fremtidige Chromium-oppdateringer må du ha macOS 11 eller nyere. Denne datamaskinen bruker macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium er i bakgrunnsmodus.</translation>
 <translation id="494490797786467921">Klikk for å lukke dialogboksen for Chromium-pålogging</translation>
 <translation id="4950660488495335294">Med Chromium-profiler kan du holde alle Chromium-tingene dine atskilt. Opprett profiler for venner og familie, eller skill mellom jobb og fritid.</translation>
diff --git a/chrome/app/resources/chromium_strings_or.xtb b/chrome/app/resources/chromium_strings_or.xtb
index 0af1469f..b64d4bb3 100644
--- a/chrome/app/resources/chromium_strings_or.xtb
+++ b/chrome/app/resources/chromium_strings_or.xtb
@@ -287,7 +287,6 @@
 <translation id="4888717733111232871">Chromium ପାଇଁ mDNS ଟ୍ରାଫିକ୍‍କୁ ଅନୁମତି ଦେବା Chromiumରେ ଅନ୍ତର୍ନିହିତ ଥିବା ନିୟମ।</translation>
 <translation id="4893347770495441059">&amp;Chromium ଅପଡେଟ୍ କରିବା ପାଇଁ ପୁଣି ଲଞ୍ଚ କରନ୍ତୁ</translation>
 <translation id="4918844574251943176">ଇମେଜ କପି କରାଯାଇଛି</translation>
-<translation id="4942295735032723435">ଭବିଷ୍ୟତରେ Chromiumର ଅପଡେଟଗୁଡ଼ିକ ପାଇବା ପାଇଁ ଆପଣଙ୍କୁ macOS 11 କିମ୍ବା ତା'ପରର ଭର୍ସନ ଆବଶ୍ୟକ ହେବ। ଏହି କମ୍ପ୍ୟୁଟରରେ macOS 10.15 ଭର୍ସନ ବ୍ୟବହାର କରାଯାଉଛି।</translation>
 <translation id="4943838377383847465">Chromium ପୃଷ୍ଠପଟ ମୋଡ୍‌ରେ ଅଛି।</translation>
 <translation id="494490797786467921">Chromium ସାଇନ-ଇନ ଡାଏଲଗକୁ ବନ୍ଦ କରିବା ପାଇଁ କ୍ଲିକ କରନ୍ତୁ</translation>
 <translation id="4950660488495335294">Chromium ପ୍ରୋଫାଇଲ ସାହାଯ୍ୟରେ ଆପଣ ଆପଣଙ୍କ ସମସ୍ତ ସାମଗ୍ରୀକୁ Chromiumରେ ଅଲଗା କରିପାରିବେ। ଆପଣଙ୍କ ସାଙ୍ଗ ଏବଂ ପରିବାର ପାଇଁ ପ୍ରୋଫାଇଲ ତିଆରି କରନ୍ତୁ କିମ୍ବା କାର୍ଯ୍ୟ ଏବଂ ମଜା ମଧ୍ୟରେ ବିଭାଜିତ କରନ୍ତୁ।</translation>
diff --git a/chrome/app/resources/chromium_strings_pa.xtb b/chrome/app/resources/chromium_strings_pa.xtb
index b2dc74f..eacd05e 100644
--- a/chrome/app/resources/chromium_strings_pa.xtb
+++ b/chrome/app/resources/chromium_strings_pa.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">mDNS ਟ੍ਰੈਫਿਕ ਦੀ ਆਗਿਆ ਦੇਣ ਲਈ Chromium ਲਈ ਇਨਬਾਊਂਡ ਨਿਯਮ।</translation>
 <translation id="4893347770495441059">&amp;Chromium ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਲਈ ਮੁੜ-ਲਾਂਚ ਕਰੋ</translation>
 <translation id="4918844574251943176">ਚਿੱਤਰ ਕਾਪੀ ਕੀਤਾ ਗਿਆ</translation>
-<translation id="4942295735032723435">Chromium ਸੰਬੰਧੀ ਭਵਿੱਖੀ ਅੱਪਡੇਟ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ macOS 11 ਜਾਂ ਇਸ ਤੋਂ ਬਾਅਦ ਵਾਲੇ ਵਰਜਨ ਦੀ ਲੋੜ ਪਵੇਗੀ। ਇਸ ਕੰਪਿਊਟਰ 'ਤੇ macOS 10.15 ਵਰਜਨ ਵਰਤਿਆ ਜਾ ਰਿਹਾ ਹੈ।</translation>
 <translation id="4943838377383847465">Chromium ਪਿਛੋਕੜ ਮੋਡ ਵਿੱਚ ਹੈ।</translation>
 <translation id="494490797786467921">Chromium ਦੀ ਸਾਈਨ-ਇਨ ਵਿੰਡੋ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ ਕਲਿੱਕ ਕਰੋ</translation>
 <translation id="4950660488495335294">Chromium ਪ੍ਰੋਫਾਈਲਾਂ ਨਾਲ ਤੁਸੀਂ ਆਪਣੀ ਸਾਰੀ Chromium ਸਮੱਗਰੀ ਨੂੰ ਵੱਖ ਕਰ ਸਕਦੇ ਹੋ। ਦੋਸਤਾਂ ਅਤੇ ਪਰਿਵਾਰ ਲਈ ਪ੍ਰੋਫਾਈਲਾਂ ਬਣਾਓ ਜਾਂ ਕੰਮ ਅਤੇ ਮੌਜ-ਮਸਤੀ ਲਈ ਵੱਖ-ਵੱਖ ਪ੍ਰੋਫਾਈਲਾਂ ਬਣਾਓ।</translation>
diff --git a/chrome/app/resources/chromium_strings_pl.xtb b/chrome/app/resources/chromium_strings_pl.xtb
index b68b41a..e70cb05 100644
--- a/chrome/app/resources/chromium_strings_pl.xtb
+++ b/chrome/app/resources/chromium_strings_pl.xtb
@@ -283,7 +283,6 @@
 <translation id="4888717733111232871">Reguła dla ruchu przychodzącego w Chromium zezwalająca na ruch mDNS.</translation>
 <translation id="4893347770495441059">Uruchom ponownie, aby zaktualizować &amp;Chromium</translation>
 <translation id="4918844574251943176">Zdjęcie zostało skopiowane</translation>
-<translation id="4942295735032723435">Aby otrzymywać w przyszłości aktualizacje Chromium, musisz mieć system macOS 11 lub nowszy. Na tym komputerze jest zainstalowany system macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium jest w trybie działania w tle</translation>
 <translation id="494490797786467921">Kliknij, aby zamknąć okno logowania się w Chromium</translation>
 <translation id="4950660488495335294">Dzięki profilom Chromium wszystkie swoje dane z tej przeglądarki możesz przechowywać osobno. Utwórz profile dla znajomych i rodziny albo oddziel pracę od rozrywki.</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-BR.xtb b/chrome/app/resources/chromium_strings_pt-BR.xtb
index f5d77a59..98d07c3b 100644
--- a/chrome/app/resources/chromium_strings_pt-BR.xtb
+++ b/chrome/app/resources/chromium_strings_pt-BR.xtb
@@ -284,7 +284,6 @@
 <translation id="4888717733111232871">Regra interna para que o Chromium permita tráfego mDNS.</translation>
 <translation id="4893347770495441059">Reinicializar para atualizar o &amp;Chromium</translation>
 <translation id="4918844574251943176">Imagem copiada</translation>
-<translation id="4942295735032723435">Para receber as próximas atualizações do Chromium, você vai precisar do macOS 11 ou mais recente. Este computador está usando o macOS 10.15.</translation>
 <translation id="4943838377383847465">O Chromium está em modo de segundo plano.</translation>
 <translation id="494490797786467921">Clique para fechar a caixa de diálogo de login do Chromium</translation>
 <translation id="4950660488495335294">Você pode usar os perfis do Chromium para separar todos seus dados nele. Crie perfis para amigos e familiares ou separe trabalho de lazer.</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-PT.xtb b/chrome/app/resources/chromium_strings_pt-PT.xtb
index 59e86e9..01af8e1 100644
--- a/chrome/app/resources/chromium_strings_pt-PT.xtb
+++ b/chrome/app/resources/chromium_strings_pt-PT.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">Regra de importação para o Chromium permitir o tráfego mDNS.</translation>
 <translation id="4893347770495441059">Reiniciar para atualizar o &amp;Chromium</translation>
 <translation id="4918844574251943176">Imagem copiada</translation>
-<translation id="4942295735032723435">Para receber atualizações futuras do Chromium, precisa do macOS 11 ou posterior. Este computador está a usar o macOS 10.15.</translation>
 <translation id="4943838377383847465">O Chromium está no modo em segundo plano.</translation>
 <translation id="494490797786467921">Clicar para fechar a caixa de diálogo de início de sessão do Chromium</translation>
 <translation id="4950660488495335294">Com os perfis do Chromium, pode separar todos os seus itens do Chromium. Crie perfis para amigos e familiares ou separe o trabalho da diversão.</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb
index 8e73392..ac6cfd1a 100644
--- a/chrome/app/resources/chromium_strings_ro.xtb
+++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">Regula de intrare pentru Chromium pentru a permite traficul mDNS.</translation>
 <translation id="4893347770495441059">Relansează pentru a actualiza &amp;Chromium</translation>
 <translation id="4918844574251943176">Imaginea a fost copiată</translation>
-<translation id="4942295735032723435">Pentru a primi actualizările Chromium viitoare, vei avea nevoie de macOS 11 sau o versiune ulterioară. Acest computer folosește macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium este în modul fundal.</translation>
 <translation id="494490797786467921">Dă clic pentru a închide dialogul de conectare la Chromium</translation>
 <translation id="4950660488495335294">Cu ajutorul profilurilor Chromium, poți separa toate informațiile din Chromium. Creează profiluri pentru prieteni și familie sau pentru muncă și timp liber.</translation>
diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb
index b4be61f..5e87f5a 100644
--- a/chrome/app/resources/chromium_strings_ru.xtb
+++ b/chrome/app/resources/chromium_strings_ru.xtb
@@ -283,7 +283,6 @@
 <translation id="4888717733111232871">Разрешить в Chromium передачу входящего трафика по протоколу mDNS</translation>
 <translation id="4893347770495441059">Перезапустить для обновления &amp;Chromium</translation>
 <translation id="4918844574251943176">Изображение скопировано.</translation>
-<translation id="4942295735032723435">На вашем устройстве используется macOS 10.15. Чтобы получать обновления Chromium, установите macOS 11 или более поздней версии.</translation>
 <translation id="4943838377383847465">Chromium работает в фоновом режиме</translation>
 <translation id="494490797786467921">Нажмите, чтобы закрыть диалоговое окно входа в Chromium</translation>
 <translation id="4950660488495335294">Профили Chromium нужны для раздельного использования браузера, например разными людьми или в разных целях.</translation>
diff --git a/chrome/app/resources/chromium_strings_si.xtb b/chrome/app/resources/chromium_strings_si.xtb
index 0abd85b..476fa09 100644
--- a/chrome/app/resources/chromium_strings_si.xtb
+++ b/chrome/app/resources/chromium_strings_si.xtb
@@ -287,7 +287,6 @@
 <translation id="4888717733111232871">Chromium සඳහා අභ්‍යන්තර නියෝගය mDNS තදබදය ඉඩ දීමයි.</translation>
 <translation id="4893347770495441059">&amp;Chromium යාවත්කාලීන කිරීමට යළි දියත් කරන්න</translation>
 <translation id="4918844574251943176">රූපය පිටපත් කරන ලදි</translation>
-<translation id="4942295735032723435">අනාගත Chromium යාවත්කාලීන ලබා ගැනීමට, ඔබට macOS 11 හෝ පසු අනුවාද අවශ්‍ය වෙයි. මෙම පරිගණකය macOS 10.15 භාවිත කරයි.</translation>
 <translation id="4943838377383847465">Chromium පසුබිම් ප්‍රකාරය තුළ ඇත.</translation>
 <translation id="494490797786467921">Chromium පුරනය වීමේ සංවාදය වැසීමට ක්ලික් කරන්න</translation>
 <translation id="4950660488495335294">Chromium පැතිකඩවල් සමඟ ඔබට ඔබේ සියලු Chromium දේවල් වෙන් කළ හැක. මිතුරන් සහ පවුලේ අය සඳහා පැතිකඩ තනන්න, නැතහොත් රැකියාව සහ විනෝදය අතර බෙදන්න.</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb
index 9b4b6ada..2c037e4 100644
--- a/chrome/app/resources/chromium_strings_sk.xtb
+++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -287,7 +287,6 @@
 <translation id="4888717733111232871">Pravidlo pre prichádzajúce prenosy pre prehliadač Chromium, ktoré povoľuje prenos dát mDNS.</translation>
 <translation id="4893347770495441059">Znova spustiť a aktualizovať Chromium</translation>
 <translation id="4918844574251943176">Obrázok bol skopírovaný</translation>
-<translation id="4942295735032723435">Ak chcete dostávať budúce aktualizácie prehliadača Chromium, musíte používať systém macOS 11 alebo novší. V tomto počítači používate macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium je v režime na pozadí.</translation>
 <translation id="494490797786467921">Kliknutím zavriete dialógové okno prihlásenia do prehliadača Chromium</translation>
 <translation id="4950660488495335294">Profilmi prehliadača Chromium môžete oddeliť všetok svoj obsah v prehliadači Chromium. Vytvorte profily pre rodinu aj priateľov alebo si rozdeľte obsah na prácu a zábavu.</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb
index 2fc3898a..feed811 100644
--- a/chrome/app/resources/chromium_strings_sl.xtb
+++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">Pravilo za dohodni promet za Chromium, ki omogoča promet mDNS.</translation>
 <translation id="4893347770495441059">Znova zaženite, če želite posodobiti &amp;Chromium</translation>
 <translation id="4918844574251943176">Slika je kopirana</translation>
-<translation id="4942295735032723435">Če želite prejemati prihodnje posodobitve Chromiuma, potrebujete macOS 11 ali novejšo različico. V tem računalniku je nameščen macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium se izvaja v ozadju.</translation>
 <translation id="494490797786467921">Kliknite, če želite zapreti pogovorno okno za prijavo v Chromium</translation>
 <translation id="4950660488495335294">S profili v Chromiumu lahko ločite vse stvari v Chromiumu. Ustvarite profile za prijatelje in svojce ali ustvarite ločene za delo in zabavo.</translation>
diff --git a/chrome/app/resources/chromium_strings_sq.xtb b/chrome/app/resources/chromium_strings_sq.xtb
index bbc3b8f..5ea8e63 100644
--- a/chrome/app/resources/chromium_strings_sq.xtb
+++ b/chrome/app/resources/chromium_strings_sq.xtb
@@ -287,7 +287,6 @@
 <translation id="4888717733111232871">Rregulli hyrës për Chromium për të lejuar trafikun mDNS.</translation>
 <translation id="4893347770495441059">Nise përsëri për të përditësuar &amp;Chromium</translation>
 <translation id="4918844574251943176">Imazhi u kopjua</translation>
-<translation id="4942295735032723435">Për të marrë përditësimet e ardhshme të Chromium, do të të duhet macOS 11 ose një version i mëvonshëm. Ky kompjuter përdor macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium është në modalitetin e sfondit.</translation>
 <translation id="494490797786467921">Kliko për të mbyllur dialogun e identifikimit në Chromium</translation>
 <translation id="4950660488495335294">Me profilet e Chromium, mund t'i ndash të gjitha gjërat e tua të Chromium. Krijo profile për miqtë dhe familjen ose ndaje punën nga argëtimi.</translation>
diff --git a/chrome/app/resources/chromium_strings_sr-Latn.xtb b/chrome/app/resources/chromium_strings_sr-Latn.xtb
index ea31554..34fbe25 100644
--- a/chrome/app/resources/chromium_strings_sr-Latn.xtb
+++ b/chrome/app/resources/chromium_strings_sr-Latn.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">Pravilo za dolazni saobraćaj za Chromium da bi se omogućio mDNS saobraćaj.</translation>
 <translation id="4893347770495441059">Ponovo pokreni da bi se &amp;Chromium ažurirao</translation>
 <translation id="4918844574251943176">Slika je kopirana</translation>
-<translation id="4942295735032723435">Da biste dobijali buduća Chromium ažuriranja, treba vam macOS 11 ili novija verzija. Ovaj računar koristi macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium je u pozadinskom režimu.</translation>
 <translation id="494490797786467921">Kliknite da biste zatvorili dijalog za prijavljivanje u Chromium</translation>
 <translation id="4950660488495335294">Pomoću Chromium profila možete da razdvojite sve Chromium sadržaje. Napravite profile za prijatelje i porodicu ili razdvojite posao i zabavu.</translation>
diff --git a/chrome/app/resources/chromium_strings_sr.xtb b/chrome/app/resources/chromium_strings_sr.xtb
index a1219421..9a51b51 100644
--- a/chrome/app/resources/chromium_strings_sr.xtb
+++ b/chrome/app/resources/chromium_strings_sr.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">Правило за долазни саобраћај за Chromium да би се омогућио mDNS саобраћај.</translation>
 <translation id="4893347770495441059">Поново покрени да би се &amp;Chromium ажурирао</translation>
 <translation id="4918844574251943176">Слика је копирана</translation>
-<translation id="4942295735032723435">Да бисте добијали будућа Chromium ажурирања, треба вам macOS 11 или новија верзија. Овај рачунар користи macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium је у позадинском режиму.</translation>
 <translation id="494490797786467921">Кликните да бисте затворили дијалог за пријављивање у Chromium</translation>
 <translation id="4950660488495335294">Помоћу Chromium профила можете да раздвојите све Chromium садржаје. Направите профиле за пријатеље и породицу или раздвојите посао и забаву.</translation>
diff --git a/chrome/app/resources/chromium_strings_sv.xtb b/chrome/app/resources/chromium_strings_sv.xtb
index 4463c82b..640adb6f 100644
--- a/chrome/app/resources/chromium_strings_sv.xtb
+++ b/chrome/app/resources/chromium_strings_sv.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">Regel som tillåter inkommande mDNS-trafik för Chromium.</translation>
 <translation id="4893347770495441059">Starta om för att uppdatera &amp;Chromium</translation>
 <translation id="4918844574251943176">Bilden har kopierats</translation>
-<translation id="4942295735032723435">Du behöver macOS 11 eller senare för att få framtida uppdateringar av Chromium. På den här datorn används macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium körs i bakgrundsläge.</translation>
 <translation id="494490797786467921">Klicka för att stänga inloggningsdialogrutan för Chromium</translation>
 <translation id="4950660488495335294">Du kan hålla dina saker i Chromium åtskilda med hjälp av Chromium-profiler. Skapa profiler för vänner och familjemedlemmar eller dela upp jobb och nöje.</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb
index bfdee95..ea5ac2c 100644
--- a/chrome/app/resources/chromium_strings_sw.xtb
+++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -288,7 +288,6 @@
 <translation id="4888717733111232871">Sheria ya ndani ya Chromium ili kuruhusu trafiki ya mDNS.</translation>
 <translation id="4893347770495441059">Fungua tena ili Usasishe &amp;Chromium</translation>
 <translation id="4918844574251943176">Picha imenakiliwa</translation>
-<translation id="4942295735032723435">Utahitaji toleo la macOS 11 au toleo jipya zaidi ili upate masasisho ya Chromium ya siku zijazo. Kompyuta hii inatumia toleo la macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium iko katika hali ya chini chini.</translation>
 <translation id="494490797786467921">Bofya ili ufunge kidirisha cha kuingia katika Chromium</translation>
 <translation id="4950660488495335294">Ukitumia wasifu kwenye Chromium, unaweza kutenganisha vipengee vyako vyote vya Chromium. Unda wasifu wa marafiki na familia au utenganishe kazi na burudani.</translation>
diff --git a/chrome/app/resources/chromium_strings_ta.xtb b/chrome/app/resources/chromium_strings_ta.xtb
index cea6f97..816e7d6a 100644
--- a/chrome/app/resources/chromium_strings_ta.xtb
+++ b/chrome/app/resources/chromium_strings_ta.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">mDNS ட்ராஃபிக்கை அனுமதிப்பதற்கான, Chromium க்கான உள்வரும் விதி.</translation>
 <translation id="4893347770495441059">&amp;Chromiumமைப் புதுப்பிக்க மீண்டும் தொடங்கு</translation>
 <translation id="4918844574251943176">படம் நகலெடுக்கப்பட்டது</translation>
-<translation id="4942295735032723435">இனிவரும் Chromium புதுப்பிப்புகளைப் பெற macOS 11 அல்லது அதற்குப் பிந்தைய பதிப்பு தேவை. இந்தக் கம்ப்யூட்டர் macOS 10.15 பதிப்பைப் பயன்படுத்துகிறது.</translation>
 <translation id="4943838377383847465">Chromium பின்புல பயன்முறையில் இயங்குகிறது.</translation>
 <translation id="494490797786467921">Chromium உள்நுழைவு உரையாடலை மூட இதைக் கிளிக் செய்யவும்</translation>
 <translation id="4950660488495335294">Chromium சுயவிவரங்களைப் பயன்படுத்தி உங்கள் Chromium தொடர்பான எல்லாவற்றையும் தனித்தனியாக வைத்துக்கொள்ளலாம். நண்பர்களுக்காகவும் குடும்பத்திற்காகவும் சுயவிவரங்களை உருவாக்கலாம் அல்லது பணி, பொழுதுபோக்கு போன்றவற்றுக்கு அவற்றைத் தனித்தனியாக வைத்துக்கொள்ளலாம்.</translation>
diff --git a/chrome/app/resources/chromium_strings_te.xtb b/chrome/app/resources/chromium_strings_te.xtb
index aabc114..f8dcd60 100644
--- a/chrome/app/resources/chromium_strings_te.xtb
+++ b/chrome/app/resources/chromium_strings_te.xtb
@@ -284,7 +284,6 @@
 <translation id="4888717733111232871">mDNS ట్రాఫిక్‌ను అనుమతించడానికి Chromium ఇన్‌బౌండ్ నియమం.</translation>
 <translation id="4893347770495441059">&amp;Chromiumను అప్‌డేట్ చేయడానికి రీ-లాంచ్ చేయండి</translation>
 <translation id="4918844574251943176">ఇమేజ్ కాపీ చేయబడింది</translation>
-<translation id="4942295735032723435">భవిష్యత్తులో Chromium అప్‌డేట్‌లను పొందడానికి, మీకు macOS 11 లేదా ఆ తర్వాతి వెర్షన్ అవసరం అవుతుంది. ఈ కంప్యూటర్ macOS 10.15 వెర్షన్‌ను ఉపయోగిస్తోంది.</translation>
 <translation id="4943838377383847465">Chromium నేపథ్య మోడ్‌లో ఉంది.</translation>
 <translation id="494490797786467921">క్లిక్ చేసి, Chromium సైన్ ఇన్ డైలాగ్‌ను మూసివేయండి</translation>
 <translation id="4950660488495335294">Chromium ప్రొఫైళ్లతో, మీ Chromium సంబంధిత అంశాలన్నింటినీ విభజించవచ్చు. ఫ్రెండ్స్, ఫ్యామిలీ కోసం ప్రొఫైళ్లను క్రియేట్ చేయండి, లేదా ఆఫీస్, వినోదం మధ్య ప్రొఫైళ్లను విభజించి ఉపయోగించండి.</translation>
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb
index 00d7725b..cf15d4a5 100644
--- a/chrome/app/resources/chromium_strings_th.xtb
+++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -285,7 +285,6 @@
 <translation id="4888717733111232871">กฎขาเข้าสำหรับ Chromium เพื่ออนุญาตการเข้าชมแบบ mDNS</translation>
 <translation id="4893347770495441059">เปิดอีกครั้งเพื่ออัปเดต Chromium</translation>
 <translation id="4918844574251943176">คัดลอกรูปภาพแล้ว</translation>
-<translation id="4942295735032723435">คุณจะต้องใช้ macOS 11 ขึ้นไปเพื่อรับการอัปเดต Chromium ในอนาคต คอมพิวเตอร์เครื่องนี้ใช้ macOS 10.15</translation>
 <translation id="4943838377383847465">Chromium กำลังอยู่ในโหมดทำงานในพื้นหลัง</translation>
 <translation id="494490797786467921">คลิกเพื่อปิดกล่องโต้ตอบการลงชื่อเข้าใช้ Chromium</translation>
 <translation id="4950660488495335294">โปรไฟล์ Chromium ช่วยให้คุณแยกข้อมูลต่างๆ ใน Chromium ออกจากกันได้ สร้างโปรไฟล์สำหรับเพื่อนและครอบครัว หรือแยกการทำงานออกจากความบันเทิง</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb
index 29404e5c..07bd7616 100644
--- a/chrome/app/resources/chromium_strings_tr.xtb
+++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -283,7 +283,6 @@
 <translation id="4888717733111232871">Chromium'un mDNS trafiğine izin vermeyi sağlayan gelen trafik kuralı.</translation>
 <translation id="4893347770495441059">&amp;Chromium'u Güncellemek İçin Yeniden Başlat</translation>
 <translation id="4918844574251943176">Resim kopyalandı</translation>
-<translation id="4942295735032723435">Gelecekteki Chromium güncellemelerini almak için macOS 11 veya sonraki bir sürümün yüklü olması gerekir. Bu bilgisayar macOS 10.15 kullanıyor.</translation>
 <translation id="4943838377383847465">Chromium arka plan modunda.</translation>
 <translation id="494490797786467921">Chromium'da oturum açma iletişim kutusunu kapatmak için tıklayın</translation>
 <translation id="4950660488495335294">Chromium profilleri ile tüm Chromium öğelerinizi ayırabilirsiniz. Arkadaşlar ve aile için profil oluşturun veya iş ile eğlenceyi ayırın.</translation>
diff --git a/chrome/app/resources/chromium_strings_uk.xtb b/chrome/app/resources/chromium_strings_uk.xtb
index 6dabf11..c052e0a3 100644
--- a/chrome/app/resources/chromium_strings_uk.xtb
+++ b/chrome/app/resources/chromium_strings_uk.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">Вхідне правило для Chromium дозволяє трафік mDNS.</translation>
 <translation id="4893347770495441059">Перезапустити, щоб оновити &amp;Chromium</translation>
 <translation id="4918844574251943176">Зображення скопійовано</translation>
-<translation id="4942295735032723435">Щоб отримувати майбутні оновлення Chromium, потрібна операційна система macOS 11 або новішої версії. На цьому комп’ютері встановлено macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium у фоновому режимі.</translation>
 <translation id="494490797786467921">Натисніть, щоб закрити вікно входу в Chromium</translation>
 <translation id="4950660488495335294">Створюйте різні профілі Chromium для різних цілей (наприклад, робочий і особистий) та для різних людей (як-от друзів і членів сім’ї).</translation>
diff --git a/chrome/app/resources/chromium_strings_ur.xtb b/chrome/app/resources/chromium_strings_ur.xtb
index de02fce..120a7d0 100644
--- a/chrome/app/resources/chromium_strings_ur.xtb
+++ b/chrome/app/resources/chromium_strings_ur.xtb
@@ -287,7 +287,6 @@
 <translation id="4888717733111232871">‏mDNS ٹریفک کی اجازت دینے کیلئے Chromium کیلئے ان باؤنڈ اصول۔</translation>
 <translation id="4893347770495441059">‏Chromium&amp; کو اپ ڈیٹ کرنے کیلئے بند کر کے دوبارہ چلائیں</translation>
 <translation id="4918844574251943176">تصویر کاپی ہو گئی</translation>
-<translation id="4942295735032723435">‏مستقبل میں Chromium اپ ڈیٹس حاصل کرنے کے لیے آپ کو macOS 11 یا اس کے بعد کے ورژن کی ضرورت ہوگی۔ یہ کمپیوٹر macOS 10.15 کا استعمال کر رہا ہے۔</translation>
 <translation id="4943838377383847465">‏Chromium پس منظر وضع میں ہے۔</translation>
 <translation id="494490797786467921">‏‫Chromium سائن ان ڈائیلاگ بند کرنے کیلئے کلک کریں</translation>
 <translation id="4950660488495335294">‏‫Chromium کی پروفائلز کی مدد سے، آپ Chromium کی اپنی سبھی چیزوں کو الگ کر سکتے ہیں۔ دوستوں اور فیملی کیلئے پروفائلز تخلیق کریں یا کام اور تفریح کو الگ کریں۔</translation>
diff --git a/chrome/app/resources/chromium_strings_uz.xtb b/chrome/app/resources/chromium_strings_uz.xtb
index 50b1143c..495eb723 100644
--- a/chrome/app/resources/chromium_strings_uz.xtb
+++ b/chrome/app/resources/chromium_strings_uz.xtb
@@ -283,7 +283,6 @@
 <translation id="4888717733111232871">Chromium‘ga kiruvchi trafikni mDNS protokoli orqali uzatishga ruxsat berish</translation>
 <translation id="4893347770495441059">&amp;Chromium brauzerini yangilash uchun qayta ishga tushiring</translation>
 <translation id="4918844574251943176">Rasmdan nusxa olindi</translation>
-<translation id="4942295735032723435">Chromium yangilanishlari macOS 11 yoki undan yuqori versiyalarda ishlaydi. Bu kompyuterdagi versiya: macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium orqa fon rejimida ishlamoqda.</translation>
 <translation id="494490797786467921">Chromium tizimiga kirish oynasini yopish uchun bosing</translation>
 <translation id="4950660488495335294">Chromium profillari brauzerdan alohida foydalanish uchun kerak. Doʻstlar va oila uchun profillar yarating yoki ish va hordiqni ajrating.</translation>
diff --git a/chrome/app/resources/chromium_strings_vi.xtb b/chrome/app/resources/chromium_strings_vi.xtb
index 8236614..e68dde1 100644
--- a/chrome/app/resources/chromium_strings_vi.xtb
+++ b/chrome/app/resources/chromium_strings_vi.xtb
@@ -286,7 +286,6 @@
 <translation id="4888717733111232871">Quy tắc kết nối để Chromium cho phép lưu lượng truy cập mDNS.</translation>
 <translation id="4893347770495441059">Chạy lại để cập nhật &amp;Chromium</translation>
 <translation id="4918844574251943176">Đã sao chép hình ảnh</translation>
-<translation id="4942295735032723435">Để nhận các bản cập nhật Chromium sau này, bạn cần có macOS 11 trở lên. Máy tính này đang sử dụng macOS 10.15.</translation>
 <translation id="4943838377383847465">Chromium đang chạy trong nền.</translation>
 <translation id="494490797786467921">Nhấp để đóng hộp thoại đăng nhập vào Chromium</translation>
 <translation id="4950660488495335294">Với các hồ sơ trên Chromium, bạn có thể tách biệt mọi nội dung của mình khi dùng trình duyệt này. Hãy tạo hồ sơ cho bạn bè và gia đình hoặc phân tách nội dung công việc với nội dung giải trí.</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-CN.xtb b/chrome/app/resources/chromium_strings_zh-CN.xtb
index be54b18..905737a 100644
--- a/chrome/app/resources/chromium_strings_zh-CN.xtb
+++ b/chrome/app/resources/chromium_strings_zh-CN.xtb
@@ -285,7 +285,6 @@
 <translation id="4888717733111232871">Chromium的入站规则,允许mDNS流量。</translation>
 <translation id="4893347770495441059">重新启动以更新 Chromium(&amp;C)</translation>
 <translation id="4918844574251943176">图片已复制</translation>
-<translation id="4942295735032723435">若要接收后续 Chromium 更新,您需使用 macOS 11 或更高版本。该计算机目前使用的是 macOS 10.15。</translation>
 <translation id="4943838377383847465">Chromium处于后台运行模式。</translation>
 <translation id="494490797786467921">点击即可关闭 Chromium 登录对话框</translation>
 <translation id="4950660488495335294">借助 Chromium 个人资料,您可将所有 Chromium 内容分门别类。您可为朋友和家人创建专属资料,或者将工作和娱乐用资料分开。</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-HK.xtb b/chrome/app/resources/chromium_strings_zh-HK.xtb
index bda5055d..53bf04a 100644
--- a/chrome/app/resources/chromium_strings_zh-HK.xtb
+++ b/chrome/app/resources/chromium_strings_zh-HK.xtb
@@ -287,7 +287,6 @@
 <translation id="4888717733111232871">允許 mDNS 流量的 Chromium 輸入規則。</translation>
 <translation id="4893347770495441059">重新啟動以更新 &amp;Chromium</translation>
 <translation id="4918844574251943176">已複製圖片</translation>
-<translation id="4942295735032723435">如要取得日後的 Chromium 更新,你將需要 macOS 11 或以上版本。此電腦正在使用 macOS 10.15。</translation>
 <translation id="4943838377383847465">Chromium 正在背景模式中執行。</translation>
 <translation id="494490797786467921">點擊即可關閉 Chromium 登入對話框</translation>
 <translation id="4950660488495335294">透過 Chromium 設定檔,你可將所有 Chromium 內容分門別類,例如建立親朋好友專屬的設定檔,或劃分工作和娛樂內容。</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb
index 068ee9d..3f4aea68 100644
--- a/chrome/app/resources/chromium_strings_zh-TW.xtb
+++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -285,7 +285,6 @@
 <translation id="4888717733111232871">允許 mDNS 流量的 Chromium 輸入規則。</translation>
 <translation id="4893347770495441059">重新啟動以更新 &amp;Chromium</translation>
 <translation id="4918844574251943176">已複製圖片</translation>
-<translation id="4942295735032723435">如果之後要更新 Chromium,請使用 macOS 11 以上版本。這部電腦目前的版本為 macOS 10.15。</translation>
 <translation id="4943838377383847465">Chromium 正在背景模式中執行。</translation>
 <translation id="494490797786467921">按一下即可關閉 Chromium 登入對話方塊</translation>
 <translation id="4950660488495335294">你可以運用 Chromium 設定檔分隔各種 Chromium 資料,例如建立親朋好友各自的專屬設定檔,或是依工作和娛樂需要建立不同設定檔。</translation>
diff --git a/chrome/app/resources/chromium_strings_zu.xtb b/chrome/app/resources/chromium_strings_zu.xtb
index 177de0c10..83d810c 100644
--- a/chrome/app/resources/chromium_strings_zu.xtb
+++ b/chrome/app/resources/chromium_strings_zu.xtb
@@ -287,7 +287,6 @@
 <translation id="4888717733111232871">Umyalo obambeke ngaphakathi we-Chromium wokuvumela ithrafikhi ye-mDNS.</translation>
 <translation id="4893347770495441059">Qalisa kabusha ukuze Ubuyekeze i-&amp;Chromium</translation>
 <translation id="4918844574251943176">Umfanekiso ukopishiwe</translation>
-<translation id="4942295735032723435">Ukuze uthole izibuyekezo zesikhathi esizayo ze-Chromium, uzodinga i-macOS 11 noma eyakamuva. Le khompyutha isebenzisa i-macOS 10.15.</translation>
 <translation id="4943838377383847465">I-Chromium kumodi yasemuva.</translation>
 <translation id="494490797786467921">Chofoza ukuze uvale ibhokisi lokungena ngemvume leChromium</translation>
 <translation id="4950660488495335294">Ngamaphrofayela weChromium ungahlukanisa zonke izinto zakho zeChromium. Sungula amaphrofayela wabangane nomndeni, noma uhlukanise phakathi komsebenzi nobumnandi.</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 6e2b8964..f1589d7 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -1648,6 +1648,7 @@
 <translation id="2121825465123208577">መጠን ቀይር</translation>
 <translation id="2123766928840368256">የተለየ ፋይል ይምረጡ</translation>
 <translation id="2124930039827422115">{1,plural, =1{በአንድ ተጠቃሚ <ph name="AVERAGE_RATING" /> ደረጃ ተሰጥቶታል።}one{በ# ተጠቃሚዎች <ph name="AVERAGE_RATING" /> ደረጃ ተሰጥቶታል።}other{በ# ተጠቃሚዎች <ph name="AVERAGE_RATING" /> ደረጃ ተሰጥቶታል።}}</translation>
+<translation id="2125715366913703594">&amp;Extensions ያስሱ</translation>
 <translation id="2126167708562367080">ስምረት በእርስዎ አስተዳዳሪ ተሰናክሏል።</translation>
 <translation id="2127372758936585790">አነስተኛ ኃይል ያለው ባትሪ መሙያ</translation>
 <translation id="212862741129535676">የተደጋጋሚነት ሁኔታ ያዥነት መቶኛ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 4d0523f..f6d5cf85 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1255,6 +1255,7 @@
 <translation id="185111092974636561">‏<ph name="BEGIN_PARAGRAPH1" />قبل التسجيل، عليك محو وحدة النظام الأساسي الموثوقة (TPM) ليتمكّن نظام التشغيل <ph name="DEVICE_OS" /> من الحصول على ملكية الجهاز.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />يمكنك أيضًا إيقاف الجهاز الذي يتضمَّن وحدة TPM بالكامل. وستظل بياناتك مخزَّنة بشكل آمن من خلال برمجيات التشفير، إلا أنّ بعض ميزات الأمان، مثل الشهادات المستنِدة إلى الأجهزة، سيتم إيقافها.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />يمكنك تغيير إعدادات TPM عن طريق إعادة التشغيل والدخول إلى إعدادات BIOS/UEFI للنظام. وتختلف الخطوات باختلاف طراز الجهاز. ولمزيد من المعلومات، افتح مستندات نظام التشغيل <ph name="DEVICE_OS" /> على جهاز منفصل قبل إعادة التشغيل: g.co/flex/TPMHelp.<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116">جارٍ مشاركة <ph name="TAB_NAME" /> مع علامة التبويب هذه</translation>
 <translation id="1852799913675865625">حدث خطأ أثناء محاولة قراءة الملف: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1854180393107901205">إيقاف البث</translation>
 <translation id="1856715684130786728">إضافة موقع...</translation>
@@ -11299,6 +11300,7 @@
 <translation id="8963117664422609631">الانتقال إلى إعدادات الموقع الإلكتروني</translation>
 <translation id="8964927371396953727">يُرجى إثبات هويتك لاستخدام كلمات المرور وحفظها في حسابك (<ph name="ACCOUNT_EMAIL" />)</translation>
 <translation id="8965037249707889821">إدخال كلمة المرور القديمة</translation>
+<translation id="8967403839792635452">‏هل تعمل على تطوير إضافات؟ يمكنك الاطّلاع على <ph name="BEGIN_LINK" />كل جديد<ph name="END_LINK" /> من خلال مستندات مطوّري "إضافة Chrome".</translation>
 <translation id="8967427617812342790">الإضافة إلى قائمة القراءة</translation>
 <translation id="8967548289042494261">إزالة "<ph name="VM_NAME" />"</translation>
 <translation id="8968527460726243404">‏كاتب الصور لنظام ChromeOS</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb
index 30ac948..687bda2 100644
--- a/chrome/app/resources/generated_resources_bs.xtb
+++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -11302,7 +11302,7 @@
 <translation id="8963117664422609631">Idite u postavke web lokacije</translation>
 <translation id="8964927371396953727">Potvrdite identitet da koristite i sačuvate lozinke na računu <ph name="ACCOUNT_EMAIL" /></translation>
 <translation id="8965037249707889821">Unesite staru lozinku</translation>
-<translation id="8967403839792635452">Razvijate li proširenja? Pratite odjeljak <ph name="BEGIN_LINK" />Novosti<ph name="END_LINK" /> u dokumentaciji za razvojne programere Chromeovog proširenja.</translation>
+<translation id="8967403839792635452">Programirate ekstenzije? Budite u toku (<ph name="BEGIN_LINK" />Šta je novo<ph name="END_LINK" />) uz dokumentaciju programera za ekstenziju za Chrome.</translation>
 <translation id="8967427617812342790">Dodaj na listu za čitanje</translation>
 <translation id="8967548289042494261">Uklanjanje stavke <ph name="VM_NAME" /></translation>
 <translation id="8968527460726243404">Pisanje slika sistema ChromeOS</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb
index 805ead5..f6ba0750 100644
--- a/chrome/app/resources/generated_resources_cy.xtb
+++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -1263,6 +1263,7 @@
 <translation id="185111092974636561"><ph name="BEGIN_PARAGRAPH1" />Cyn cofrestru mae angen i chi glirio'r ffeil TPM fel y gall <ph name="DEVICE_OS" /> gymryd perchnogaeth o'r ddyfais.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Gallwch hefyd ddiffodd y ddyfais TPM yn gyfan gwbl. Bydd eich data yn dal i gael eu storio'n ddiogel gydag amgryptio meddalwedd, ond bydd rhai nodweddion diogelwch megis tystysgrifau â chefnogaeth caledwedd yn cael eu hanalluogi.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />Gallwch newid eich gosodiadau TPM drwy ailgychwyn a mynd i osodiadau BIOS/UEFI y system. Mae'r camau'n amrywio yn seiliedig ar fodel y ddyfais. Am ragor o wybodaeth, agorwch ddogfennaeth <ph name="DEVICE_OS" /> ar ddyfais ar wahân cyn i chi ailgychwyn: g.co/flex/TPMHelp.<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116">Yn rhannu <ph name="TAB_NAME" /> i'r tab hwn</translation>
 <translation id="1852799913675865625">Bu gwall wrth geisio darllen y ffeil: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1854180393107901205">Stopio castio</translation>
 <translation id="1856715684130786728">Ychwanegu lleoliad...</translation>
@@ -1653,6 +1654,7 @@
 <translation id="2121825465123208577">Newid maint</translation>
 <translation id="2123766928840368256">Dewiswch ffeil wahanol</translation>
 <translation id="2124930039827422115">{1,plural, =1{Wedi'i raddio <ph name="AVERAGE_RATING" /> gan un defnyddiwr.}zero{Wedi'i raddio <ph name="AVERAGE_RATING" /> gan # defnyddiwr.}two{Wedi'i raddio <ph name="AVERAGE_RATING" /> gan # ddefnyddiwr.}few{Wedi'i raddio <ph name="AVERAGE_RATING" /> gan # defnyddiwr.}many{Wedi'i raddio <ph name="AVERAGE_RATING" /> gan # defnyddiwr.}other{Wedi'i raddio <ph name="AVERAGE_RATING" /> gan # defnyddiwr.}}</translation>
+<translation id="2125715366913703594">Archwilio &amp;Estyniadau</translation>
 <translation id="2126167708562367080">Mae Cysoni wedi'i analluogi gan eich gweinyddwr.</translation>
 <translation id="2127372758936585790">Gwefrydd pŵer isel</translation>
 <translation id="212862741129535676">Canran Meddiannaeth y Cyflwr Amledd</translation>
@@ -11309,6 +11311,7 @@
 <translation id="8963117664422609631">Ewch i'r gosodiadau gwefan</translation>
 <translation id="8964927371396953727">Cadarnhewch mai chi sydd yno i ddefnyddio a chadw cyfrineiriau yn eich cyfrif, <ph name="ACCOUNT_EMAIL" /></translation>
 <translation id="8965037249707889821">Rhowch yr hen gyfrinair</translation>
+<translation id="8967403839792635452">Yn datblygu estyniadau? Cael y wybodaeth ddiweddaraf am <ph name="BEGIN_LINK" />Beth sy'n Newydd<ph name="END_LINK" /> gyda dogfennaeth datblygwr Estyniad Chrome.</translation>
 <translation id="8967427617812342790">Ychwanegu at y rhestr ddarllen</translation>
 <translation id="8967548289042494261">Tynnu <ph name="VM_NAME" /></translation>
 <translation id="8968527460726243404">Ysgrifennydd Delwedd System ChromeOS</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 135cd5b..bfd64d20 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -1652,6 +1652,7 @@
 <translation id="2121825465123208577">Tilpas størrelse</translation>
 <translation id="2123766928840368256">Vælg en anden fil</translation>
 <translation id="2124930039827422115">{1,plural, =1{Én bruger gav bedømmelsen <ph name="AVERAGE_RATING" />.}one{# bruger gav bedømmelsen <ph name="AVERAGE_RATING" />.}other{# brugere gav bedømmelsen <ph name="AVERAGE_RATING" />.}}</translation>
+<translation id="2125715366913703594">Se udvidelser</translation>
 <translation id="2126167708562367080">Din administrator har deaktiveret synkronisering.</translation>
 <translation id="2127372758936585790">Oplader ved lav kraft</translation>
 <translation id="212862741129535676">Anvendt andel for frekvenstilstand</translation>
@@ -3256,7 +3257,7 @@
 <translation id="3251714896659475029">Giv <ph name="SUPERVISED_USER_NAME" /> adgang til Google Assistent via "Hey Google"</translation>
 <translation id="3251759466064201842">&lt;Ikke en del af certifikatet&gt;</translation>
 <translation id="325238099842880997">Opstil digitale spilleregler, der kan hjælpe børn med at spille, udforske og lave lektier derhjemme</translation>
-<translation id="3253225298092156258">Ikke tilgængeligt</translation>
+<translation id="3253225298092156258">Ikke tilgængelig</translation>
 <translation id="3253344772044554413">{NUM_OF_FILES,plural, =1{Frigør plads i <ph name="CLOUD_PROVIDER" /> for at kopiere denne fil}one{Frigør plads i <ph name="CLOUD_PROVIDER" /> for at kopiere denne fil}other{Frigør plads i <ph name="CLOUD_PROVIDER" /> for at kopiere disse filer}}</translation>
 <translation id="3253448572569133955">Ukendt konto</translation>
 <translation id="3254451942070605467">Downloader <ph name="FILE_NAME" /> – <ph name="PERCENT_REMAINING" /> % tilbage</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index dc774cb1..0f0c0c8 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1638,6 +1638,7 @@
 <translation id="2121825465123208577">Größe anpassen</translation>
 <translation id="2123766928840368256">Andere Datei auswählen</translation>
 <translation id="2124930039827422115">{1,plural, =1{Von 1 Nutzer als <ph name="AVERAGE_RATING" /> bewertet.}other{Von # Nutzern als <ph name="AVERAGE_RATING" /> bewertet.}}</translation>
+<translation id="2125715366913703594">Entdecken &amp; Erweiterungen</translation>
 <translation id="2126167708562367080">Synchronisierung wurde von deinem Administrator deaktiviert.</translation>
 <translation id="2127372758936585790">Schwaches Ladegerät</translation>
 <translation id="212862741129535676">Aktiver Zustand – Auslastung in Prozent</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index 2c5385a7..5762b26 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -1260,6 +1260,7 @@
 <translation id="185111092974636561"><ph name="BEGIN_PARAGRAPH1" />Πριν εγγραφείτε, πρέπει να διαγράψετε το TPM, ώστε το <ph name="DEVICE_OS" /> να μπορεί να αναλάβει την ιδιοκτησία της συσκευής.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Μπορείτε επίσης να απενεργοποιήσετε εντελώς τη συσκευή TPM. Τα δεδομένα σας θα εξακολουθούν να αποθηκεύονται με ασφάλεια με κρυπτογράφηση λογισμικού, αλλά ορισμένες λειτουργίες ασφάλειας, όπως τα πιστοποιητικά με υποστήριξη εξοπλισμού, θα απενεργοποιηθούν.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />Μπορείτε να αλλάξετε τις ρυθμίσεις TPM με επανεκκίνηση και είσοδο στις ρυθμίσεις BIOS/UEFI του συστήματος. Τα βήματα διαφέρουν ανάλογα με το μοντέλο της συσκευής. Για περισσότερες πληροφορίες, ανοίξτε την τεκμηρίωση του <ph name="DEVICE_OS" /> σε ξεχωριστή συσκευή πριν κάνετε επανεκκίνηση: g.co/flex/TPMHelp.<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116">Κοινή χρήση <ph name="TAB_NAME" /> σε αυτή την καρτέλα</translation>
 <translation id="1852799913675865625">Παρουσιάστηκε σφάλμα κατά την απόπειρα ανάγνωσης του αρχείου: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1854180393107901205">Διακοπή μετάδοσης</translation>
 <translation id="1856715684130786728">Προσθήκη τοποθεσίας…</translation>
@@ -1650,6 +1651,7 @@
 <translation id="2121825465123208577">Προσαρμογή μεγέθους</translation>
 <translation id="2123766928840368256">Επιλέξτε διαφορετικό αρχείο</translation>
 <translation id="2124930039827422115">{1,plural, =1{Αξιολογήθηκε ως <ph name="AVERAGE_RATING" /> από έναν χρήστη.}other{Αξιολογήθηκε ως <ph name="AVERAGE_RATING" /> από # χρήστες.}}</translation>
+<translation id="2125715366913703594">Εξερεύνηση &amp;επεκτάσεις</translation>
 <translation id="2126167708562367080">Ο συγχρονισμός έχει απενεργοποιηθεί από τον διαχειριστή σας.</translation>
 <translation id="2127372758936585790">Χαμηλή ισχύς φορτιστή</translation>
 <translation id="212862741129535676">Ποσοστό κατοχής κατάστασης συχνότητας</translation>
@@ -11294,6 +11296,7 @@
 <translation id="8963117664422609631">Μετάβαση στις ρυθμίσεις ιστοτόπου</translation>
 <translation id="8964927371396953727">Επαληθεύστε την ταυτότητά σας, για να χρησιμοποιείτε και να αποθηκεύετε κωδικούς πρόσβασης στον λογαριασμό σας, <ph name="ACCOUNT_EMAIL" /></translation>
 <translation id="8965037249707889821">Εισαγάγετε τον προηγούμενο κωδικό πρόσβασης</translation>
+<translation id="8967403839792635452">Αναπτύσσετε επεκτάσεις; Μείνετε ενημερωμένοι σχετικά με το <ph name="BEGIN_LINK" />Τι νέο υπάρχει<ph name="END_LINK" /> με την τεκμηρίωση για προγραμματιστές της Επέκτασης Chrome.</translation>
 <translation id="8967427617812342790">Προσθήκη στη λίστα ανάγνωσης</translation>
 <translation id="8967548289042494261">Κατάργηση <ph name="VM_NAME" /></translation>
 <translation id="8968527460726243404">Εργαλείο εγγραφής εικόνων συστήματος ChromeOS</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 3aa89fb..a6e4e3c 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1258,6 +1258,7 @@
 <translation id="185111092974636561">‏<ph name="BEGIN_PARAGRAPH1" />پیش‌از ثبت‌نام، باید TPM را پاک کنید تا <ph name="DEVICE_OS" /> بتواند مالک این دستگاه شود.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />همچنین می‌توانید دستگاه TPM را به‌طور کامل خاموش کنید. داده‌های شما همچنان بااستفاده از رمزگذاری نرم‌افزار به‌طور ایمن ذخیره می‌شود، اما برخی‌از ویژگی‌های امنیتی مثل گواهینامه‌های دارای پشتیبان سخت‌افزاری غیرفعال می‌شود.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />می‌توانید با بازراه‌اندازی سیستم و وارد شدن به تنظیمات BIOS/UEFI سیستم، تنظیمات TPM را تغییر دهید. مراحل بسته به مدل دستگاه متفاوت است. برای کسب اطلاعات بیشتر، پیش‌از بازراه‌اندازی، اسناد <ph name="DEVICE_OS" /> را در دستگاه دیگری باز کنید: g.co/flex/TPMHelp<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116">درحال هم‌رسانی <ph name="TAB_NAME" /> در این برگه</translation>
 <translation id="1852799913675865625">خطایی در حین خواندن این فایل وجود داشت: <ph name="ERROR_TEXT" /></translation>
 <translation id="1854180393107901205">توقف فرستادن</translation>
 <translation id="1856715684130786728">افزودن موقعیت مکانی...</translation>
@@ -11294,6 +11295,7 @@
 <translation id="8963117664422609631">رفتن به تنظیمات سایت</translation>
 <translation id="8964927371396953727">برای استفاده از گذرواژه‌ها و ذخیره کردن آن‌ها در حسابتان (<ph name="ACCOUNT_EMAIL" />)، هویت خود را به‌تأیید برسانید</translation>
 <translation id="8965037249707889821">گذرواژه قدیمی را وارد کنید</translation>
+<translation id="8967403839792635452">‏درحال توسعه دادن افزونه هستید؟ با مستندات توسعه‌دهنده «افزونه Chrome» از <ph name="BEGIN_LINK" />ویژگی‌های جدید<ph name="END_LINK" /> مطلع شوید.</translation>
 <translation id="8967427617812342790">افزودن به فهرست خواندن</translation>
 <translation id="8967548289042494261">حذف <ph name="VM_NAME" /></translation>
 <translation id="8968527460726243404">‏ایجادکننده تصویر سیستمی ChromeOS</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 74760239..84fd109 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -11302,7 +11302,7 @@
 <translation id="8963117664422609631">Pumunta sa mga setting ng site</translation>
 <translation id="8964927371396953727">I-verify na ikaw ito para magamit at ma-save ang mga password sa iyong account, <ph name="ACCOUNT_EMAIL" /></translation>
 <translation id="8965037249707889821">Ilagay ang lumang password</translation>
-<translation id="8967403839792635452">Nagde-develop ng mga extension? Manatiling up to date sa <ph name="BEGIN_LINK" />Ano'ng Bago<ph name="END_LINK" /> gamit ang dokumentasyon ng developer ng Extension ng Chrome.</translation>
+<translation id="8967403839792635452">Nagde-develop ng mga extension? Manatiling up to date sa <ph name="BEGIN_LINK" />Ano'ng Bago<ph name="END_LINK" /> gamit ang developer documentation ng Extension ng Chrome.</translation>
 <translation id="8967427617812342790">Idagdag sa listahan ng babasahin</translation>
 <translation id="8967548289042494261">Alisin ang <ph name="VM_NAME" /></translation>
 <translation id="8968527460726243404">Pangsulat ng Larawan ng ChromeOS na System</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb
index 3cae2ff8..d6c1a69 100644
--- a/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -1641,6 +1641,7 @@
 <translation id="2121825465123208577">Redimensionner</translation>
 <translation id="2123766928840368256">Choisir un autre fichier</translation>
 <translation id="2124930039827422115">{1,plural, =1{Notée <ph name="AVERAGE_RATING" /> par un utilisateur.}one{Notée <ph name="AVERAGE_RATING" /> par # utilisateur.}other{Notée <ph name="AVERAGE_RATING" /> par # utilisateurs.}}</translation>
+<translation id="2125715366913703594">Explorer les extensions</translation>
 <translation id="2126167708562367080">La synchronisation est désactivée par votre administrateur.</translation>
 <translation id="2127372758936585790">Chargeur de faible puissance</translation>
 <translation id="212862741129535676">Pourcentage d'utilisation des valeurs de fréquence</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 3c74fdd..6b745d4 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -5033,7 +5033,7 @@
 <translation id="4507401683427517298">Cliquez sur "Ajouter un raccourci"</translation>
 <translation id="450867954911715010">Paramètres d'accessibilité</translation>
 <translation id="4508765956121923607">Afficher la s&amp;ource</translation>
-<translation id="4509277363725254222">Lorsque vous partagez une copie de votre <ph name="BEGIN_BOLD_USERNAME" />nom d'utilisateur<ph name="END_BOLD_USERNAME" /> et de votre <ph name="BEGIN_BOLD_PASSWORD" />mot de passe<ph name="END_BOLD_PASSWORD" />, le membre de votre famille peut les renseigner à l'aide du Gestionnaire de mots de passe de Google</translation>
+<translation id="4509277363725254222">Lorsque vous partagez une copie de votre <ph name="BEGIN_BOLD_USERNAME" />nom d'utilisateur<ph name="END_BOLD_USERNAME" /> et de votre <ph name="BEGIN_BOLD_PASSWORD" />mot de passe<ph name="END_BOLD_PASSWORD" />, le membre de votre famille peut les renseigner à l'aide du Gestionnaire de mots de passe de Google.</translation>
 <translation id="4509421746503122514">Redémarrer pour mettre à jour</translation>
 <translation id="4509741852167209430">Seuls quelques types de données sont partagés entre les sites pour mesurer les performances de leurs annonces (par exemple, si vous avez effectué un achat ou non après avoir consulté un site)</translation>
 <translation id="4510195992002502722">Échec de l'envoi des commentaires. Nouvelle tentative…</translation>
@@ -8002,7 +8002,7 @@
 <translation id="6666559645296300656">Annuler la mise à niveau Linux</translation>
 <translation id="6667086124612170548">Fichier trop volumineux pour cet appareil</translation>
 <translation id="6667092961374478614">Découvrabilité du <ph name="FEATURE_NAME" /></translation>
-<translation id="6667187897999649121">Pour le moment, vous ne pouvez partager des mots de passe qu'avec des membres de votre famille. <ph name="BEGIN_LINK" />Créez un groupe familial<ph name="END_LINK" /> avec jusqu'à six membres, et profitez pleinement de vos produits et abonnements sur Google.</translation>
+<translation id="6667187897999649121">Pour le moment, vous ne pouvez partager des mots de passe qu'avec des membres de votre famille. <ph name="BEGIN_LINK" />Créez un groupe familial<ph name="END_LINK" /> réunissant jusqu'à six personnes, et profitez pleinement de vos produits et abonnements sur Google.</translation>
 <translation id="666731172850799929">Ouvrir dans <ph name="APP_NAME" /></translation>
 <translation id="6669195257625975787">Les données sont traitées de la même manière que le site que vous consultez</translation>
 <translation id="6670142487971298264"><ph name="APP_NAME" /> désormais disponible</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 86b8cd4..3feb76b5 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -1637,6 +1637,7 @@
 <translation id="2121825465123208577">આકાર બદલો</translation>
 <translation id="2123766928840368256">કોઈ અલગ ફાઇલ પસંદ કરો</translation>
 <translation id="2124930039827422115">{1,plural, =1{એક વપરાશકર્તાએ <ph name="AVERAGE_RATING" /> રેટ કરેલું.}one{# વપરાશકર્તાએ <ph name="AVERAGE_RATING" /> રેટ કરેલું.}other{# વપરાશકર્તાએ <ph name="AVERAGE_RATING" /> રેટ કરેલું.}}</translation>
+<translation id="2125715366913703594">&amp;Extensions વિશે શોધખોળ કરો</translation>
 <translation id="2126167708562367080">સમન્વયન, તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરવામાં આવ્યું છે.</translation>
 <translation id="2127372758936585790">નિમ્ન-પાવર ચાર્જર</translation>
 <translation id="212862741129535676">ફ્રીક્વેંસી સ્થિતિ અક્યુપન્સિ ટકા</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index b119f63..bfbd27e 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -1651,6 +1651,7 @@
 <translation id="2121825465123208577">आकार बदलें</translation>
 <translation id="2123766928840368256">कोई दूसरी फ़ाइल चुनें</translation>
 <translation id="2124930039827422115">{1,plural, =1{एक उपयोगकर्ता ने <ph name="AVERAGE_RATING" /> रेटिंग दी है.}one{# उपयोगकर्ताओं ने <ph name="AVERAGE_RATING" /> रेटिंग दी है.}other{# उपयोगकर्ताओं ने <ph name="AVERAGE_RATING" /> रेटिंग दी है.}}</translation>
+<translation id="2125715366913703594">एक्सटेंशन एक्सप्लोर करें</translation>
 <translation id="2126167708562367080">सिंक को आपके व्यवस्थापक ने अक्षम किया है.</translation>
 <translation id="2127372758936585790">कम-शक्ति वाला चार्जर</translation>
 <translation id="212862741129535676">आवृत्ति स्थिति उपयोग प्रतिशत</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index e7b3f541..45c8cd6 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1650,6 +1650,7 @@
 <translation id="2121825465123208577">Ubah ukuran</translation>
 <translation id="2123766928840368256">Pilih file yang berbeda</translation>
 <translation id="2124930039827422115">{1,plural, =1{Diberi rating <ph name="AVERAGE_RATING" /> oleh satu pengguna.}other{Diberi rating <ph name="AVERAGE_RATING" /> oleh # pengguna.}}</translation>
+<translation id="2125715366913703594">Pelajari &amp;Ekstensi</translation>
 <translation id="2126167708562367080">Sinkronisasi dinonaktifkan oleh administrator Anda.</translation>
 <translation id="2127372758936585790">Pengisi daya rendah</translation>
 <translation id="212862741129535676">Persentase Pemakaian Status Frekuensi</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb
index ff16173..ff82e48 100644
--- a/chrome/app/resources/generated_resources_is.xtb
+++ b/chrome/app/resources/generated_resources_is.xtb
@@ -1261,6 +1261,7 @@
 <translation id="185111092974636561"><ph name="BEGIN_PARAGRAPH1" />Áður en þú skráir þig þarftu að hreinsa TPM til að <ph name="DEVICE_OS" /> geti orðið eigandi tækisins.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Þú getur einnig slökkt alveg á TPM-tækinu. Gögnin þín verða áfram geymd með öruggum hætti með hugbúnaðardulkóðun en tilteknir öryggiseiginleikar verða óvirkir, t.d. vottorð sem byggjast á vélbúnaði.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />Þú getur breytt TPM-stillingum með því að endurræsa og opna kerfisstillingarnar í BIOS/UEFI. Skrefin eru breytileg og fara eftir gerð tækisins. Þú getur fengið frekari upplýsingar í fylgiskjölum <ph name="DEVICE_OS" /> í öðru tæki áður en þú endurræsir: g.co/flex/TPMHelp.<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116">Bjóða <ph name="TAB_NAME" /> í þennan flipa</translation>
 <translation id="1852799913675865625">Villa kom upp við að reyna að lesa skrána: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1854180393107901205">Hætta útsendingu</translation>
 <translation id="1856715684130786728">Bæta staðsetningu við...</translation>
@@ -11297,6 +11298,7 @@
 <translation id="8963117664422609631">Opna stillingar vefsvæðis</translation>
 <translation id="8964927371396953727">Staðfestu að þetta sért þú til að nota og vista aðgangsorð á reikningnum þínum, <ph name="ACCOUNT_EMAIL" /></translation>
 <translation id="8965037249707889821">Sláðu inn gamla aðgangsorðið</translation>
+<translation id="8967403839792635452">Ertu að þróa viðbætur? Fáðu upplýsingar um <ph name="BEGIN_LINK" />Nýjungar<ph name="END_LINK" /> með skjölum fyrir forritara Chrome-viðbótar.</translation>
 <translation id="8967427617812342790">Bæta við leslista</translation>
 <translation id="8967548289042494261">Fjarlægja <ph name="VM_NAME" /></translation>
 <translation id="8968527460726243404">Vistun ChromeOS kerfismynda</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index b1db74c..8d81554 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -1248,6 +1248,7 @@
 <translation id="1850145825777333687">デバイスの認証情報</translation>
 <translation id="1850508293116537636">時計回りに回転(&amp;C)</translation>
 <translation id="185111092974636561"><ph name="BEGIN_PARAGRAPH1" />登録する前に、<ph name="DEVICE_OS" /> がデバイスのオーナー権限を取得できるよう TPM を消去する必要があります。<ph name="END_PARAGRAPH1" /><ph name="BEGIN_PARAGRAPH2" />デバイスの TPM を完全にオフにすることもできます。データは、ソフトウェアによる暗号化で引き続き安全に保存されますが、ハードウェア式証明書など、特定のセキュリティ機能は無効になります。<ph name="END_PARAGRAPH2" /><ph name="BEGIN_PARAGRAPH3" />TPM の設定を変更するには、再起動してシステム BIOS / UEFI の設定に入ってください。手順はデバイスモデルに応じて異なります。詳しくは、再起動する前に別のデバイスで <ph name="DEVICE_OS" /> のドキュメントをご確認ください: g.co/flex/TPMHelp<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116"><ph name="TAB_NAME" /> をこのタブに共有しています</translation>
 <translation id="1852799913675865625">ファイルの読み込み中にエラーが発生しました: <ph name="ERROR_TEXT" /></translation>
 <translation id="1854180393107901205">キャストを停止</translation>
 <translation id="1856715684130786728">位置情報を追加...</translation>
@@ -1637,6 +1638,7 @@
 <translation id="2121825465123208577">サイズを変更</translation>
 <translation id="2123766928840368256">別のファイルを選択</translation>
 <translation id="2124930039827422115">{1,plural, =1{1 人のユーザーにより <ph name="AVERAGE_RATING" /> と評価されています。}other{# 人のユーザーにより平均で <ph name="AVERAGE_RATING" /> と評価されています。}}</translation>
+<translation id="2125715366913703594">拡張機能を探す(&amp;E)</translation>
 <translation id="2126167708562367080">同期は管理者により無効にされています。</translation>
 <translation id="2127372758936585790">低電力の充電器</translation>
 <translation id="212862741129535676">周波数状態の占有率(%)</translation>
@@ -11263,6 +11265,7 @@
 <translation id="8963117664422609631">サイトの設定に移動</translation>
 <translation id="8964927371396953727">アカウント「<ph name="ACCOUNT_EMAIL" />」のパスワードを使用、保存するには、本人確認を行ってください</translation>
 <translation id="8965037249707889821">古いパスワードを入力</translation>
+<translation id="8967403839792635452">拡張機能を開発中ですか?Chrome 拡張機能のデベロッパー ドキュメントで<ph name="BEGIN_LINK" />最新情報<ph name="END_LINK" />をご確認ください。</translation>
 <translation id="8967427617812342790">リーディング リストに追加</translation>
 <translation id="8967548289042494261"><ph name="VM_NAME" /> を削除</translation>
 <translation id="8968527460726243404">ChromeOS システム イメージ ライター</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb
index 4a10ac70..1995791 100644
--- a/chrome/app/resources/generated_resources_ka.xtb
+++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -1251,6 +1251,7 @@
 <translation id="185111092974636561"><ph name="BEGIN_PARAGRAPH1" />რეგისტრაციამდე უნდა გაიაროთ TPM-ის შემოწმება, რომ <ph name="DEVICE_OS" /> მოწყობილობის მფლობელი გახდეს.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />სურვილისამებრ, TPM მოწყობილობის მთლიანად გამორთვა შეგიძლიათ. თქვენი მონაცემები უსაფრთხოდ შეინახება პროგრამული უზრუნველყოფის დაშიფვრის მეშვეობით, თუმცა უსაფრთხოების ზოგიერთი ფუნქცია, როგორიცაა აპარატურით უზრუნველყოფილი სერტიფიკატები, გაითიშება.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />თქვენი TPM პარამეტრების შესაცვლელად გადატვირთეთ მოწყობილობა და შედით სისტემის BIOS/UEFI პარამეტრებში. მოქმედებათა მიმდევრობა განსხვავდება მოწყობილობის მოდელის მიხედვით. დამატებითი ინფორმაციისთვის მოწყობილობის გადატვირთვამდე გაეცანით <ph name="DEVICE_OS" />-ის დოკუმენტაციას სხვა მოწყობილობიდან: g.co/flex/TPMHelp.<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116"><ph name="TAB_NAME" /> ზიარდება ამ ჩანართში</translation>
 <translation id="1852799913675865625">ფაილის წაკითხვის დროს მოხდა შეცდომა: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1854180393107901205">ტრანსლირების შეწყვეტა</translation>
 <translation id="1856715684130786728">დაამატეთ ადგილმდებარეობა…</translation>
@@ -11280,6 +11281,7 @@
 <translation id="8963117664422609631">საიტის პარამეტრებზე გადასვლა</translation>
 <translation id="8964927371396953727">დაადასტურეთ ვინაობა, რომ გამოიყენოთ და შეინახოთ პაროლები თქვენს ანგარიშში, <ph name="ACCOUNT_EMAIL" /></translation>
 <translation id="8965037249707889821">შეიყვანეთ ძველი პაროლი</translation>
+<translation id="8967403839792635452">დეველოპერთა გაფართოებები? მიიღეთ უახლესი ამბები <ph name="BEGIN_LINK" />სიახლეების<ph name="END_LINK" /> გვერდზე Chrome გაფართოების დეველოპერის დოკუმენტაციით.</translation>
 <translation id="8967427617812342790">საკითხავ სიაში დამატება</translation>
 <translation id="8967548289042494261">წაშალეთ <ph name="VM_NAME" /></translation>
 <translation id="8968527460726243404">ChromeOS-ის სისტემური იმიჯ-ფაილის ჩამწერი</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb
index 8204a9a..3283b4f 100644
--- a/chrome/app/resources/generated_resources_kk.xtb
+++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -7314,7 +7314,7 @@
 <translation id="6163522313638838258">Барлығын жаю…</translation>
 <translation id="6164393601566177235">Сайттар қосу</translation>
 <translation id="6164832038898943453">Автоматты түрде аударылатын тілдерді қосу</translation>
-<translation id="6165508094623778733">Толығырақ</translation>
+<translation id="6165508094623778733">Толық ақпарат</translation>
 <translation id="6166185671393271715">Құпия сөздерді Chrome жүйесіне импорттау</translation>
 <translation id="6169040057125497443">Микрофонды тексеріңіз.</translation>
 <translation id="6169967265765719844">Steam арқылы орнатылған ойындар мен қолданбаларға арналған рұқсаттарды <ph name="LINK_BEGIN" />Steam қолданбасы параметрлерінен<ph name="LINK_END" /> басқаруға болады.</translation>
@@ -10534,7 +10534,7 @@
 <translation id="8441313165929432954">Тетерингті қосу/өшіру</translation>
 <translation id="8443986842926457191">URL мекенжайының ұзындығы 2048 таңба шегінен асып кеткен.</translation>
 <translation id="8445281870900174108">Бұл қойынды камераңызды пайдаланып жатыр</translation>
-<translation id="8446884382197647889">Толығырақ</translation>
+<translation id="8446884382197647889">Толық ақпарат</translation>
 <translation id="8447409163267621480">Ctrl не Alt пернесінен басталуы керек</translation>
 <translation id="8449008133205184768">Қою және сәйкестендіру стилі</translation>
 <translation id="8449036207308062757">Жадты басқару</translation>
@@ -10988,7 +10988,7 @@
 <translation id="8756262226135340085">Бір перненің тез арада қайталап басылуын елемейді.</translation>
 <translation id="8756969031206844760">Құпия сөз жаңартылсын ба?</translation>
 <translation id="8757368836647541092"><ph name="USER_NAME_OR_EMAIL" /> өшірілді.</translation>
-<translation id="8759753423332885148">Толығырақ.</translation>
+<translation id="8759753423332885148">Толық ақпарат.</translation>
 <translation id="876161309768861172">Аккаунтқа кіре алмадыңыз. Әрекетті қайталаңыз.</translation>
 <translation id="8761945298804995673">Бұл пайдаланушы бұрыннан бар.</translation>
 <translation id="8762886931014513155"><ph name="DEVICE_TYPE" /> құрылғысын жаңарту қажет</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index e8c871f..4b4186d 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -1260,6 +1260,7 @@
 <translation id="185111092974636561"><ph name="BEGIN_PARAGRAPH1" />등록하기 전에 <ph name="DEVICE_OS" />에서 기기 소유권을 가질 수 있도록 TPM을 삭제해야 합니다.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />TPM 기기를 완전히 끌 수도 있습니다. 데이터는 소프트웨어 암호화를 통해 계속 안전하게 저장되지만 하드웨어 지원 인증서와 같은 특정 보안 기능은 중지됩니다.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />재부팅하고 시스템 BIOS/UEFI 설정을 입력하여 TPM 설정을 변경할 수 있습니다. 기기 모델에 따라 설정을 변경하는 단계가 다를 수 있습니다. 자세한 내용을 확인하려면 재부팅하기 전에 별도의 기기에서 <ph name="DEVICE_OS" /> 도움말(g.co/flex/TPMHelp)을 참고하세요.<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116">이 탭에 <ph name="TAB_NAME" /> 공유</translation>
 <translation id="1852799913675865625">파일을 읽는 중에 오류가 발생했습니다. <ph name="ERROR_TEXT" /></translation>
 <translation id="1854180393107901205">전송 중지</translation>
 <translation id="1856715684130786728">위치 추가...</translation>
@@ -1651,6 +1652,7 @@
 <translation id="2121825465123208577">크기 조정</translation>
 <translation id="2123766928840368256">다른 파일 선택</translation>
 <translation id="2124930039827422115">{1,plural, =1{1명의 사용자가 별표 <ph name="AVERAGE_RATING" />개로 평가했습니다.}other{#명의 사용자가 별표 <ph name="AVERAGE_RATING" />개로 평가했습니다.}}</translation>
+<translation id="2125715366913703594">확장 프로그램 살펴보기(&amp;E)</translation>
 <translation id="2126167708562367080">관리자가 동기화를 사용 중지했습니다.</translation>
 <translation id="2127372758936585790">저출력 충전기</translation>
 <translation id="212862741129535676">주파수 상태 점유율</translation>
@@ -11296,6 +11298,7 @@
 <translation id="8963117664422609631">사이트 설정으로 이동</translation>
 <translation id="8964927371396953727"><ph name="ACCOUNT_EMAIL" /> 계정에서 비밀번호를 사용하고 저장하려면 본인 인증을 완료하세요</translation>
 <translation id="8965037249707889821">이전 비밀번호 입력</translation>
+<translation id="8967403839792635452">확장 프로그램을 개발 중이신가요? Chrome 확장 프로그램 개발자 문서를 통해 <ph name="BEGIN_LINK" />새로운 소식<ph name="END_LINK" />을 확인하세요.</translation>
 <translation id="8967427617812342790">읽기 목록에 추가</translation>
 <translation id="8967548289042494261"><ph name="VM_NAME" /> 삭제</translation>
 <translation id="8968527460726243404">ChromeOS 시스템 이미지 작성기</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb
index 47ec9956..bda34667 100644
--- a/chrome/app/resources/generated_resources_ky.xtb
+++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -1260,6 +1260,7 @@
 <translation id="185111092974636561"><ph name="BEGIN_PARAGRAPH1" />Катталуудан мурун <ph name="DEVICE_OS" /> түзмөктү ээлей ала тургандай кылып TPM түзмөгүн тазалашыңыз керек.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Ошондой эле, TPM түзмөгүн толугу менен өчүрө аласыз. Дайын-даректериңиз программалык шифрлөө менен коопсуз сакталат, бирок аппараттык камсыздоо колдоого алган тастыктамалар сыяктуу айрым коопсуздук функциялары өчөт.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />TPM параметрлериңизди өзгөртүү үчүн түзмөктү өчүрүп-күйгүзүп, системанын BIOS/UEFI параметрлерине кириңиз. Кадамдар түзмөктүн үлгүсүнө жараша айырмаланат. Кеңири маалымат алуу үчүн өчүрүп-күйгүзүүдөн мурун <ph name="DEVICE_OS" /> документтерин өзүнчө түзмөктө ачыңыз: g.co/flex/TPMHelp.<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116"><ph name="TAB_NAME" /> түзмөгүн бул түзмөк менен бөлүшүү</translation>
 <translation id="1852799913675865625">Файлды окуюн дегенде ката кетти: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1854180393107901205">Тышкы экранга чыгарууну токтотуу</translation>
 <translation id="1856715684130786728">Жайгашкан жерди кошуу…</translation>
@@ -1650,6 +1651,7 @@
 <translation id="2121825465123208577">Өлчөмүн өзгөртүү</translation>
 <translation id="2123766928840368256">Башка файлды тандоо</translation>
 <translation id="2124930039827422115">{1,plural, =1{Бир колдонуучу <ph name="AVERAGE_RATING" /> деп баалады.}other{# колдонуучу <ph name="AVERAGE_RATING" /> деп баалады.}}</translation>
+<translation id="2125715366913703594">&amp;Extensions карап чыгуу</translation>
 <translation id="2126167708562367080">Шайкештирүү функциясын администраторуңуз өчүрүп койгон.</translation>
 <translation id="2127372758936585790">Кубаты төмөн кубаттагыч</translation>
 <translation id="212862741129535676">Жыштык абалынын сыйымдуулук катышы</translation>
@@ -11293,6 +11295,7 @@
 <translation id="8963117664422609631">Сайттын параметрлерине өтүү</translation>
 <translation id="8964927371396953727">Аккаунтуңузга (<ph name="ACCOUNT_EMAIL" />) сырсөздөрдү сактоо жана колдонуу үчүн өзүңүздү ырастаңыз</translation>
 <translation id="8965037249707889821">Эски сырсөздү киргизүү</translation>
+<translation id="8967403839792635452">Кеңейтүүлөрдү иштеп чыгып жатасызбы? Chrome кеңейтүүсүнүн иштеп чыгуучунун документтери менен <ph name="BEGIN_LINK" />Жаңылыктардан<ph name="END_LINK" /> кабардар болуп туруңуз.</translation>
 <translation id="8967427617812342790">Окуу тизмесине кошуу</translation>
 <translation id="8967548289042494261">Өчүрүү: <ph name="VM_NAME" /></translation>
 <translation id="8968527460726243404">ChromeOS Тутумунун элес жазгычы</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb
index f2c7ee72..b0959ec6 100644
--- a/chrome/app/resources/generated_resources_lo.xtb
+++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -1258,6 +1258,7 @@
 <translation id="185111092974636561"><ph name="BEGIN_PARAGRAPH1" />ກ່ອນການລົງທະບຽນທ່ານຈະຕ້ອງລຶບລ້າງ TPM ກ່ອນເພື່ອໃຫ້ <ph name="DEVICE_OS" /> ສາມາດຮັບຄວາມເປັນເຈົ້າຂອງອຸປະກອນໄດ້.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />ທ່ານສາມາດປິດອຸປະກອນ TPM ທັງໝົດໄດ້ນຳ. ຂໍ້ມູນຂອງທ່ານຈະຖືກຈັດເກັບໄວ້ຢ່າງປອດໄພດ້ວຍການເຂົ້າລະຫັດຊອບແວ, ແຕ່ຄຸນສົມບັດຄວາມປອດໄພບາງຢ່າງ ເຊັ່ນ: ໃບຮັບຮອງທີ່ໃຊ້ຮາດແວຈະຖືກປິດການນຳໃຊ້ໄວ້.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />ທ່ານສາມາດປ່ຽນການຕັ້ງຄ່າ TPM ຂອງທ່ານໄດ້ໂດຍການປິດເປີດໃໝ່ແລ້ວເຂົ້າໄປການຕັ້ງຄ່າ BIOS/UEFI ຂອງລະບົບ. ຂັ້ນຕອນຕ່າງໆແມ່ນແຕກຕ່າງກັນໄປຂຶ້ນກັບໂມເດວຂອງອຸປະກອນ. ສຳລັບຂໍ້ມູນເພີ່ມເຕີມ, ໃຫ້ເປີດເອກະສານ <ph name="DEVICE_OS" /> ຢູ່ອຸປະກອນແຍກຕ່າງຫາກກ່ອນທີ່ທ່ານຈະປິດເປີດໃໝ່: g.co/flex/TPMHelp.<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116">ກຳລັງແບ່ງປັນ <ph name="TAB_NAME" /> ໄປຫາແຖບນີ້</translation>
 <translation id="1852799913675865625">ມີ​ຄວາມ​ຜິດ​ພາດ​ໃນ​ຂະ​ນະ​ທີ່​ພະ​ຍາ​ຍາມ​​ອ່ານ​ໄຟລ​໌​: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1854180393107901205">ຢຸດ​ການ​ຄາສທ໌</translation>
 <translation id="1856715684130786728">ເພີ່ມ​ທີ່ຕັ້ງ...</translation>
@@ -11289,6 +11290,7 @@
 <translation id="8963117664422609631">ໄປຫາການຕັ້ງຄ່າເວັບໄຊ</translation>
 <translation id="8964927371396953727">ຢັ້ງຢືນວ່າມັນແມ່ນທ່ານທີ່ຈະໃຊ້ ແລະ ບັນທຶກລະຫັດຜ່ານໄວ້ໃນບັນຊີຂອງທ່ານ, <ph name="ACCOUNT_EMAIL" /></translation>
 <translation id="8965037249707889821">ປ້ອນລະ​ຫັດ​ຜ່ານ​ເກົ່າ</translation>
+<translation id="8967403839792635452">ກຳລັງພັດທະນາສ່ວນຂະຫຍາຍຢູ່ບໍ? ບໍ່ພາດທຸກການອັບເດດກ່ຽວກັບ <ph name="BEGIN_LINK" />ມີຫຍັງໃໝ່<ph name="END_LINK" /> ດ້ວຍເອກະສານນັກພັດທະນາສ່ວນຂະຫຍາຍ Chrome.</translation>
 <translation id="8967427617812342790">ເພີ່ມໃສ່ລາຍການທີ່ຈະອ່ານ</translation>
 <translation id="8967548289042494261">ລຶບ <ph name="VM_NAME" /> ອອກ</translation>
 <translation id="8968527460726243404">ຕົວ​ຂຽນ​ພາບ​ຂອງລະ​ບົບ ChromeOS</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 6ad8bf27..331df42b5 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -1653,6 +1653,7 @@
 <translation id="2121825465123208577">Keisti dydį</translation>
 <translation id="2123766928840368256">Pasirinkti kitą failą</translation>
 <translation id="2124930039827422115">{1,plural, =1{Vienas naudotojas įvertino <ph name="AVERAGE_RATING" />.}one{ # naudotojas įvertino <ph name="AVERAGE_RATING" />.}few{ # naudotojai įvertino <ph name="AVERAGE_RATING" />.}many{ # naudotojo įvertino <ph name="AVERAGE_RATING" />.}other{ # naudotojų įvertino <ph name="AVERAGE_RATING" />.}}</translation>
+<translation id="2125715366913703594">„Explore“ &amp;plėtiniai</translation>
 <translation id="2126167708562367080">Sinchronizavimą išjungė jūsų administratorius.</translation>
 <translation id="2127372758936585790">Mažos galios įkroviklis</translation>
 <translation id="212862741129535676">Dažnumo būsenos užėmimo procentas</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 6b6b719c..8c1ccaf9 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -1253,6 +1253,7 @@
 <translation id="185111092974636561"><ph name="BEGIN_PARAGRAPH1" />Pirms reģistrēšanās jums ir jānotīra TPM dati, lai operētājsistēma <ph name="DEVICE_OS" /> varētu pārņemt ierīces īpašumtiesības.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Varat arī izslēgt TPM ierīci. Jūsu dati tiks glabāti drošībā, izmantojot programmatūras šifrēšanu, taču noteiktas drošības funkcijas (piemēram, sertifikātu dublikātu glabāšana aparatūrā) tiks atspējotas.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />TPM iestatījumus varat mainīt, veicot atkārtotu palaišanu un atverot sistēmas BIOS/UEFI iestatījumus. Veicamās darbības dažādos ierīču modeļos var atšķirties. Lai pirms atkārtotas palaišanas skatītu plašāku informāciju, citā ierīcē atveriet <ph name="DEVICE_OS" /> dokumentāciju: g.co/flex/TPMHelp<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116">Kopīgo cilni <ph name="TAB_NAME" /> ar šo cilni</translation>
 <translation id="1852799913675865625">Faila lasīšanas laikā radās kļūda: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1854180393107901205">Apturēt apraidi</translation>
 <translation id="1856715684130786728">Pievienot atrašanās vietu...</translation>
@@ -11283,6 +11284,7 @@
 <translation id="8963117664422609631">Pāriet uz vietnes iestatījumiem</translation>
 <translation id="8964927371396953727">Lai izmantotu un saglabātu paroles kontā <ph name="ACCOUNT_EMAIL" />, apstipriniet savu identitāti.</translation>
 <translation id="8965037249707889821">Ievadiet veco paroli</translation>
+<translation id="8967403839792635452">Vai izstrādājat paplašinājumus? Sadaļā <ph name="BEGIN_LINK" />Kas jauns<ph name="END_LINK" /> varat uzzināt Chrome paplašinājumu dokumentācijas izstrādātājiem jaunumus.</translation>
 <translation id="8967427617812342790">Pievienot sarakstam</translation>
 <translation id="8967548289042494261">Virtuālās mašīnas <ph name="VM_NAME" /> noņemšana</translation>
 <translation id="8968527460726243404">ChromeOS sistēmas attēla rakstītājs</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb
index 47a7004..1099612 100644
--- a/chrome/app/resources/generated_resources_ne.xtb
+++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -1248,6 +1248,7 @@
 <translation id="185111092974636561"><ph name="BEGIN_PARAGRAPH1" /><ph name="DEVICE_OS" /> ले यो डिभाइसको स्वामित्व लिन सकोस् भन्नाका लागि तपाईंले TPM मा भएको सबै डेटा मेटाएपछि मात्र तपाईं यो डिभाइस दर्ता गर्न सक्नुहुन्छ।<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />तपाईं डिभाइसमा भएको TPM नै अफ गर्न पनि सक्नुहुन्छ। तपाईंले TPM अफ गरे पनि तपाईंको डेटा सफ्टवेयरमार्फत इन्क्रिप्सन गरी सुरक्षित रूपमा भण्डारण गरिने छ। तर हार्डवेयरमा आधारित प्रमाणपत्रलगायतका सुरक्षासम्बन्धी केही निश्चित सुविधाहरू भने अफ गरिने छन्।<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />तपाईं यो डिभाइस रिबुट गरी सिस्टमको BIOS/UEFI सेटिङमा गएर TPM सम्बन्धी सेटिङ परिवर्तन गर्न सक्नुहुन्छ। तपाईंले पूरा गर्नु पर्ने चरणहरू डिभाइसको मोडेलका आधारमा फरक हुन्छन्। तपाईं थप जानकारी प्राप्त गर्न चाहनुहुन्छ भने यो डिभाइस रिबुट गर्नुअघि कुनै अर्को डिभाइसमा <ph name="DEVICE_OS" /> सम्बन्धी निम्न डकुमेन्ट खोलेर पढ्नुहोस्: g.co/flex/TPMHelp<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116">यो ट्याबमा <ph name="TAB_NAME" /> सेयर गरिँदै छ</translation>
 <translation id="1852799913675865625">यो फाइल पढ्न प्रयास गर्दा त्यहाँ एउटा त्रुटि भयोः <ph name="ERROR_TEXT" /> ।</translation>
 <translation id="1854180393107901205">Cast गर्न रोक्नुहोस्</translation>
 <translation id="1856715684130786728">स्थान थप्नुहोस्...</translation>
@@ -11274,6 +11275,7 @@
 <translation id="8963117664422609631">साइटका सेटिङमा जानुहोस्</translation>
 <translation id="8964927371396953727">आफ्नो खाता (<ph name="ACCOUNT_EMAIL" />) मा पासवर्डहरू सेभ गर्न तथा उक्त खातामा भएका पासवर्डहरू प्रयोग गर्न आफ्नो पहिचान पुष्टि गर्नुहोस्</translation>
 <translation id="8965037249707889821">पुरानो पासवर्ड प्रविष्टि गर्नुहोस्</translation>
+<translation id="8967403839792635452">एक्स्टेन्सनहरू विकास गर्दै हुनुहुन्छ? Chrome एक्सटेन्सनको विकासकर्ता मार्गदर्शक पढेर <ph name="BEGIN_LINK" />नयाँ कुरा<ph name="END_LINK" />का बारेमा ताजा जानकारी प्राप्त गर्नुहोस्।</translation>
 <translation id="8967427617812342790">पाठ्य सूचीमा थप्नुहोस्</translation>
 <translation id="8967548289042494261"><ph name="VM_NAME" /> हटाउनुहोस्</translation>
 <translation id="8968527460726243404">ChromeOS प्रणाली फोटो लेखक</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 1b258ef..d3fe9b8 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -1251,6 +1251,7 @@
 <translation id="185111092974636561"><ph name="BEGIN_PARAGRAPH1" />Voordat je je inschrijft, moet je de TPM wissen, zodat <ph name="DEVICE_OS" /> eigenaar van het apparaat kan worden.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Je kunt de TPM op het apparaat ook helemaal uitzetten. Je gegevens worden nog steeds beveiligd opgeslagen met softwareversleuteling, maar bepaalde beveiligingsfuncties zoals certificaten met hardwareondersteuning worden uitgezet.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />Je kunt je TPM-instellingen wijzigen door opnieuw op te starten en naar de systeem-BIOS/UEFI-instellingen te gaan. De stappen hiervoor variëren op basis van het apparaatmodel. Open voor meer informatie de <ph name="DEVICE_OS" />-documentatie op een afzonderlijk apparaat voordat je opnieuw opstart: g.co/flex/TPMHelp.<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116"><ph name="TAB_NAME" /> wordt gedeeld met dit tabblad</translation>
 <translation id="1852799913675865625">Er is een fout opgetreden bij het lezen van het bestand: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1854180393107901205">Casten stoppen</translation>
 <translation id="1856715684130786728">Locatie toevoegen...</translation>
@@ -11273,6 +11274,7 @@
 <translation id="8963117664422609631">Naar de site-instellingen</translation>
 <translation id="8964927371396953727">Laat verifiëren dat jij het bent om wachtwoorden in je account <ph name="ACCOUNT_EMAIL" /> te gebruiken en op te slaan</translation>
 <translation id="8965037249707889821">Oud wachtwoord opgeven</translation>
+<translation id="8967403839792635452">Ontwikkel je extensies? Blijf op de hoogte van <ph name="BEGIN_LINK" />wat er nieuw is<ph name="END_LINK" /> met de documentatie voor ontwikkelaars van Chrome-extensies.</translation>
 <translation id="8967427617812342790">Toevoegen aan leeslijst</translation>
 <translation id="8967548289042494261"><ph name="VM_NAME" /> verwijderen</translation>
 <translation id="8968527460726243404">ChromeOS System Image Writer</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb
index 9e18f4a..eb28555 100644
--- a/chrome/app/resources/generated_resources_or.xtb
+++ b/chrome/app/resources/generated_resources_or.xtb
@@ -1248,6 +1248,7 @@
 <translation id="185111092974636561"><ph name="BEGIN_PARAGRAPH1" />ପଞ୍ଜିକରଣ କରିବା ପୂର୍ବରୁ ଆପଣ TPMକୁ ଖାଲି କରିବା ଆବଶ୍ୟକ ଯାହା ଫଳରେ ଡିଭାଇସର ମାଲିକାନା <ph name="DEVICE_OS" /> ନେଇପାରିବ।<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />ଆପଣ TPM ଡିଭାଇସକୁ ସମ୍ପୂର୍ଣ୍ଣ ଭାବେ ବନ୍ଦ ମଧ୍ୟ କରିପାରିବେ। ସଫ୍ଟୱେର ଏନକ୍ରିପସନ ସହ ଆପଣଙ୍କ ଡାଟା ଏବେ ବି ସୁରକ୍ଷିତ ଭାବେ ଷ୍ଟୋର ହେବ, କିନ୍ତୁ ହାର୍ଡୱେର-ସମର୍ଥିତ ସାର୍ଟିଫିକେଟ ପରି ନିର୍ଦ୍ଦିଷ୍ଟ ସୁରକ୍ଷା ଫିଚରଗୁଡ଼ିକ ଅକ୍ଷମ ହୋଇଯିବ।<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />ରିବୁଟ କରି ଏବଂ ସିଷ୍ଟମ BIOS/UEFI ସେଟିଂସ ଲେଖି ଆପଣ ଆପଣଙ୍କ TPM ସେଟିଂସକୁ ପରିବର୍ତ୍ତନ କରିପାରିବେ। ଡିଭାଇସର ମଡେଲ ଆଧାରରେ ଷ୍ଟେପଗୁଡ଼ିକ ଭିନ୍ନ ହୋଇଥାଏ। ଅଧିକ ସୂଚନା ପାଇଁ, ଆପଣ ରିବୁଟ କରିବା ପୂର୍ବରୁ ଏକ ଅଲଗା ଡିଭାଇସରେ <ph name="DEVICE_OS" />ର ଡକ୍ୟୁମେଣ୍ଟେସନକୁ ଖୋଲନ୍ତୁ: g.co/flex/TPMHelp।<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116">ଏହି ଟାବରେ <ph name="TAB_NAME" /> ସେୟାର କରାଯାଉଛି</translation>
 <translation id="1852799913675865625">ଫାଇଲ୍‌ ପଢିବା ପାଇଁ ଚେଷ୍ଟା କରିବା ସମୟରେ ଏକ ତ୍ରୁଟି ହୋ‍ଇଛି: <ph name="ERROR_TEXT" />।</translation>
 <translation id="1854180393107901205">କାଷ୍ଟ କରିବା ବନ୍ଦ କରନ୍ତୁ</translation>
 <translation id="1856715684130786728">ଲୋକେସନ୍ ଯୋଗ କରନ୍ତୁ...</translation>
@@ -1637,6 +1638,7 @@
 <translation id="2121825465123208577">ଆକାର ବଦଳାନ୍ତୁ</translation>
 <translation id="2123766928840368256">ଏକ ଭିନ୍ନ ଫାଇଲ୍ ବାଛନ୍ତୁ</translation>
 <translation id="2124930039827422115">{1,plural, =1{ଜଣେ ୟୁଜରଙ୍କ ଦ୍ଵାରା <ph name="AVERAGE_RATING" /> ମୂଲ୍ୟାଙ୍କିତ କରାଯାଇଛି।}other{# ଜଣ ୟୁଜରଙ୍କ ଦ୍ଵାରା <ph name="AVERAGE_RATING" /> ମୂଲ୍ୟାଙ୍କିତ କରାଯାଇଛି।}}</translation>
+<translation id="2125715366913703594">ଏକ୍ସପ୍ଲୋର ଏବଂ ଏକ୍ସଟେନସନ</translation>
 <translation id="2126167708562367080">ଆପଣଙ୍କର ବ୍ୟବସ୍ଥାପକଙ୍କ ଦ୍ୱାରା ସିଙ୍କ ଅକ୍ଷମ କରାଯାଇଛି।</translation>
 <translation id="2127372758936585790">କମ୍-ଶକ୍ତି ବିଶିଷ୍ଟ ଚାର୍ଜର୍</translation>
 <translation id="212862741129535676">ଫ୍ରିକ୍ୱେନ୍ସି ସ୍ଥିତି ଦଖଲର ଶତକଡ଼ା ହାର</translation>
@@ -11274,6 +11276,7 @@
 <translation id="8963117664422609631">ସାଇଟ୍ ସେଟିଂସକୁ ଯାଆନ୍ତୁ</translation>
 <translation id="8964927371396953727">ଆପଣଙ୍କ <ph name="ACCOUNT_EMAIL" /> ଆକାଉଣ୍ଟରେ ପାସୱାର୍ଡଗୁଡ଼ିକୁ ବ୍ୟବହାର ଏବଂ ସେଭ କରିବା ପାଇଁ ଏହା ଆପଣ ବୋଲି ଯାଞ୍ଚ କରନ୍ତୁ</translation>
 <translation id="8965037249707889821">ପୁରୁଣା ପାସ୍‌ୱାର୍ଡ ଲେଖନ୍ତୁ</translation>
+<translation id="8967403839792635452">ଏକ୍ସଟେନସନ ଡେଭେଲପ କରୁଛନ୍ତି? Chrome ଏକ୍ସଟେନସନ ଡେଭଲପର ଡକ୍ୟୁମେଣ୍ଟେସନ ସହିତ <ph name="BEGIN_LINK" />ନୂଆ କଣ ଅଛି<ph name="END_LINK" /> ସେ ବିଷୟରେ ଅପଟୁଡେଟ ରୁହନ୍ତୁ।</translation>
 <translation id="8967427617812342790">ପଢ଼ିବା ତାଲିକାରେ ଯୋଗ କରନ୍ତୁ</translation>
 <translation id="8967548289042494261"><ph name="VM_NAME" />କୁ କାଢ଼ି ଦିଅନ୍ତୁ</translation>
 <translation id="8968527460726243404">ChromeOS ସିଷ୍ଟମ ଇମେଜ ରାଇଟର</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index bd05a33f..96d3f211 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -1252,6 +1252,7 @@
 <translation id="185111092974636561"><ph name="BEGIN_PARAGRAPH1" />Înainte să te înregistrezi, trebuie să ștergi TPM-ul pentru ca <ph name="DEVICE_OS" /> să preia controlul asupra dispozitivului.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Poți și să dezactivezi complet dispozitivul TPM. Datele tale vor fi stocate în siguranță prin criptarea software-ului, dar anumite funcții de securitate, cum ar fi certificatele stocate pe hardware, vor fi dezactivate.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />Poți modifica setările TPM prin repornirea sistemului și accesarea setărilor BIOS / UEFI. Pașii variază în funcție de modelul dispozitivului. Pentru mai multe informații, deschide documentația <ph name="DEVICE_OS" /> pe alt dispozitiv înainte de repornire: g.co/flex/TPMHelp.<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116">Se trimite <ph name="TAB_NAME" /> către această filă</translation>
 <translation id="1852799913675865625">A apărut o eroare la citirea fișierului: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1854180393107901205">Nu mai trimite</translation>
 <translation id="1856715684130786728">Adăugați o locație...</translation>
@@ -1641,6 +1642,7 @@
 <translation id="2121825465123208577">Redimensionează</translation>
 <translation id="2123766928840368256">Alege alt fișier</translation>
 <translation id="2124930039827422115">{1,plural, =1{Evaluat cu <ph name="AVERAGE_RATING" /> de 1 utilizator.}few{Evaluat cu <ph name="AVERAGE_RATING" /> de # utilizatori.}other{Evaluat cu <ph name="AVERAGE_RATING" /> de # de utilizatori.}}</translation>
+<translation id="2125715366913703594">Explorează &amp;Extensii</translation>
 <translation id="2126167708562367080">Sincronizarea este dezactivată de administrator.</translation>
 <translation id="2127372758936585790">Încărcător de putere joasă</translation>
 <translation id="212862741129535676">Procentaj de ocupare în starea activă</translation>
@@ -11283,6 +11285,7 @@
 <translation id="8963117664422609631">Accesează setările site-ului</translation>
 <translation id="8964927371396953727">Confirmă-ți identitatea pentru a folosi și a salva parole în contul <ph name="ACCOUNT_EMAIL" /></translation>
 <translation id="8965037249707889821">Introduceți parola veche</translation>
+<translation id="8967403839792635452">Dezvolți extensii? Rămâi la curent cu <ph name="BEGIN_LINK" />Noutățile<ph name="END_LINK" /> din documentația pentru dezvoltatori privind extensiile Chrome.</translation>
 <translation id="8967427617812342790">Adaugă în lista de lectură</translation>
 <translation id="8967548289042494261">Elimină <ph name="VM_NAME" /></translation>
 <translation id="8968527460726243404">Instrument de scriere a imaginilor de sistem pentru sistemul de operare Chrome</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 521e85d..d3c2a80 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -1253,6 +1253,7 @@
 <translation id="185111092974636561"><ph name="BEGIN_PARAGRAPH1" />Перед регистрацией нужно очистить TPM, чтобы операционная система <ph name="DEVICE_OS" /> могла управлять устройством.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Вы также можете полностью отключить TPM на устройстве. В этом случае данные по-прежнему будут программно шифроваться во время хранения, но некоторые функции безопасности, например аппаратные сертификаты, станут недоступны.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />Параметры TPM можно изменить в настройках BIOS/UEFI во время перезагрузки системы. Конкретные действия зависят от модели. Перед перезагрузкой изучите документацию <ph name="DEVICE_OS" /> на другом устройстве: g.co/flex/TPMHelp.<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116">Демонстрация вкладки "<ph name="TAB_NAME" />" на этой вкладке</translation>
 <translation id="1852799913675865625">Произошла ошибка при чтении файла: <ph name="ERROR_TEXT" />.</translation>
 <translation id="1854180393107901205">Прекратить трансляцию</translation>
 <translation id="1856715684130786728">Добавить папку...</translation>
@@ -1642,6 +1643,7 @@
 <translation id="2121825465123208577">Изменить размер</translation>
 <translation id="2123766928840368256">Выбрать другой файл</translation>
 <translation id="2124930039827422115">{1,plural, =1{1 пользователь поставил оценку <ph name="AVERAGE_RATING" />.}one{# пользователь поставил оценку <ph name="AVERAGE_RATING" />.}few{# пользователя поставили оценку <ph name="AVERAGE_RATING" />.}many{# пользователей поставили оценку <ph name="AVERAGE_RATING" />.}other{# пользователя поставили оценку <ph name="AVERAGE_RATING" />.}}</translation>
+<translation id="2125715366913703594">Посмотреть &amp;расширения</translation>
 <translation id="2126167708562367080">Ваш администратор отключил синхронизацию.</translation>
 <translation id="2127372758936585790">Маломощное зарядное устройство</translation>
 <translation id="212862741129535676">Продолжительность работы процессора на разных ступенях частоты в процентах</translation>
@@ -11291,6 +11293,7 @@
 <translation id="8963117664422609631">Открыть настройки сайтов</translation>
 <translation id="8964927371396953727">Подтвердите свою личность, чтобы использовать и сохранять пароли в аккаунте <ph name="ACCOUNT_EMAIL" />.</translation>
 <translation id="8965037249707889821">Введите старый пароль</translation>
+<translation id="8967403839792635452">Вы создаете расширения? Следите за новостями в документации для разработчиков расширений Chrome на странице <ph name="BEGIN_LINK" />Что нового<ph name="END_LINK" />.</translation>
 <translation id="8967427617812342790">Добавить в список для чтения</translation>
 <translation id="8967548289042494261">Удаление <ph name="VM_NAME" /></translation>
 <translation id="8968527460726243404">Системное средство записи изображений в Chrome OS</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 509768a..b8646c7 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -1653,6 +1653,7 @@
 <translation id="2121825465123208577">Spreminjanje velikosti</translation>
 <translation id="2123766928840368256">Izberi drugo datoteko</translation>
 <translation id="2124930039827422115">{1,plural, =1{Ocena: <ph name="AVERAGE_RATING" /> – en uporabnik}one{Ocena: <ph name="AVERAGE_RATING" /> – # uporabnik}two{Ocena: <ph name="AVERAGE_RATING" /> – # uporabnika}few{Ocena: <ph name="AVERAGE_RATING" /> – # uporabniki}other{Ocena: <ph name="AVERAGE_RATING" /> – # uporabnikov}}</translation>
+<translation id="2125715366913703594">Raziščite &amp;razširitve</translation>
 <translation id="2126167708562367080">Sinhronizacijo je onemogočil skrbnik.</translation>
 <translation id="2127372758936585790">Nizkoenergijski polnilnik</translation>
 <translation id="212862741129535676">Odstotek zasedenosti frekvenčnega stanja</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 361edf8c..681598d 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -1650,6 +1650,7 @@
 <translation id="2121825465123208577">Ändra storlek</translation>
 <translation id="2123766928840368256">Välj en annan fil</translation>
 <translation id="2124930039827422115">{1,plural, =1{Fått betyget <ph name="AVERAGE_RATING" /> av en användare.}other{Fått betyget <ph name="AVERAGE_RATING" /> av # användare.}}</translation>
+<translation id="2125715366913703594">Utforska &amp;tillägg</translation>
 <translation id="2126167708562367080">Synkronisering har inaktiverats av administratören.</translation>
 <translation id="2127372758936585790">Laddning med låg effekt</translation>
 <translation id="212862741129535676">Kapacitetsprocentsats för frekvens</translation>
@@ -3254,7 +3255,7 @@
 <translation id="3251714896659475029">Låt <ph name="SUPERVISED_USER_NAME" /> få åtkomst till Google Assistent med ”Hey Google”</translation>
 <translation id="3251759466064201842">&lt;ingår inte i certifikat&gt;</translation>
 <translation id="325238099842880997">Skapa digitala regler för hur barnen får spela, utforska och göra skolarbetet hemifrån</translation>
-<translation id="3253225298092156258">Inte tillgängligt</translation>
+<translation id="3253225298092156258">Inte tillgänglig</translation>
 <translation id="3253344772044554413">{NUM_OF_FILES,plural, =1{Frigör utrymme på <ph name="CLOUD_PROVIDER" /> om du vill kopiera den här filen}other{Frigör utrymme på <ph name="CLOUD_PROVIDER" /> om du vill kopiera de här filerna}}</translation>
 <translation id="3253448572569133955">Okänt konto</translation>
 <translation id="3254451942070605467">Laddar ned <ph name="FILE_NAME" />, <ph name="PERCENT_REMAINING" /> % återstår</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 31cc612..05413ef 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1641,6 +1641,7 @@
 <translation id="2121825465123208577">ปรับขนาด</translation>
 <translation id="2123766928840368256">เลือกไฟล์อื่น</translation>
 <translation id="2124930039827422115">{1,plural, =1{ได้คะแนน <ph name="AVERAGE_RATING" /> จากผู้ใช้ 1 ราย}other{ได้คะแนน <ph name="AVERAGE_RATING" /> จากผู้ใช้ # ราย}}</translation>
+<translation id="2125715366913703594">สำรวจและส่วนขยาย</translation>
 <translation id="2126167708562367080">ผู้ดูแลระบบปิดใช้การซิงค์</translation>
 <translation id="2127372758936585790">ที่ชาร์จพลังงานต่ำ</translation>
 <translation id="212862741129535676">เปอร์เซ็นต์การเกิดขึ้นของสถานะความถี่</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 4c8a6e4..f7f4832 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -1633,6 +1633,7 @@
 <translation id="2121825465123208577">调整大小</translation>
 <translation id="2123766928840368256">另选一个文件</translation>
 <translation id="2124930039827422115">{1,plural, =1{已有一位用户给出了 <ph name="AVERAGE_RATING" /> 的评分。}other{已有 # 位用户给出评分,平均评分为 <ph name="AVERAGE_RATING" />。}}</translation>
+<translation id="2125715366913703594">探索扩展程序(&amp;E)</translation>
 <translation id="2126167708562367080">您的管理员已停用同步。</translation>
 <translation id="2127372758936585790">低功率充电器</translation>
 <translation id="212862741129535676">频率状态占用率</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb
index 8e781563..e2062a53 100644
--- a/chrome/app/resources/generated_resources_zh-HK.xtb
+++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -1260,6 +1260,7 @@
     <ph name="BEGIN_PARAGRAPH2" />您亦可完全關閉 TPM 裝置。系統仍會透過軟件加密功能安全儲存您的資料,但會停用硬件支援憑證等特定安全性功能。<ph name="END_PARAGRAPH2" />
     
 <ph name="BEGIN_PARAGRAPH3" />如要變更 TPM 設定,請重新啟動並進入系統的 BIOS/UEFI 設定。操作步驟根據裝置型號而有所不同。如需更多資料,請在重新啟動前使用其他裝置開啟 <ph name="DEVICE_OS" /> 文件:g.co/flex/TPMHelp。<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116">正在與此分頁共用「<ph name="TAB_NAME" />」</translation>
 <translation id="1852799913675865625">嘗試讀取檔案時發生錯誤:<ph name="ERROR_TEXT" /></translation>
 <translation id="1854180393107901205">停止投放</translation>
 <translation id="1856715684130786728">新增位置…</translation>
@@ -1650,6 +1651,7 @@
 <translation id="2121825465123208577">調整大小</translation>
 <translation id="2123766928840368256">選擇其他檔案</translation>
 <translation id="2124930039827422115">{1,plural, =1{已有一位使用者給予 <ph name="AVERAGE_RATING" /> 分。}other{已有 # 位使用者給予 <ph name="AVERAGE_RATING" /> 分。}}</translation>
+<translation id="2125715366913703594">探索擴充程式 (&amp;E)</translation>
 <translation id="2126167708562367080">管理員已停用同步功能。</translation>
 <translation id="2127372758936585790">低功率充電器</translation>
 <translation id="212862741129535676">頻率狀態佔用率</translation>
@@ -11277,6 +11279,7 @@
 <translation id="8963117664422609631">前往網站設定</translation>
 <translation id="8964927371396953727">請驗證你的身分,以在帳戶 <ph name="ACCOUNT_EMAIL" /> 中使用及儲存密碼</translation>
 <translation id="8965037249707889821">輸入舊密碼</translation>
+<translation id="8967403839792635452">正在開發擴充程式嗎?參閱 Chrome 擴充功能開發人員文件,掌握<ph name="BEGIN_LINK" />最新資訊<ph name="END_LINK" />。</translation>
 <translation id="8967427617812342790">加入閱讀清單</translation>
 <translation id="8967548289042494261">移除 <ph name="VM_NAME" /></translation>
 <translation id="8968527460726243404">Chrome 作業系統圖片撰寫工具</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 38ccc83d..53df6e4 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -1251,6 +1251,7 @@
 <translation id="185111092974636561"><ph name="BEGIN_PARAGRAPH1" />進行註冊前,你必須清除 TPM,<ph name="DEVICE_OS" /> 才能取得裝置的擁有權。<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />你也可以完全關閉 TPM 裝置。系統仍會透過軟體加密功能安全儲存你的資料,但會停用硬體支援憑證等特定安全性功能。<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />只要重新啟動並進入系統 BIOS/UEFI 設定,即可變更 TPM 設定。操作步驟會因裝置型號而有所不同。如需更多資訊,請在重新啟動前使用其他裝置開啟 <ph name="DEVICE_OS" /> 說明文件:g.co/flex/TPMHelp。<ph name="END_PARAGRAPH3" /></translation>
+<translation id="1851551847729706116">正在與這個分頁共用「<ph name="TAB_NAME" />」</translation>
 <translation id="1852799913675865625">嘗試讀取檔案時發生錯誤:<ph name="ERROR_TEXT" /></translation>
 <translation id="1854180393107901205">停止投放</translation>
 <translation id="1856715684130786728">新增位置...</translation>
@@ -1640,6 +1641,7 @@
 <translation id="2121825465123208577">調整大小</translation>
 <translation id="2123766928840368256">選擇其他檔案</translation>
 <translation id="2124930039827422115">{1,plural, =1{平均評分:<ph name="AVERAGE_RATING" /> (評分人數:1)。}other{平均評分:<ph name="AVERAGE_RATING" /> (評分人數:#)。}}</translation>
+<translation id="2125715366913703594">探索擴充功能(&amp;E)</translation>
 <translation id="2126167708562367080">你的管理員停用了同步功能。</translation>
 <translation id="2127372758936585790">低功率充電器</translation>
 <translation id="212862741129535676">頻率狀態占用率</translation>
@@ -11271,6 +11273,7 @@
 <translation id="8963117664422609631">前往網站設定</translation>
 <translation id="8964927371396953727">請驗證身分,才能將密碼儲存到帳戶 (<ph name="ACCOUNT_EMAIL" />),或使用帳戶中的密碼</translation>
 <translation id="8965037249707889821">輸入先前的密碼</translation>
+<translation id="8967403839792635452">正在開發擴充功能嗎?歡迎參閱 Chrome 擴充功能開發人員說明文件,隨時掌握<ph name="BEGIN_LINK" />最新資訊<ph name="END_LINK" />。</translation>
 <translation id="8967427617812342790">加入閱讀清單</translation>
 <translation id="8967548289042494261">移除「<ph name="VM_NAME" />」</translation>
 <translation id="8968527460726243404">Chrome 作業系統映像檔寫入工具</translation>
diff --git a/chrome/app/resources/google_chrome_strings_af.xtb b/chrome/app/resources/google_chrome_strings_af.xtb
index 4729cac4..1b063710 100644
--- a/chrome/app/resources/google_chrome_strings_af.xtb
+++ b/chrome/app/resources/google_chrome_strings_af.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">Chrome OS Flex kon nie jou data sinkroniseer nie omdat sinkronisering nie vir jou domein beskikbaar is nie.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> is reeds aangemeld.  Meld in jou eie profiel as <ph name="USER_EMAIL_ADDRESS" /> by Chrome aan om jou blaai-aktiwiteit apart te hou.</translation>
 <translation id="4855026984605187434">Om jou skerm te deel, moet jy skermopname vir Chrome in Stelselinstellings toelaat.</translation>
-<translation id="4873692836499071887">Jy het macOS 11 of nuwer nodig om in die toekoms Google Chrome-opdaterings te kry. Hierdie rekenaar gebruik macOS 10.15.</translation>
 <translation id="4873783916118289636">Gaan belangrike privaatheid- en sekuriteitkontroles in Chrome na</translation>
 <translation id="4885446229353981848">Wys altyd Google Lens-kortpad</translation>
 <translation id="4891791193823137474">Laat Google Chrome in die agtergrond loop.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb
index 202c309f..f5e4e40 100644
--- a/chrome/app/resources/google_chrome_strings_am.xtb
+++ b/chrome/app/resources/google_chrome_strings_am.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">ስምረት ለጎራዎ ስለማይገኝ ChromeOS Flex ውሂብዎን ማስመር አልቻለም።</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> አስቀድመው ገብተዋል።  አሰሳዎን ለያይተው ለመጠቀም በራስዎ መገለጫ ውስጥ እንደ <ph name="USER_EMAIL_ADDRESS" /> ሆነው ወደ Chrome ይግቡ።</translation>
 <translation id="4855026984605187434">ማያ ገፅዎን ለማጋራት በሥርዓት ቅንብሮች ውስጥ ለChrome የማያ ገፅ መቅረጽን ይፍቀዱ</translation>
-<translation id="4873692836499071887">የወደፊት የGoogle Chrome ዝማኔዎችን ለማግኘት macOS 11 ወይም ከዚያ በላይ ያስፈልግዎታል። ይህ ኮምፒውተር macOS 10.15 እየተጠቀመ ነው።</translation>
 <translation id="4873783916118289636">በChrome ውስጥ ቁልፍ የግላዊነት እና የደህንነት ቁጥጥሮችን ይገምግሙ</translation>
 <translation id="4885446229353981848">የGoogle ሌንስ አቋራጭን ሁልጊዜ አሳይ</translation>
 <translation id="4891791193823137474">Google Chrome በጀርባ ውስጥ ይሂድ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb
index 60ef755..0bb1900 100644
--- a/chrome/app/resources/google_chrome_strings_ar.xtb
+++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -298,7 +298,6 @@
 <translation id="4842397268809523050">‏تعذَّر على ChromeOS Flex مزامنة البيانات لأنّ ميزة المزامنة غير متاحة لنطاقك.</translation>
 <translation id="4851866215237571846">‏سبق أن تم تسجيل الدخول إلى حساب "<ph name="EXISTING_USER" />".  للحصول على تجربة تصفّح منفصلة، سجِّل الدخول إلى Chrome في ملفك الشخصي باستخدام العنوان <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">‏لمشاركة شاشتك، يجب السماح بتسجيل الشاشة في Chrome ضِمن "إعدادات النظام" (System Settings)</translation>
-<translation id="4873692836499071887">‏للحصول على تحديثات Google Chrome في المستقبل، يجب استخدام جهاز يعمل بنظام التشغيل macOS 11 أو إصدار أحدث. ويعمل هذا الكمبيوتر بنظام التشغيل macOS 10.15.</translation>
 <translation id="4873783916118289636">‏يمكنك مراجعة العناصر الرئيسية للتحكّم في الخصوصية والأمان في Chrome.</translation>
 <translation id="4885446229353981848">‏إظهار اختصار "عدسة Google" دائمًا</translation>
 <translation id="4891791193823137474">‏دع Google Chrome يعمل في الخلفية</translation>
diff --git a/chrome/app/resources/google_chrome_strings_as.xtb b/chrome/app/resources/google_chrome_strings_as.xtb
index 4e502fb..c483890 100644
--- a/chrome/app/resources/google_chrome_strings_as.xtb
+++ b/chrome/app/resources/google_chrome_strings_as.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">আপোনাৰ ড’মেইনত ছিংক কৰাৰ সুবিধা নথকাৰ বাবে ChromeOS Flexএ আপোনাৰ ডেটা ছিংক কৰিব নোৱাৰিলে।</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> ইতিমধ্যে ছাইন ইন হৈ আছে।  আপোনাৰ ব্ৰাউজিং পৃথক কৰি ৰাখিবলৈ, আপোনাৰ নিজৰ প্ৰ’ফাইলত <ph name="USER_EMAIL_ADDRESS" /> হিচাপে Chromeত ছাইন ইন কৰক</translation>
 <translation id="4855026984605187434">আপোনাৰ স্ক্ৰীনখন শ্বেয়াৰ কৰিবলৈ, ছিষ্টেমৰ ছেটিঙত Chromeৰ বাবে স্ক্ৰীন ৰেকৰ্ডিঙৰ অনুমতি দিয়ক</translation>
-<translation id="4873692836499071887">Google Chromeৰ ভৱিষ্যতৰ আপডে’টসমূহ পাবলৈ আপোনাক macOS 11 অথবা তাৰ পাছৰ সংস্কৰণৰ আৱশ্যক হ’ব। এই কম্পিউটাৰটোৱে macOS 10.15 ব্যৱহাৰ কৰি আছে।</translation>
 <translation id="4873783916118289636">Chromeত গোপনীয়তা আৰু সুৰক্ষা সম্পৰ্কীয় মুখ্য নিয়ন্ত্ৰণসমূহ পৰ্যালোচনা কৰক</translation>
 <translation id="4885446229353981848">সকলো সময়তে Google Lensৰ শ্বৰ্টকাট দেখুৱাওক</translation>
 <translation id="4891791193823137474">Google Chromeক নেপথ্যত চলিবলৈ দিয়ক</translation>
diff --git a/chrome/app/resources/google_chrome_strings_az.xtb b/chrome/app/resources/google_chrome_strings_az.xtb
index 85f6d5f7..06d3049 100644
--- a/chrome/app/resources/google_chrome_strings_az.xtb
+++ b/chrome/app/resources/google_chrome_strings_az.xtb
@@ -298,7 +298,6 @@
 <translation id="4842397268809523050">ChromeOS Flex datanızı sinxronizasiya edə bilmədi, çünki sinxronizasiya domeniniz üçün əlçatan deyil.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> artıq giriş edib.  Baxışı ayrı saxlamaq üçün öz profilinizdə Chrome-a <ph name="USER_EMAIL_ADDRESS" /> kimi daxil olun.</translation>
 <translation id="4855026984605187434">Ekranı paylaşmaq üçün Sistem Ayarlarında Chrome üçün ekranın qeydə alınmasına icazə verin</translation>
-<translation id="4873692836499071887">Google Chrome güncəlləmələri əldə etmək üçün macOS 11 və ya yeni versiya tələb olunur. Bu kompüter macOS 10.15 istifadə edir.</translation>
 <translation id="4873783916118289636">Chrome'da əsas məxfilik və təhlükəsizlik nəzarətlərini nəzərdən keçirin</translation>
 <translation id="4885446229353981848">Google Linza qısayolu hər zaman göstərilsin</translation>
 <translation id="4891791193823137474">Google Chrome'a arxa fonda işləməyə icazə verin</translation>
diff --git a/chrome/app/resources/google_chrome_strings_be.xtb b/chrome/app/resources/google_chrome_strings_be.xtb
index 860afe8..d10c6af 100644
--- a/chrome/app/resources/google_chrome_strings_be.xtb
+++ b/chrome/app/resources/google_chrome_strings_be.xtb
@@ -299,7 +299,6 @@
 <translation id="4842397268809523050">АС Chrome OS Flex не змагла сінхранізаваць даныя: для вашага дамена сінхранізацыя недаступная.</translation>
 <translation id="4851866215237571846">Карыстальнік <ph name="EXISTING_USER" /> ужо ўвайшоў.  Каб аддзяліць сваю працу ў інтэрнэце ад працы іншых карыстальнікаў, увайдзіце ў Chrome ва ўласны профіль як <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Каб абагуліць экран, у сістэмных наладах дазвольце браўзеру Chrome запіс экрана</translation>
-<translation id="4873692836499071887">Каб атрымліваць будучыя абнаўленні Google Chrome, патрабуецца macOS 11 ці пазнейшай версіі. На гэтым камп’ютары выкарыстоўваецца macOS 10.15.</translation>
 <translation id="4873783916118289636">Праверка ключавых налад бяспекі і прыватнасці ў Chrome</translation>
 <translation id="4885446229353981848">Заўсёды паказваць ярлык "Google Аб’ектыў"</translation>
 <translation id="4891791193823137474">Дазволіць Google Chrome працаваць у фонавым рэжыме</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb
index 6edfc119..4f5be5c0 100644
--- a/chrome/app/resources/google_chrome_strings_bg.xtb
+++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -298,7 +298,6 @@
 <translation id="4842397268809523050">ChromeOS Flex не успя да синхронизира данните ви, защото синхронизирането не е налице за домейна ви.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> вече е в профила си.  За да бъде сърфирането ви отделно, влезте в Chrome със свой собствен потребителски профил като <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">За да споделите екрана си, разрешете записването на екрана за Chrome в System Settings</translation>
-<translation id="4873692836499071887">За да получавате бъдещи актуализации на Google Chrome, трябва да използвате macOS 11 или по-нова версия. Компютърът ви работи с macOS 10.15.</translation>
 <translation id="4873783916118289636">Прегледайте ключовите контроли в Chrome за поверителност и сигурност</translation>
 <translation id="4885446229353981848">Прекият път към Google Обектив да се показва винаги</translation>
 <translation id="4891791193823137474">Google Chrome да се изпълнява на заден план</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb
index bd242f43..64e2c7a 100644
--- a/chrome/app/resources/google_chrome_strings_bn.xtb
+++ b/chrome/app/resources/google_chrome_strings_bn.xtb
@@ -298,7 +298,6 @@
 <translation id="4842397268809523050">আপনার ডোমেনে সিঙ্ক করার সুবিধা উপলভ্য না থাকার জন্য ChromeOS Flex আপনার ডেটা সিঙ্ক পারেনি।</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> আগেই সাইন-ইন করেছেন।  আপনি আলাদাভাবে ব্রাউজ করতে চাইলে, নিজের Chrome প্রোফাইলে <ph name="USER_EMAIL_ADDRESS" /> হিসেবে সাইন-ইন করুন।</translation>
 <translation id="4855026984605187434">আপনার স্ক্রিন শেয়ার করতে, সিস্টেম সেটিংস থেকে Chrome-এর জন্য স্ক্রিন রেকর্ডিংয়ের অনুমতি দিন</translation>
-<translation id="4873692836499071887">ভবিষ্যতে Google Chrome সম্পর্কিত আপডেট পেতে হলে, আপনার কাছে macOS 11 বা তার পরবর্তী ভার্সন থাকতে হবে। এই কম্পিউটারে macOS 10.15 ভার্সন ব্যবহার করা হচ্ছে।</translation>
 <translation id="4873783916118289636">Chrome-এ মূল গোপনীয়তা এবং নিরাপত্তা নিয়ন্ত্রণ পর্যালোচনা করুন</translation>
 <translation id="4885446229353981848">সব সময় Google Lens শর্টকাট দেখুন</translation>
 <translation id="4891791193823137474">Google Chrome-কে ব্যাকগ্রাউন্ডে চলতে দিন</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bs.xtb b/chrome/app/resources/google_chrome_strings_bs.xtb
index 3dfe365..920c1cd8 100644
--- a/chrome/app/resources/google_chrome_strings_bs.xtb
+++ b/chrome/app/resources/google_chrome_strings_bs.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">ChromeOS Flex nije mogao sinhronizirati vaše podatke jer sinhronizacija nije dostupna za vašu domenu.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> je već prijavljen(a).  Da vaše pregledanje ostane odvojeno, prijavite se u Chrome na vlastitom profilu kao <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Da podijelite ekran, dozvolite snimanje ekrana za Chrome u Postavkama sistema</translation>
-<translation id="4873692836499071887">Da primate buduća ažuriranja za Google Chrome, trebat će vam macOS 11 ili novija verzija. Ovaj računar koristi macOS 10.15.</translation>
 <translation id="4873783916118289636">Pregledajte ključne kontrole privatnosti i sigurnosti u Chromeu</translation>
 <translation id="4885446229353981848">Uvijek prikazuj prečicu Google Objektiva</translation>
 <translation id="4891791193823137474">Neka Google Chrome radi u pozadini</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb
index f123df4..73e03ae896 100644
--- a/chrome/app/resources/google_chrome_strings_ca.xtb
+++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">ChromeOS Flex no ha pogut sincronitzar les teves dades perquè la sincronització no està disponible per al teu domini.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> ja ha iniciat la sessió.  Per mantenir la navegació per separat, inicia la sessió a Chrome amb el teu perfil (<ph name="USER_EMAIL_ADDRESS" />).</translation>
 <translation id="4855026984605187434">Per compartir la pantalla, permet que Chrome gravi la pantalla a Configuració del sistema</translation>
-<translation id="4873692836499071887">Per obtenir actualitzacions de Google Chrome en un futur, necessitaràs macOS 11 o una versió posterior. Aquest ordinador utilitza macOS 10.15.</translation>
 <translation id="4873783916118289636">Revisa els controls principals de privadesa i seguretat a Chrome</translation>
 <translation id="4885446229353981848">Mostra sempre la drecera de Google Lens</translation>
 <translation id="4891791193823137474">Permet que Google Chrome s'executi en procés de fons</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb
index 8fbd53d..215dc472 100644
--- a/chrome/app/resources/google_chrome_strings_cs.xtb
+++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -299,7 +299,6 @@
 <translation id="4842397268809523050">Systém ChromeOS Flex nemůže synchronizovat data, protože ve vaší doméně není k dispozici Synchronizace.</translation>
 <translation id="4851866215237571846">Už je přihlášen uživatel <ph name="EXISTING_USER" />.  Pokud své procházení chcete oddělit, přihlaste se do Chromu ve svém vlastním profilu jako <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Pokud chcete sdílet obrazovku, v Nastavení systému povolte pro Chrome nahrávání obrazovky</translation>
-<translation id="4873692836499071887">Pokud chcete v budoucnu dostávat aktualizace prohlížeče Google Chrome, budete potřebovat systém MacOS 11 nebo novější. Tento počítač používá systém macOS 10.15.</translation>
 <translation id="4873783916118289636">Zkontrolujte klíčové ovládací prvky ochrany soukromí a zabezpečení v Chromu</translation>
 <translation id="4885446229353981848">Vždy zobrazovat zástupce Google Lens</translation>
 <translation id="4891791193823137474">Nechat aplikaci Google Chrome spuštěnou na pozadí</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cy.xtb b/chrome/app/resources/google_chrome_strings_cy.xtb
index 73a6e9bd..ad528e2 100644
--- a/chrome/app/resources/google_chrome_strings_cy.xtb
+++ b/chrome/app/resources/google_chrome_strings_cy.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">Nid oedd ChromeOS Flex yn gallu cysoni eich data gan nad yw Cysoni ar gael ar gyfer eich parth.</translation>
 <translation id="4851866215237571846">Mae <ph name="EXISTING_USER" /> eisoes wedi mewngofnodi.  I gadw'ch pori ar wahân, mewngofnodwch i Chrome yn eich proffil eich hun fel <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">I rannu'ch sgrîn, caniatewch recordio sgrîn ar gyfer Chrome yn y Gosodiadau System</translation>
-<translation id="4873692836499071887">I gael diweddariadau Google Chrome yn y dyfodol, bydd angen macOS 11 neu'n hwyrach arnoch. Mae'r cyfrifiadur hwn yn defnyddio macOS 10.15.</translation>
 <translation id="4873783916118289636">Adolygu rheolyddion diogelwch a phreifatrwydd allweddol yn Chrome</translation>
 <translation id="4885446229353981848">Dangos llwybr byr Google Lens bob amser</translation>
 <translation id="4891791193823137474">Caniatáu i Google Chrome redeg yn y cefndir</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb
index 4bf62e9..ab0fddf 100644
--- a/chrome/app/resources/google_chrome_strings_da.xtb
+++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">ChromeOS Flex kunne ikke synkronisere dine data, da synkronisering ikke er tilgængelig på dit domæne.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> er allerede logget ind.  Hvis du vil holde din browsing adskilt, skal du logge ind i Chrome på din egen profil som <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Tillad skærmoptagelse for Chrome under Systemindstillinger for at dele din skærm.</translation>
-<translation id="4873692836499071887">Hvis du vil have fremtidige Google Chrome-opdateringer, skal du have macOS 11 eller nyere. Denne computer anvender macOS 10.15.</translation>
 <translation id="4873783916118289636">Gennemgå vigtige privatlivs- og sikkerhedsindstillinger i Chrome</translation>
 <translation id="4885446229353981848">Vis altid genvejen til Google Lens</translation>
 <translation id="4891791193823137474">Lad Google Chrome køre i baggrunden</translation>
diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb
index c75e8f92..8dc94c73 100644
--- a/chrome/app/resources/google_chrome_strings_de.xtb
+++ b/chrome/app/resources/google_chrome_strings_de.xtb
@@ -295,7 +295,6 @@
 <translation id="4842397268809523050">Chrome OS Flex konnte deine Daten nicht synchronisieren, da die Synchronisierung für deine Domain nicht zur Verfügung steht.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> ist bereits angemeldet.  Wenn du deine Browsingaktivitäten getrennt halten möchtest, melde dich in Chrome in deinem eigenen Profil als <ph name="USER_EMAIL_ADDRESS" /> an.</translation>
 <translation id="4855026984605187434">Wenn du deinen Bildschirm teilen möchtest, musst du in den Systemeinstellungen die Bildschirmaufzeichnung für Chrome zulassen</translation>
-<translation id="4873692836499071887">Du benötigst macOS 11 oder höher, um zukünftige Google Chrome-Updates zu erhalten. Auf diesem Computer wird macOS 10.15 ausgeführt.</translation>
 <translation id="4873783916118289636">Lerne die wichtigsten Datenschutz- und Sicherheitseinstellungen in Chrome kennen</translation>
 <translation id="4885446229353981848">Google Lens-Verknüpfung immer anzeigen</translation>
 <translation id="4891791193823137474">Google Chrome im Hintergrund ausführen</translation>
diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb
index b103b90..86570ca 100644
--- a/chrome/app/resources/google_chrome_strings_el.xtb
+++ b/chrome/app/resources/google_chrome_strings_el.xtb
@@ -298,7 +298,6 @@
 <translation id="4842397268809523050">Δεν ήταν δυνατός ο συγχρονισμός των δεδομένων σας από το ChromeOS Flex επειδή ο συγχρονισμός δεν είναι διαθέσιμος για τον τομέα σας.</translation>
 <translation id="4851866215237571846">Ο χρήστης <ph name="EXISTING_USER" /> είναι ήδη συνδεδεμένος.  Για να διατηρήσετε ξεχωριστά την περιήγησή σας, συνδεθείτε στο Chrome στο δικό σας προφίλ ως <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Για να μοιραστείτε την οθόνη σας, επιτρέψτε την εγγραφή οθόνης για το Chrome στις Ρυθμίσεις συστήματος</translation>
-<translation id="4873692836499071887">Για τη λήψη μελλοντικών ενημερώσεων του Google Chrome, θα χρειαστείτε macOS 11 ή νεότερη έκδοση. Αυτός ο υπολογιστής χρησιμοποιεί macOS 10.15.</translation>
 <translation id="4873783916118289636">Ελέγξτε σημαντικά στοιχεία ελέγχου για το απόρρητο και την ασφάλεια στο Chrome</translation>
 <translation id="4885446229353981848">Να εμφανίζεται πάντα η συντόμευση Google Lens</translation>
 <translation id="4891791193823137474">Να επιτρέπεται στο Google Chrome να εκτελείται στο παρασκήνιο</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb
index 49df07ce..e316ab1 100644
--- a/chrome/app/resources/google_chrome_strings_en-GB.xtb
+++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">Chrome OS Flex could not sync your data because sync is not available for your domain.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> is already signed in.  To keep your browsing separate, sign in to Chrome in your own profile as <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">To share your screen, allow screen recording for Chrome in System Settings</translation>
-<translation id="4873692836499071887">To get future Google Chrome updates, you'll need macOS 11 or later. This computer is using macOS 10.15.</translation>
 <translation id="4873783916118289636">Review key privacy and security controls in Chrome</translation>
 <translation id="4885446229353981848">Always show Google Lens shortcut</translation>
 <translation id="4891791193823137474">Let Google Chrome run in the background</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb
index 7bcb3bd..b7f1f9b 100644
--- a/chrome/app/resources/google_chrome_strings_es-419.xtb
+++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">ChromeOS Flex no pudo sincronizar los datos porque la sincronización no está disponible para el dominio.</translation>
 <translation id="4851866215237571846">Ya accediste con <ph name="EXISTING_USER" />.  Para mantener separados los datos de navegación, accede a Chrome en tu perfil como <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Para compartir tu pantalla, permite la grabación de pantalla de Chrome en Configuración del sistema.</translation>
-<translation id="4873692836499071887">Para recibir las próximas actualizaciones de Google Chrome, necesitarás macOS 11 o versiones posteriores. Esta computadora usa macOS 10.15.</translation>
 <translation id="4873783916118289636">Revisa los controles de seguridad y privacidad más importantes en Chrome</translation>
 <translation id="4885446229353981848">Mostrar siempre el acceso directo a Google Lens</translation>
 <translation id="4891791193823137474">Permitir que Google Chrome se ejecute en segundo plano</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb
index 923231fb..91e67b6 100644
--- a/chrome/app/resources/google_chrome_strings_es.xtb
+++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">ChromeOS Flex no ha podido sincronizar tus datos porque la función de sincronización no está disponible para tu dominio.</translation>
 <translation id="4851866215237571846">Ya has iniciado sesión con <ph name="EXISTING_USER" />.  Para mantener tu información de navegación aparte, inicia sesión en Chrome con tu perfil de <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Para compartir tu pantalla, permite la grabación de pantalla de Chrome en Ajustes del sistema</translation>
-<translation id="4873692836499071887">Para recibir futuras actualizaciones de Google Chrome, necesitarás macOS 11 o una versión posterior. Este ordenador usa macOS 10.15.</translation>
 <translation id="4873783916118289636">Revisa los controles principales de privacidad y de seguridad en Chrome</translation>
 <translation id="4885446229353981848">Mostrar siempre el acceso directo a Google Lens</translation>
 <translation id="4891791193823137474">Permitir que Google Chrome se ejecute en segundo plano</translation>
diff --git a/chrome/app/resources/google_chrome_strings_et.xtb b/chrome/app/resources/google_chrome_strings_et.xtb
index 34eb4a56..e62e348 100644
--- a/chrome/app/resources/google_chrome_strings_et.xtb
+++ b/chrome/app/resources/google_chrome_strings_et.xtb
@@ -298,7 +298,6 @@
 <translation id="4842397268809523050">Chrome OS Flex ei saa teie andmeid sünkroonida, sest teie domeenis pole sünkroonimine saadaval.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> on juba sisse logitud.  Sirvimise eraldi hoidmiseks logige Chrome'i sisse omaenda profiilil kasutajana <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Oma ekraani jagamiseks lubage menüüs System Settings Chrome'i puhul ekraani salvestamine.</translation>
-<translation id="4873692836499071887">Google Chrome'i tulevaste värskenduste saamiseks on teil vaja operatsioonisüsteemi macOS 11 või uuemat versiooni. See arvuti kasutab operatsioonisüsteemi macOS 10.15.</translation>
 <translation id="4873783916118289636">Vaadake üle Chrome'i peamised privaatsus- ja turvaseaded</translation>
 <translation id="4885446229353981848">Kuva alati Google Lensi otsetee</translation>
 <translation id="4891791193823137474">Luba Google Chrome'i töötamine taustal</translation>
diff --git a/chrome/app/resources/google_chrome_strings_eu.xtb b/chrome/app/resources/google_chrome_strings_eu.xtb
index 1c8139b..c3d09b2 100644
--- a/chrome/app/resources/google_chrome_strings_eu.xtb
+++ b/chrome/app/resources/google_chrome_strings_eu.xtb
@@ -299,7 +299,6 @@
 <translation id="4842397268809523050">ChromeOS Flex-ek ezin izan ditu sinkronizatu zure datuak, sinkronizazioa ez dagoelako erabilgarri zure domeinuan.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> erabiltzaileak hasita dauka saioa jada.  Arakatze-jarduerak bereizita edukitzeko, hasi saioa Chrome-n zeure profilarekin (<ph name="USER_EMAIL_ADDRESS" />).</translation>
 <translation id="4855026984605187434">Pantaila partekatzeko, eman pantaila grabatzeko baimena Chrome-ri sistemaren ezarpenetan</translation>
-<translation id="4873692836499071887">Etorkizunean Google Chrome-ren eguneratzeak eskuratzeko, macOS 11 edo berriago bat beharko duzu. Ordenagailu hau macOS 10.15 erabiltzen ari da.</translation>
 <translation id="4873783916118289636">Berrikusi pribatutasuna eta segurtasuna kontrolatzeko aukera garrantzitsuenak Chrome-n</translation>
 <translation id="4885446229353981848">Erakutsi beti Google Lens-en lasterbidea</translation>
 <translation id="4891791193823137474">Utzi Google Chrome-ri atzeko planoan abiarazten</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb
index 53a1ed43..223d3346 100644
--- a/chrome/app/resources/google_chrome_strings_fa.xtb
+++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">‏ChromeOS Flex نتوانست داده‌هایتان را همگام‌سازی کند زیرا همگام‌سازی برای دامنه شما دردسترس نیست.</translation>
 <translation id="4851866215237571846">‏‫<ph name="EXISTING_USER" /> درحال‌حاضر به سیستم وارد شده است.  برای جدا نگه داشتن مرورتان، در نمایه خودتان با حساب <ph name="USER_EMAIL_ADDRESS" /> به سیستم Chrome وارد شوید.</translation>
 <translation id="4855026984605187434">‏برای هم‌رسانی صفحه‌نمایش، ضبط صفحه‌نمایش را در «تنظیمات سیستم» برای Chrome مجاز کنید</translation>
-<translation id="4873692836499071887">‏برای دریافت به‌روزرسانی‌های بعدی Google Chrome، باید macOS نسخه ۱۱ یا بالاتر داشته باشید. این رایانه از macOS نسخه ۱۰.۱۵ استفاده می‌کند.</translation>
 <translation id="4873783916118289636">‏مرور کنترل‌های اصلی امنیت و حریم خصوصی در Chrome</translation>
 <translation id="4885446229353981848">‏میان‌بر «لنز Google» همیشه نشان داده شود</translation>
 <translation id="4891791193823137474">‏اجازه به Google Chrome برای اجرا در پس‌زمینه</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb
index 2e99e7f..f103f11 100644
--- a/chrome/app/resources/google_chrome_strings_fi.xtb
+++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">ChromeOS Flex ei voinut synkronoida dataa, koska synkronointi ei ole käytettävissä verkkotunnuksessasi.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> on jo kirjautunut sisään.  Jos haluat pitää selaamisen erillään, kirjaudu Chromeen omalla profiilillasi käyttämällä tiliä <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Jos haluat jakaa näytön, salli Chromen näytön tallennus järjestelmäasetuksista.</translation>
-<translation id="4873692836499071887">Sinulla on oltava macOS 11 tai uudempi, jotta saat tulevia Google Chromen päivityksiä. Tällä tietokoneella on macOS 10.15.</translation>
 <translation id="4873783916118289636">Tarkista Chromen tärkeimmät yksityisyys‑ ja turvallisuusasetukset</translation>
 <translation id="4885446229353981848">Näytä aina Google Lens ‐pikanäppäin</translation>
 <translation id="4891791193823137474">Jätä Google Chrome käyntiin taustalle</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb
index 79e8570..eb6588a 100644
--- a/chrome/app/resources/google_chrome_strings_fil.xtb
+++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">Hindi ma-sync ng ChromeOS Flex ang iyong data dahil hindi available ang Pag-sync para sa iyong domain.</translation>
 <translation id="4851866215237571846">Naka-sign in na si <ph name="EXISTING_USER" />.  Para panatilihing hiwalay ang iyong pag-browse, mag-sign in sa Chrome sa sarili mong profile bilang <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Para i-share ang iyong screen, payagan ang pag-record ng screen para sa Chrome sa System Settings</translation>
-<translation id="4873692836499071887">Para makatanggap ng mga update sa Google Chrome sa hinaharap, kakailanganin mo ng macOS 11 o mas bago. Gumagamit ng macOS 10.15 ang computer na ito.</translation>
 <translation id="4873783916118289636">Suriin ang mga pangunahing kontrol sa privacy at seguridad sa Chrome</translation>
 <translation id="4885446229353981848">Palaging ipakita ang shortcut ng Google Lens</translation>
 <translation id="4891791193823137474">Hayaan ang Google Chrome na tumakbo sa background</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr-CA.xtb b/chrome/app/resources/google_chrome_strings_fr-CA.xtb
index 5d5077a..b1f239a 100644
--- a/chrome/app/resources/google_chrome_strings_fr-CA.xtb
+++ b/chrome/app/resources/google_chrome_strings_fr-CA.xtb
@@ -299,7 +299,6 @@
 <translation id="4842397268809523050">Chrome OS Flex n'a pas pu synchroniser vos données parce que cette fonctionnalité n'est pas offerte pour votre domaine.</translation>
 <translation id="4851866215237571846">L'utilisateur (<ph name="EXISTING_USER" />) est déjà connecté.  Pour maintenir votre navigation séparée, connectez-vous à votre propre profil dans Chrome en tant que <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Pour partager votre écran, autorisez l'enregistrement de l'écran pour Chrome dans les Réglages système</translation>
-<translation id="4873692836499071887">Vous devez disposer de macOS 11 ou d'une version ultérieure pour recevoir les futures mises à jour de Google Chrome. Cet ordinateur fonctionne sous macOS 10.15.</translation>
 <translation id="4873783916118289636">Passez en revue les principaux paramètres de confidentialité et de sécurité dans Chrome</translation>
 <translation id="4885446229353981848">Toujours afficher le raccourci Lentille Google</translation>
 <translation id="4891791193823137474">Laisser Google Chrome s'exécuter en arrière-plan</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr.xtb b/chrome/app/resources/google_chrome_strings_fr.xtb
index 28cb1ca6..3a9fe94 100644
--- a/chrome/app/resources/google_chrome_strings_fr.xtb
+++ b/chrome/app/resources/google_chrome_strings_fr.xtb
@@ -299,7 +299,6 @@
 <translation id="4842397268809523050">ChromeOS Flex n'a pas pu synchroniser vos données, car la synchronisation n'est pas disponible pour votre domaine.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> est déjà connecté.  Pour séparer votre navigation, connectez-vous à Chrome avec votre propre profil en tant que <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Pour partager votre écran, autorisez l'enregistrement d'écran pour Chrome dans les réglages système</translation>
-<translation id="4873692836499071887">Vous devez disposer de macOS 11 ou d'une version ultérieure pour recevoir les futures mises à jour de Google Chrome. macOS 10.15 est installé sur cet ordinateur.</translation>
 <translation id="4873783916118289636">Examinez les paramètres clés de confidentialité et de sécurité dans Chrome</translation>
 <translation id="4885446229353981848">Toujours afficher le raccourci Google Lens</translation>
 <translation id="4891791193823137474">Laisser Google Chrome s'exécuter en arrière-plan</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gl.xtb b/chrome/app/resources/google_chrome_strings_gl.xtb
index 5a2cc51..b332378 100644
--- a/chrome/app/resources/google_chrome_strings_gl.xtb
+++ b/chrome/app/resources/google_chrome_strings_gl.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">Chrome OS Flex non puido sincronizar os teus datos porque esta función non está dispoñible para o teu dominio.</translation>
 <translation id="4851866215237571846">A sesión está iniciada como <ph name="EXISTING_USER" />.  Se queres navegar de forma independente, inicia sesión en Chrome co teu propio perfil como <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Para compartir a pantalla, vai á configuración do sistema e activa a función de gravación de pantalla para Chrome</translation>
-<translation id="4873692836499071887">Se queres recibir actualizacións de Google Chrome no futuro, debes instalar o sistema operativo macOS 11 ou unha versión posterior. Este ordenador ten macOS 10.15.</translation>
 <translation id="4873783916118289636">Revisa os controis clave de privacidade e seguranza en Chrome</translation>
 <translation id="4885446229353981848">Mostrar sempre atallo de Google Lens</translation>
 <translation id="4891791193823137474">Permitir que Google Chrome se execute en segundo plano</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb
index 8ff8b4e..6610db4 100644
--- a/chrome/app/resources/google_chrome_strings_gu.xtb
+++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">ChromeOS Flex તમારા ડેટાને સિંક કરી શક્યું નથી, કારણ કે તમારા ડોમેન માટે સિંક કરવાની સુવિધા ઉપલબ્ધ નથી.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> દ્વારા પહેલેથી જ સાઇન ઇન કરવામાં આવ્યું છે.  તમારું બ્રાઉઝિંગ અલગ રાખવા માટે, તમારી પોતાની પ્રોફાઇલમાં Chromeમાં <ph name="USER_EMAIL_ADDRESS" /> તરીકે સાઇન ઇન કરો.</translation>
 <translation id="4855026984605187434">તમારી સ્ક્રીન શેર કરવા માટે, સિસ્ટમના સેટિંગમાં Chrome માટે સ્ક્રીન રેકોર્ડિંગની મંજૂરી આપો</translation>
-<translation id="4873692836499071887">Google Chromeની ભાવિ અપડેટ મેળવવા માટે, તમારે macOS 11 કે તે પછીના વર્ઝન પર અપડેટ કરવું જરૂરી રહેશે. આ કમ્પ્યૂટર macOS 10.15નો ઉપયોગ કરી રહ્યું છે.</translation>
 <translation id="4873783916118289636">Chromeમાં પ્રાઇવસી અને સુરક્ષા સંબંધિત મુખ્ય નિયંત્રણોનો રિવ્યૂ કરો</translation>
 <translation id="4885446229353981848">હંમેશાં Google Lens શૉર્ટકટ બતાવો</translation>
 <translation id="4891791193823137474">Google Chrome ને પૃષ્ટભૂમિમાં ચાલવા દો</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb
index 817b4f2..836ea401 100644
--- a/chrome/app/resources/google_chrome_strings_hi.xtb
+++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -295,7 +295,6 @@
 <translation id="4842397268809523050">ChromeOS Flex आपके डेटा को सिंक नहीं कर सका, क्योंकि आपके डोमेन पर सिंक करने की सुविधा उपलब्ध नहीं है.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> ने पहले से साइन इन किया हुआ है. अलग ब्राउज़र का इस्तेमाल करने के लिए, Chrome में अपनी प्रोफ़ाइल में <ph name="USER_EMAIL_ADDRESS" /> से साइन इन करें.</translation>
 <translation id="4855026984605187434">स्क्रीन शेयर करने के लिए, 'सिस्टम सेटिंग' में जाकर Chrome के लिए स्क्रीन रिकॉर्ड करने की अनुमति दें</translation>
-<translation id="4873692836499071887">आगे भी Google Chrome के अपडेट पाते रहने के लिए, आपके कंप्यूटर में macOS 11 या इसके बाद का वर्शन इंस्टॉल होना चाहिए. फ़िलहाल, इस कंप्यूटर में macOS 10.15 का इस्तेमाल किया जा रहा है.</translation>
 <translation id="4873783916118289636">Chrome के निजता और सुरक्षा से जुड़े मुख्य कंट्रोल देखें</translation>
 <translation id="4885446229353981848">हमेशा Google Lens का शॉर्टकट दिखाएं</translation>
 <translation id="4891791193823137474">Google Chrome को पृष्ठभूमि में चलने दें</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb
index f3274bc..9187d91 100644
--- a/chrome/app/resources/google_chrome_strings_hr.xtb
+++ b/chrome/app/resources/google_chrome_strings_hr.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">ChromeOS Flex nije mogao sinkronizirati vaše podatke jer sinkronizacija nije dostupna za vašu domenu.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> već je prijavljen/a.  Da bi vaše pregledavanje ostalo odvojeno, prijavite se na Chrome na svojem profilu kao <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Da biste dijelili zaslon, u postavkama sustava dopustite snimanje zaslona za Chrome.</translation>
-<translation id="4873692836499071887">Da biste primali buduća ažuriranja Google Chromea, trebat će vam macOS 11 ili novija verzija. Na ovom se računalu upotrebljava macOS 10.15.</translation>
 <translation id="4873783916118289636">Pregledajte ključne kontrole privatnosti i sigurnosti u Chromeu</translation>
 <translation id="4885446229353981848">Uvijek prikaži prečac za Google objektiv</translation>
 <translation id="4891791193823137474">Neka Google Chrome radi u pozadini</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hu.xtb b/chrome/app/resources/google_chrome_strings_hu.xtb
index 2df8a05..a60b74c 100644
--- a/chrome/app/resources/google_chrome_strings_hu.xtb
+++ b/chrome/app/resources/google_chrome_strings_hu.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">A ChromeOS Flex nem tudta szinkronizálni az adatait, mert a szinkronizálás nem áll rendelkezésre a domainjénél.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> már bejelentkezett.  Ha szeretné elkülöníteni böngészési tevékenységeit, jelentkezzen be a Chrome-ban a saját profiljába a következő e-mail-címmel: <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">A képernyő megosztásához engedélyezze a Chrome számára a képernyőrögzítést a Rendszerbeállításokban.</translation>
-<translation id="4873692836499071887">Ha a jövőben Google Chrome-frissítéseket szeretne kapni, akkor a macOS 11-es vagy újabb verziójára lesz szüksége. Ezen a számítógépen a macOS 10.15 fut.</translation>
 <translation id="4873783916118289636">A legfontosabb adatvédelmi és biztonsági beállítások áttekintése a Chrome-ban</translation>
 <translation id="4885446229353981848">Mindig jelenjen meg a Google Lens gyorsparancsa</translation>
 <translation id="4891791193823137474">A Google Chrome futhat a háttérben</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hy.xtb b/chrome/app/resources/google_chrome_strings_hy.xtb
index 101be62..d2e84ee 100644
--- a/chrome/app/resources/google_chrome_strings_hy.xtb
+++ b/chrome/app/resources/google_chrome_strings_hy.xtb
@@ -297,7 +297,6 @@
 <translation id="4842397268809523050">ChromeOS Flex-ին չհաջողվեց համաժամացնել տվյալները, քանի որ այդ գործառույթը հասանելի չէ ձեր տիրույթի համար։</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" />-ն արդեն մտել է հաշիվ։  Ձեր այցելությունների պատմությունն առանձին պահելու համար ձեր սեփական պրոֆիլում մուտք գործեք Chrome <ph name="USER_EMAIL_ADDRESS" /> հաշվով։</translation>
 <translation id="4855026984605187434">Ձեր էկրանով կիսվելու համար Համակարգի կարգավորումներում թույլատրեք էկրանի տեսագրումը Chrome-ի համար</translation>
-<translation id="4873692836499071887">Google Chrome-ի հետագա թարմացումները ստանալու համար ձեզ անհրաժեշտ է macOS 11 կամ ավելի նոր տարբերակ։ Այս համակարգիչն օգտագործում է macOS 10.15 տարբերակը։</translation>
 <translation id="4873783916118289636">Դիտեք գաղտնիության և անվտանգության հիմնական կառավարման տարրերը Chrome-ում։</translation>
 <translation id="4885446229353981848">Միշտ ցույց տալ Google Տեսապակու դյուրանցումը</translation>
 <translation id="4891791193823137474">Թույլ տալ Google Chrome-ին աշխատել հետնաշերտում</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb
index b52ea04..2e1187a 100644
--- a/chrome/app/resources/google_chrome_strings_id.xtb
+++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">ChromeOS Flex tidak dapat menyinkronkan data Anda karena Sinkronisasi tidak tersedia untuk domain Anda.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> sudah login.  Agar penjelajahan Anda tetap terpisah, login ke Chrome di profil Anda sendiri sebagai <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Untuk membagikan layar Anda, izinkan perekaman layar untuk Chrome di Setelan Sistem</translation>
-<translation id="4873692836499071887">Untuk mendapatkan update Google Chrome berikutnya, Anda memerlukan macOS 11 atau yang lebih baru. Komputer ini menggunakan macOS 10.15.</translation>
 <translation id="4873783916118289636">Meninjau kontrol privasi dan keamanan utama di Chrome</translation>
 <translation id="4885446229353981848">Selalu tampilkan pintasan Google Lens</translation>
 <translation id="4891791193823137474">Jalankan Google Chrome di latar belakang</translation>
diff --git a/chrome/app/resources/google_chrome_strings_is.xtb b/chrome/app/resources/google_chrome_strings_is.xtb
index 8aa4799..ec223c6d 100644
--- a/chrome/app/resources/google_chrome_strings_is.xtb
+++ b/chrome/app/resources/google_chrome_strings_is.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">ChromeOS Flex gat ekki samstillt gögnin þín vegna þess að samstilling er ekki í boði fyrir lénið þitt.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> er þegar innskráð(ur).  Til að halda vefskoðun aðskilinni skaltu skrá þig inn á Chrome með þínum eigin prófíl sem <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Leyfðu skjáupptöku í Chrome í kerfisstillingunum til að deila skjánum þínum</translation>
-<translation id="4873692836499071887">Til að fá frekari uppfærslur á Google Chrome þarftu macOS 11 eða nýrri útgáfu. Þessi tölva notar macOS 10.15.</translation>
 <translation id="4873783916118289636">Farðu yfir helstu öryggis- og persónuverndarstýringar í Chrome</translation>
 <translation id="4885446229353981848">Alltaf sýna flýtileið Google-linsu</translation>
 <translation id="4891791193823137474">Leyfa Google Chrome að keyra í bakgrunni</translation>
diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb
index 36422649..6ee34347 100644
--- a/chrome/app/resources/google_chrome_strings_it.xtb
+++ b/chrome/app/resources/google_chrome_strings_it.xtb
@@ -295,7 +295,6 @@
 <translation id="4842397268809523050">Impossibile sincronizzare i dati in ChromeOS Flex perché la sincronizzazione non è disponibile per il tuo dominio.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> ha già eseguito l’accesso.  Per tenere separata la tua navigazione, accedi a Chrome nel tuo profilo per <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Per condividere lo schermo, consenti la Registrazione dello schermo per Chrome nelle Impostazioni di sistema.</translation>
-<translation id="4873692836499071887">Per ricevere gli aggiornamenti futuri di Google Chrome, devi avere macOS 11 o versioni successive. Su questo computer è installato macOS 10.15.</translation>
 <translation id="4873783916118289636">Esamina i controlli per la privacy e la sicurezza più importanti in Chrome</translation>
 <translation id="4885446229353981848">Mostra sempre la scorciatoia di Google Lens</translation>
 <translation id="4891791193823137474">Lascia Google Chrome in esecuzione in background</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb
index 8e409a1..6380dc68 100644
--- a/chrome/app/resources/google_chrome_strings_iw.xtb
+++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">‏לא ניתן היה לסנכרן את הנתונים שלך ב-ChromeOS Flex כי הסנכרון לא זמין בדומיין שלך.</translation>
 <translation id="4851866215237571846">‏כבר בוצעה כניסה לחשבון על ידי <ph name="EXISTING_USER" />.  כדי להפריד בין פעילויות הגלישה, עליך להיכנס ל-Chrome בפרופיל שלך עם האימייל <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">‏כדי לשתף את המסך, צריך לאפשר הקלטת מסך ב-Chrome בקטע "הגדרות המערכת"</translation>
-<translation id="4873692836499071887">‏כדי לקבל עדכונים של Google Chrome בעתיד, צריך להשתמש ב-macOS מגרסה 11 ואילך. במחשב הזה פועלת גרסה 10.15 של macOS.</translation>
 <translation id="4873783916118289636">‏בדיקה של אמצעי הבקרה החשובים ביותר על פרטיות ואבטחה ב-Chrome</translation>
 <translation id="4885446229353981848">‏תמיד להציג את קיצור הדרך ל-Google Lens</translation>
 <translation id="4891791193823137474">‏לאפשר ל-Google Chrome לפעול ברקע</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ja.xtb b/chrome/app/resources/google_chrome_strings_ja.xtb
index 88a267f..11f47c1 100644
--- a/chrome/app/resources/google_chrome_strings_ja.xtb
+++ b/chrome/app/resources/google_chrome_strings_ja.xtb
@@ -295,7 +295,6 @@
 <translation id="4842397268809523050">お使いのドメインでは同期が利用できないため、ChromeOS Flex はデータを同期できませんでした。</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> がすでにログインしています。ブラウジング環境を分ける場合は、<ph name="USER_EMAIL_ADDRESS" /> として自分用のプロフィールで Chrome にログインしてください。</translation>
 <translation id="4855026984605187434">画面を共有するには、[システム設定] で Chrome に画面の録画を許可してください。</translation>
-<translation id="4873692836499071887">今後、Google Chrome のアップデートを受信するには、macOS 11 以降が必要となります。このコンピュータでは macOS 10.15 が実行されています。</translation>
 <translation id="4873783916118289636">Chrome のプライバシーとセキュリティに関する重要な設定を確認します</translation>
 <translation id="4885446229353981848">Google レンズのショートカットを常に表示する</translation>
 <translation id="4891791193823137474">Google Chrome のバックグラウンドでの実行を許可する</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ka.xtb b/chrome/app/resources/google_chrome_strings_ka.xtb
index fd66cea..9143f04 100644
--- a/chrome/app/resources/google_chrome_strings_ka.xtb
+++ b/chrome/app/resources/google_chrome_strings_ka.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">ChromeOS Flex-მა ვერ მოახერხა თქვენი მონაცემების სინქრონიზაცია, რადგან თქვენი დომენისთვის სინქრონიზაცია მიუწვდომელია.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> მზად არის შესასვლელად.  ცალკე დათვალიერების გასაგრძელებლად შედით Chrome-ში თქვენს პირად პროფილში <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">თქვენი ეკრანის გასაზიარებლად დაუშვით ეკრანის ჩაწერა Chrome-ისთვის სისტემის პარამეტრებში</translation>
-<translation id="4873692836499071887">მომავალში Google Chrome-ის განახლებების მისაღებად დაგჭირდებათ macOS 11 ან უფრო ახალი ვერსია. ეს კომპიუტერი იყენებს macOS 10.15-ს.</translation>
 <translation id="4873783916118289636">გადახედეთ კონფიდენციალურობისა და უსაფრთხოების მართვის საკვანძო საშუალებებს Chrome-ში</translation>
 <translation id="4885446229353981848">Google Lens-ის მალსახმობის ყოველთვის ჩვენება</translation>
 <translation id="4891791193823137474">Google Chrome გაიშვას ფონურ რეჟიმში</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kk.xtb b/chrome/app/resources/google_chrome_strings_kk.xtb
index d0e1eae..d332765 100644
--- a/chrome/app/resources/google_chrome_strings_kk.xtb
+++ b/chrome/app/resources/google_chrome_strings_kk.xtb
@@ -299,7 +299,6 @@
 <translation id="4842397268809523050">ChromeOS Flex деректеріңізді синхрондай алмады, себебі синхрондау функциясы доменіңіз үшін қолжетімсіз.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> әлдеқашан кірді.  Браузерді пайдалану тарихын бөлек сақтау үшін Chrome-ға <ph name="USER_EMAIL_ADDRESS" /> ретінде жеке профиліңізбен кіріңіз.</translation>
 <translation id="4855026984605187434">Экранды бөлісу үшін жүйе параметрлерінде Chrome-ға экран жазуға рұқсат беріңіз.</translation>
-<translation id="4873692836499071887">Google Chrome-ның жаңа нұсқаларын алып тұру үшін macOS 11 не одан кейінгі операциялық жүйе керек болады. Бұл компьютерде macOS 10.15 нұсқасы орнатылған.</translation>
 <translation id="4873783916118289636">Chrome-дағы құпиялық пен қауіпсіздікті басқарудың маңызды құралдарын қарап шығыңыз.</translation>
 <translation id="4885446229353981848">Google Lens таңбашасын үнемі көрсету</translation>
 <translation id="4891791193823137474">Google Chrome жүйесіне фонда жұмыс істеуге рұқсат беру</translation>
@@ -396,7 +395,7 @@
 <translation id="6145313976051292476">PDF-терді Chrome-да ашу</translation>
 <translation id="6150706324143004339">Chrome деректерін Google аккаунтында пайдалану және сақтау үшін Chrome-ды жаңартыңыз.</translation>
 <translation id="6157638032135951407">Ұйымыңыз Chrome деректерін <ph name="TIMEOUT_DURATION" /> бойы пайдаланбаған кезде жояды. Оларға тарих, автотолтыру мәліметтері және жүктеп алынғандар кіруі мүмкін.</translation>
-<translation id="6165508094623778733">Толығырақ</translation>
+<translation id="6165508094623778733">Толық ақпарат</translation>
 <translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
 <translation id="6173637689840186878"><ph name="PAGE_TITLE" /> - Google Chrome бета нұсқасы</translation>
 <translation id="6180522807229584611">Бұл қойынды ресурстарды көп қолданып жатыр. Өнімділікті жақсарту үшін Chrome-ға оны әрекетсіз қылуға рұқсат беріңіз.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_km.xtb b/chrome/app/resources/google_chrome_strings_km.xtb
index ac31cb78e..c21ccec 100644
--- a/chrome/app/resources/google_chrome_strings_km.xtb
+++ b/chrome/app/resources/google_chrome_strings_km.xtb
@@ -299,7 +299,6 @@
 <translation id="4842397268809523050">ChromeOS Flex មិនអាចធ្វើ​សម​កាល​កម្មទិន្នន័យរបស់អ្នកបានទេ ដោយសារមិនអាចប្រើ​សម​កាល​កម្មនៅក្នុងដែនរបស់អ្នក។</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> បានចូល​គណនី​ស្រាប់ហើយ។  ដើម្បី​រក្សាការរុករក​របស់អ្នក​ដាច់ដោយឡែក សូម​ចូលគណនីលើ Chrome នៅក្នុង​កម្រងព័ត៌មាន​របស់អ្នកផ្ទាល់​ជា <ph name="USER_EMAIL_ADDRESS" />។</translation>
 <translation id="4855026984605187434">ដើម្បី​បង្ហាញ​អេក្រង់​របស់អ្នក សូមអនុញ្ញាត​ឱ្យ Chrome ថតវីដេអូ​អេក្រង់​នៅក្នុង "ការកំណត់​ប្រព័ន្ធ"</translation>
-<translation id="4873692836499071887">ដើម្បីទទួលបានកំណែថ្មីរបស់ Google Chrome ក្នុងពេលអនាគត អ្នកនឹងត្រូវការ macOS 11 ឬកំណែខ្ពស់ជាងនេះ។ កុំព្យូទ័រនេះកំពុងប្រើ macOS 10.15។</translation>
 <translation id="4873783916118289636">ពិនិត្យមើល​ការគ្រប់គ្រង​សុវត្ថិភាព និងឯកជនភាព​សំខាន់ៗនៅក្នុង Chrome</translation>
 <translation id="4885446229353981848">បង្ហាញផ្លូវកាត់ Google Lens ជានិច្ច</translation>
 <translation id="4891791193823137474">អនុញ្ញាតឲ្យ Google Chrome ដំណើរការនៅក្នុងផ្ទៃខាងក្រោយ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kn.xtb b/chrome/app/resources/google_chrome_strings_kn.xtb
index a64c978..f2dd6c7 100644
--- a/chrome/app/resources/google_chrome_strings_kn.xtb
+++ b/chrome/app/resources/google_chrome_strings_kn.xtb
@@ -298,7 +298,6 @@
 <translation id="4842397268809523050">ನಿಮ್ಮ ಡೊಮೇನ್‌ನಲ್ಲಿ ಸಿಂಕ್ ಸೌಲಭ್ಯ ಲಭ್ಯವಿಲ್ಲದ ಕಾರಣ ChromeOS Flex ಗೆ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಸಿಂಕ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> ಅನ್ನು ಈಗಾಗಲೇ ಸೈನ್ ಇನ್ ಮಾಡಲಾಗಿದೆ.  ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಅನ್ನು ಪ್ರತ್ಯೇಕವಾಗಿರಿಸಲು, ನಿಮ್ಮ ಸ್ವಂತ ಪ್ರೊಫೈಲ್‌ನಲ್ಲಿ <ph name="USER_EMAIL_ADDRESS" /> ನಂತೆ Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation>
 <translation id="4855026984605187434">ನಿಮ್ಮ ಸ್ಕ್ರೀನ್‌ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಲು, ಸಿಸ್ಟಂ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ Chrome ಗೆ ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡಿಂಗ್ ಮಾಡಲು ಅನುಮತಿಸಿ</translation>
-<translation id="4873692836499071887">ಭವಿಷ್ಯದ Google Chrome ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಪಡೆಯಲು, ನಿಮಗೆ macOS 11 ಅಥವಾ ಅದರ ನಂತರದ ಆವೃತ್ತಿಗಳ ಅಗತ್ಯವಿದೆ. ಈ ಕಂಪ್ಯೂಟರ್ macOS 10.15 ಅನ್ನು ಬಳಸುತ್ತಿದೆ.</translation>
 <translation id="4873783916118289636">Chrome ನಲ್ಲಿ ಪ್ರಮುಖ ಗೌಪ್ಯತೆ ಮತ್ತು ಭದ್ರತಾ ನಿಯಂತ್ರಣಗಳನ್ನು ಪರಿಶೀಲಿಸಿ</translation>
 <translation id="4885446229353981848">ಯಾವಾಗಲೂ Google Lens ಶಾರ್ಟ್‌ಕಟ್ ಅನ್ನು ತೋರಿಸಿ</translation>
 <translation id="4891791193823137474">Google Chrome ಹಿನ್ನೆಲೆಯಲ್ಲಿ ಚಾಲನೆಯಾಗಲು ಅನುಮತಿಸಿ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb
index 86405590..db748f8 100644
--- a/chrome/app/resources/google_chrome_strings_ko.xtb
+++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -299,7 +299,6 @@
 <translation id="4842397268809523050">도메인에 대한 동기화가 허용되지 않아 ChromeOS Flex에서 데이터를 동기화할 수 없습니다.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> 계정은 이미 로그인되어 있습니다.  방문 기록을 별도로 보관하려면 내 프로필에서 <ph name="USER_EMAIL_ADDRESS" /> 주소로 Chrome에 로그인하세요.</translation>
 <translation id="4855026984605187434">화면을 공유하려면 시스템 설정에서 Chrome의 화면 녹화를 허용하세요.</translation>
-<translation id="4873692836499071887">향후 Chrome 업데이트를 받으려면 macOS 11 이상이 필요합니다. 이 컴퓨터에서는 macOS 10.15를 사용 중입니다.</translation>
 <translation id="4873783916118289636">Chrome의 주요 개인 정보 보호 및 보안 제어 기능을 검토합니다.</translation>
 <translation id="4885446229353981848">Google 렌즈 바로가기 항상 표시</translation>
 <translation id="4891791193823137474">백그라운드에서 Chrome을 실행</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ky.xtb b/chrome/app/resources/google_chrome_strings_ky.xtb
index 981f7f36..addf6760 100644
--- a/chrome/app/resources/google_chrome_strings_ky.xtb
+++ b/chrome/app/resources/google_chrome_strings_ky.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">ChromeOS Flex дайын-даректериңизди шайкештештире алган жок, себеби домениңизде Шайкештештирүү аракети жеткиликтүү эмес.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> мурунтан эле кирип турат.  Сиз серептеген нерселерди ажыратуу үчүн <ph name="USER_EMAIL_ADDRESS" /> катары өз профилиңизден Chrome'го кириңиз.</translation>
 <translation id="4855026984605187434">Экранды бөлүшүү үчүн Тутумдун параметрлеринен Chrome'го экрандан видео жаздырып алууга уруксат бериңиз.</translation>
-<translation id="4873692836499071887">Google Chrome жаңыртууларын алып туруу үчүн macOS 11 же андан кийинки версиясын орнотушуңуз керек. Бул компьютерде macOS 10.15 версиясы колдонулууда.</translation>
 <translation id="4873783916118289636">Chrome'догу негизги купуялык жана коопсуздукту көзөмөлдөө каражаттарын карап көрүңүз</translation>
 <translation id="4885446229353981848">Google Lens ыкчам баскычы ар дайым көрсөтүлсүн</translation>
 <translation id="4891791193823137474">Google Chrome'го фондо иштөө мүмкүнчүлүгүн берүү</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lo.xtb b/chrome/app/resources/google_chrome_strings_lo.xtb
index 329798f..7455ba4 100644
--- a/chrome/app/resources/google_chrome_strings_lo.xtb
+++ b/chrome/app/resources/google_chrome_strings_lo.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">ChromeOS Flex ບໍ່ສາມາດຊິ້ງຂໍ້ມູນຂອງທ່ານໄດ້ເນື່ອງຈາກບໍ່ສາມາດໃຊ້ການຊິ້ງຂໍ້ມູນສຳລັບໂດເມນຂອງທ່ານ.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> ເຂົ້າສູ່ລະບົບຢູ່ແລ້ວ.  ເພື່ອແຍກການທ່ອງເວັບຂອງທ່ານໄວ້ຕ່າງຫາກ, ໃຫ້ເຂົ້າສູ່ລະບົບ Chrome ໃນໂປຣໄຟລ໌ຂອງທ່ານເອງໃນຖານະ <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">ເພື່ອແບ່ງປັນໜ້າຈໍຂອງທ່ານ, ໃຫ້ອະນຸຍາດການບັນທຶກໜ້າຈໍສຳລັບ Chrome ໃນການຕັ້ງຄ່າລະບົບ</translation>
-<translation id="4873692836499071887">ເພື່ອຮັບການອັບເດດ Google Chrome ໃນອະນາຄົດ, ທ່ານຈະຕ້ອງໃຊ້ macOS 11 ຂຶ້ນໄປ. ຄອມພິວເຕີເຄື່ອງນີ້ກຳລັງໃຊ້ macOS 10.15.</translation>
 <translation id="4873783916118289636">ກວດສອບການຄວບຄຸມຄວາມເປັນສ່ວນຕົວ ແລະ ຄວາມປອດໄພຫຼັກໃນ Chrome</translation>
 <translation id="4885446229353981848">ສະແດງທາງລັດຂອງ Google Lens ສະເໝີ</translation>
 <translation id="4891791193823137474">ໃຫ້ Google Chrome ແລ່ນຢູ່ໃນພື້ນຫຼັງ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb
index 0a26993..be9c5346 100644
--- a/chrome/app/resources/google_chrome_strings_lt.xtb
+++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">„ChromeOS Flex“ negalėjo sinchronizuoti duomenų, nes jūsų domene sinchronizavimas negalimas.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> jau prisijungė.  Jei norite atskirti naršymą, prisijunkite prie „Chrome“ savo profilyje kaip <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Jei norite bendrinti ekraną, sistemos nustatymuose leiskite įrašyti „Chrome“ ekrano vaizdą</translation>
-<translation id="4873692836499071887">Jei norite gauti būsimus „Google Chrome“ naujinius, jums reikės 11 ar naujesnės „macOS“ versijos. Šiame kompiuteryje naudojama 10.15 versijos „macOS“.</translation>
 <translation id="4873783916118289636">Peržiūrėkite pagrindinius privatumo ir saugos valdiklius naršyklėje „Chrome“</translation>
 <translation id="4885446229353981848">Visada rodyti „Google Lens“ spartųjį klavišą</translation>
 <translation id="4891791193823137474">Paleisti „Google Chrome“ fone</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lv.xtb b/chrome/app/resources/google_chrome_strings_lv.xtb
index d62dc97..e60c62b 100644
--- a/chrome/app/resources/google_chrome_strings_lv.xtb
+++ b/chrome/app/resources/google_chrome_strings_lv.xtb
@@ -297,7 +297,6 @@
 <translation id="4842397268809523050">Chrome OS Flex nevarēja sinhronizēt jūsu datus, jo jūsu domēnam nav pieejama sinhronizācija.</translation>
 <translation id="4851866215237571846">Jau ir pierakstījies lietotājs <ph name="EXISTING_USER" />.  Lai atdalītu pārlūkošanu, pierakstieties pārlūkā Chrome savā profilā, izmantojot e-pasta adresi <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Lai kopīgotu ekrānu, sistēmas iestatījumos atļaujiet ekrāna ierakstīšanu pārlūkā Chrome.</translation>
-<translation id="4873692836499071887">Lai saņemtu turpmākus Google Chrome atjauninājumus, ir nepieciešama operētājsistēma macOS 11 vai jaunāka versija. Šajā datorā tiek izmantota operētājsistēma macOS 10.15.</translation>
 <translation id="4873783916118289636">Pārskatiet svarīgākās konfidencialitātes un drošības vadīklas pārlūkā Chrome.</translation>
 <translation id="4885446229353981848">Vienmēr rādīt Google Lens saīsni</translation>
 <translation id="4891791193823137474">Ļaut Google Chrome darboties fonā</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mk.xtb b/chrome/app/resources/google_chrome_strings_mk.xtb
index ce5b06f..e22419c 100644
--- a/chrome/app/resources/google_chrome_strings_mk.xtb
+++ b/chrome/app/resources/google_chrome_strings_mk.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">ChromeOS Flex не може да ги синхронизира вашите податоци затоа што синхронизација не е достапна на вашиот домен.</translation>
 <translation id="4851866215237571846">Корисникот <ph name="EXISTING_USER" /> веќе е најавен.  За да прелистувате одделно, најавете се на Chrome во вашиот сопствен профил како <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">За да го споделите екранот, дозволете снимање на екранот за Chrome во System Settings</translation>
-<translation id="4873692836499071887">За да добивате идни ажурирања на Google Chrome, потребен ви е macOS 11 или понова верзија. Компјутеров користи macOS 10.15.</translation>
 <translation id="4873783916118289636">Прегледајте ги клучните контроли за приватноста и безбедноста во Chrome</translation>
 <translation id="4885446229353981848">Секогаш прикажувај ја кратенката за Google Lens</translation>
 <translation id="4891791193823137474">Остави Google Chrome да работи во заднина</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb
index dddac7c1..0baecd52 100644
--- a/chrome/app/resources/google_chrome_strings_ml.xtb
+++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">നിങ്ങളുടെ ഡൊമെയ്‌നിൽ സമന്വയിപ്പിക്കൽ ലഭ്യമല്ലാത്തതിനാൽ ChromeOS Flex-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" />, ഇതിനകം സൈൻ ഇൻ ചെയ്‌തിട്ടുണ്ട്.  നിങ്ങൾക്ക് ഒറ്റയ്ക്ക് ബ്രൗസ് ചെയ്യാൻ, <ph name="USER_EMAIL_ADDRESS" /> എന്ന വിലാസത്തിൽ നിങ്ങളുടെ സ്വന്തം പ്രൊഫൈലിൽ Chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="4855026984605187434">നിങ്ങളുടെ സ്‌ക്രീൻ പങ്കിടാൻ, സിസ്റ്റം ക്രമീകരണത്തിൽ Chrome-നായി സ്‌ക്രീൻ റെക്കോർഡിംഗ് അനുവദിക്കുക</translation>
-<translation id="4873692836499071887">ഭാവിയിൽ Google Chrome അപ്ഡേറ്റുകൾ ലഭിക്കാൻ, നിങ്ങൾക്ക് macOS 11 അല്ലെങ്കിൽ അതിന് ശേഷമുള്ള പതിപ്പ് ആവശ്യമാണ്. ഈ കമ്പ്യൂട്ടർ macOS 10.15 ആണ് ഉപയോഗിക്കുന്നത്.</translation>
 <translation id="4873783916118289636">Chrome-ലെ പ്രധാന സ്വകാര്യതാ, സുരക്ഷാ നിയന്ത്രണങ്ങൾ അവലോകനം ചെയ്യുക</translation>
 <translation id="4885446229353981848">എല്ലായ്‌പ്പോഴും Google Lens കുറുക്കുവഴി കാണിക്കുക</translation>
 <translation id="4891791193823137474">പശ്ചാത്തലത്തില്‍ Google Chrome പ്രവര്‍ത്തിക്കാന്‍ അനുവദിക്കുക</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mn.xtb b/chrome/app/resources/google_chrome_strings_mn.xtb
index 6d16792..de659a6 100644
--- a/chrome/app/resources/google_chrome_strings_mn.xtb
+++ b/chrome/app/resources/google_chrome_strings_mn.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">Синк нь таны домэйнд боломжгүй тул ChromeOS Flex таны өгөгдлийг синк хийж чадсангүй.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> аль хэдийн нэвтэрсэн байна.  Хөтчийн үзэлтээ тусдаа байлгахын тулд Chrome-д <ph name="USER_EMAIL_ADDRESS" />-р өөрийн профайлаар нэвтэрнэ үү.</translation>
 <translation id="4855026984605187434">Дэлгэцээ хуваалцахын тулд Системийн тохиргоонд Chrome-д дэлгэцийн үйлдэл бичихийг зөвшөөрнө үү</translation>
-<translation id="4873692836499071887">Google Chrome-н цаашдын шинэчлэлтийг авахын тулд танд macOS 11 эсвэл түүнээс хойших хувилбар хэрэгтэй болно. Энэ компьютер macOS 10.15. хувилбарыг ашиглаж байна.</translation>
 <translation id="4873783916118289636">Chrome-н нууцлал болон аюулгүй байдлын үндсэн хяналтуудыг шалгана уу</translation>
 <translation id="4885446229353981848">Google Lens-н товчлолыг үргэлж харуулах</translation>
 <translation id="4891791193823137474">Google Chrome-ыг энэ дэвсгэр дээр ажиллуулна уу</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mr.xtb b/chrome/app/resources/google_chrome_strings_mr.xtb
index 1b6418ae..9f030ff2 100644
--- a/chrome/app/resources/google_chrome_strings_mr.xtb
+++ b/chrome/app/resources/google_chrome_strings_mr.xtb
@@ -299,7 +299,6 @@
 <translation id="4842397268809523050">तुमच्या डोमेनसाठी सिंक करणे उपलब्ध नसल्यामुळे ChromeOS Flex ला तुमचा डेटा सिंक करता आला नाही.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> यांनी आधीच साइन इन केले आहे.  तुमचे ब्राउझिंग स्वतंत्र ठेवण्यासाठी, तुमच्या स्वतःच्या प्रोफाइलमधील Chrome मध्ये <ph name="USER_EMAIL_ADDRESS" /> म्हणून साइन इन करा.</translation>
 <translation id="4855026984605187434">तुमची स्क्रीन शेअर करण्यासाठी, सिस्टीम सेटिंग्ज मध्ये Chrome साठी स्क्रीन रेकॉर्डिंगला अनुमती द्या</translation>
-<translation id="4873692836499071887">भविष्यातील Google Chrome अपडेट मिळवण्यासाठी, तुमच्याकडे macOS 11 किंवा त्यानंतरची आवृत्ती असणे आवश्यक आहे. हा कॉंप्युटर macOS 10.15 वापरत आहे.</translation>
 <translation id="4873783916118289636">Chrome मधील महत्त्वाच्या गोपनीयता आणि सुरक्षा नियंत्रणांचे पुनरावलोकन करा</translation>
 <translation id="4885446229353981848">Google Lens शॉर्टकट नेहमी दाखवा</translation>
 <translation id="4891791193823137474">बॅकग्राउंडमध्ये Google Chrome सुरू द्या</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb
index 284487f..9c22825c 100644
--- a/chrome/app/resources/google_chrome_strings_ms.xtb
+++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">Chrome OS Flex tidak dapat menyegerakkan data anda kerana Segerak tidak tersedia untuk domain anda.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> sudah log masuk.  Untuk memastikan penyemakan imbas anda terpisah, log masuk ke Chrome dalam profil anda sendiri sebagai <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Untuk berkongsi skrin anda, benarkan rakaman skrin untuk Chrome dalam Tetapan Sistem</translation>
-<translation id="4873692836499071887">Untuk mendapatkan kemaskinian Google Chrome yang akan datang, anda memerlukan macOS 11 atau yang lebih baharu. Komputer ini menggunakan macOS 10.15.</translation>
 <translation id="4873783916118289636">Semak privasi dan kawalan keselamatan utama dalam Chrome</translation>
 <translation id="4885446229353981848">Sentiasa paparkan pintasan Google Lens</translation>
 <translation id="4891791193823137474">Biarkan Google Chrome dijalankan di latar belakang</translation>
diff --git a/chrome/app/resources/google_chrome_strings_my.xtb b/chrome/app/resources/google_chrome_strings_my.xtb
index 602af7b..8ef5cc4 100644
--- a/chrome/app/resources/google_chrome_strings_my.xtb
+++ b/chrome/app/resources/google_chrome_strings_my.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">သင့်ဒိုမိန်းအတွက် ‘စင့်ခ်လုပ်ခြင်း’ မရနိုင်သဖြင့် ChromeOS Flex က သင့်ဒေတာကို စင့်ခ်လုပ်၍မရပါ။</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> သည် လက်မှတ်ထိုးဝင်ပြီးဖြစ်သည်။  သင်၏ ဘရောက်စ်လုပ်ခြင်းကို ခွဲခြားထားရန်အတွက် သင့်ကိုယ်ပိုင်ပရိုဖိုင်တွင် <ph name="USER_EMAIL_ADDRESS" /> အဖြစ် Chrome သို့ လက်မှတ်ထိုးဝင်ပါ။</translation>
 <translation id="4855026984605187434">သင့်ဖန်သားပြင်ကို မျှဝေရန် ‘စနစ် ဆက်တင်များ’ တွင် Chrome အတွက် ဖန်သားပြင်ရိုက်ကူးခြင်းကို ခွင့်ပြုပါ</translation>
-<translation id="4873692836499071887">နောက်ပိုင်းထွက်မည့် Google Chrome အပ်ဒိတ်များ ရယူရန် macOS 11 နှင့်အထက် လိုအပ်မည်။ ဤကွန်ပျူတာက macOS 10.15 သုံးနေသည်။</translation>
 <translation id="4873783916118289636">အဓိကကျသော ကိုယ်ရေးအချက်အလက်နှင့် လုံခြုံရေး ထိန်းချုပ်မှုများကို Chrome တွင် ကြည့်နိုင်သည်</translation>
 <translation id="4885446229353981848">Google Lens ဖြတ်လမ်းလင့်ခ် အမြဲပြပါ</translation>
 <translation id="4891791193823137474">Google Chrome အားနောက်ခံတွင် ဖွင့်စေပါ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ne.xtb b/chrome/app/resources/google_chrome_strings_ne.xtb
index 8d394aa..ddbc11e1 100644
--- a/chrome/app/resources/google_chrome_strings_ne.xtb
+++ b/chrome/app/resources/google_chrome_strings_ne.xtb
@@ -298,7 +298,6 @@
 <translation id="4842397268809523050">तपाईंको डोमेनका हकमा सिंक गर्ने सुविधा उपलब्ध नभएको हुनाले ChromeOS Flex ले तपाईंको डेटा सिंक गर्न सकेन।</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> ले पहिलेदेखि नै साइन इन गर्नुभएको छ।  छुट्टै ब्राउजर प्रयोग गर्न <ph name="USER_EMAIL_ADDRESS" /> मार्फत आफ्नै प्रोफाइल प्रयोग गरी Chrome मा साइन इन गर्नुहोस्।</translation>
 <translation id="4855026984605187434">आफ्नो स्क्रिन सेयर गर्न सिस्टम सेटिङमा गई Chrome लाई स्क्रिन रेकर्ड गर्ने अनुमति दिनुहोस्</translation>
-<translation id="4873692836499071887">तपाईंको कम्प्युटरमा macOS ११ वा सोभन्दा नयाँ संस्करण इन्स्टल गरिएको छ भने मात्र तपाईं भविष्यमा Google Chrome का अपडेट प्राप्त गर्नुहुन्छ। यो कम्प्युटरमा macOS १०.१५ प्रयोग भइरहेको छ।</translation>
 <translation id="4873783916118289636">Chrome मा भएका गोपनीयता र सुरक्षासम्बन्धी मुख्य नियन्त्रण सुविधाहरूको समीक्षा गर्नुहोस्</translation>
 <translation id="4885446229353981848">Google लेन्सको सर्टकट सधैँ देखाइयोस्</translation>
 <translation id="4891791193823137474">Google Chrome लाई पृष्ठभूमिमा चल्न दिनुहोस्</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb
index 55ea4c81..de34210 100644
--- a/chrome/app/resources/google_chrome_strings_nl.xtb
+++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -299,7 +299,6 @@
 <translation id="4842397268809523050">Chrome OS Flex kan je gegevens niet synchroniseren omdat synchronisatie niet beschikbaar is voor je domein.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> is al ingelogd.  Als je je browsegegevens gescheiden wilt houden, log je in Chrome in op je eigen profiel als <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Als je je scherm wilt delen, sta je schermopname voor Chrome toe in Systeeminstellingen</translation>
-<translation id="4873692836499071887">Als je toekomstige Google Chrome-updates wilt krijgen, heb je macOS 11 of hoger nodig. Deze computer gebruikt macOS 10.15.</translation>
 <translation id="4873783916118289636">Neem belangrijke privacy- en beveiligingsopties in Chrome door</translation>
 <translation id="4885446229353981848">Google Lens-snelkoppeling altijd tonen</translation>
 <translation id="4891791193823137474">Google Chrome op de achtergrond laten uitvoeren</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb
index c1f0fef..d208e673 100644
--- a/chrome/app/resources/google_chrome_strings_no.xtb
+++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">ChromeOS Flex kunne ikke synkronisere dataene dine. Dette skyldes at synkronisering ikke er tilgjengelig for domenet ditt.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> er allerede logget på.  For å holde surfingen din atskilt, logg på Chrome i din egen profil som <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">For å dele skjermen, tillat skjermopptak for Chrome i Systeminnstillinger</translation>
-<translation id="4873692836499071887">For å få fremtidige Google Chrome-oppdateringer må du ha macOS 11 eller nyere. Denne datamaskinen bruker macOS 10.15.</translation>
 <translation id="4873783916118289636">Gjennomgå viktige personvern- og sikkerhetskontroller i Chrome</translation>
 <translation id="4885446229353981848">Vis alltid Google Lens-snarveien</translation>
 <translation id="4891791193823137474">La Google Chrome kjøre i bakgrunnen</translation>
diff --git a/chrome/app/resources/google_chrome_strings_or.xtb b/chrome/app/resources/google_chrome_strings_or.xtb
index 80ba415..7b10c97 100644
--- a/chrome/app/resources/google_chrome_strings_or.xtb
+++ b/chrome/app/resources/google_chrome_strings_or.xtb
@@ -299,7 +299,6 @@
 <translation id="4842397268809523050">ଆପଣଙ୍କ ଡୋମେନ ପାଇଁ ସିଙ୍କ ଉପଲବ୍ଧ ନଥିବା ଯୋଗୁଁ ChromeOS Flex ଆପଣଙ୍କ ଡାଟାକୁ ସିଙ୍କ କରିପାରିଲା ନାହିଁ।</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> ପୂର୍ବରୁ ସାଇନ ଇନ କରିଛନ୍ତି।  ଆପଣଙ୍କ ବ୍ରାଉଜିଂକୁ ଅଲଗା ରଖିବା ପାଇଁ <ph name="USER_EMAIL_ADDRESS" /> ଭାବେ ଆପଣଙ୍କ ନିଜ ପ୍ରୋଫାଇଲରେ Chromeରେ ସାଇନ ଇନ କରନ୍ତୁ।</translation>
 <translation id="4855026984605187434">ଆପଣଙ୍କ ସ୍କ୍ରିନ ସେୟାର କରିବାକୁ ସିଷ୍ଟମ ସେଟିଂସରେ Chrome ପାଇଁ ସ୍କ୍ରିନ ରେକର୍ଡିଂର ଅନୁମତି ଦିଅନ୍ତୁ</translation>
-<translation id="4873692836499071887">ଭବିଷ୍ୟତରେ Google Chromeର ଅପଡେଟଗୁଡ଼ିକ ପାଇବା ପାଇଁ ଆପଣ macOS 11 କିମ୍ବା ତା'ପରର ଭର୍ସନ ଆବଶ୍ୟକ କରିବେ। ଏହି କମ୍ପ୍ୟୁଟରରେ macOS 10.15 ଭର୍ସନ ବ୍ୟବହାର କରାଯାଉଛି।</translation>
 <translation id="4873783916118289636">Chromeର ମୁଖ୍ୟ ଗୋପନୀୟତା ଏବଂ ସୁରକ୍ଷା ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକର ସମୀକ୍ଷା କରନ୍ତୁ</translation>
 <translation id="4885446229353981848">ସର୍ବଦା Google Lens ସର୍ଟକଟ ଦେଖାନ୍ତୁ</translation>
 <translation id="4891791193823137474">ପୃଷ୍ଠଭୂମିରେ Google Chromeକୁ ଚାଲିବାକୁ ଦିଅନ୍ତୁ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pa.xtb b/chrome/app/resources/google_chrome_strings_pa.xtb
index 9502cc9..2b4e005 100644
--- a/chrome/app/resources/google_chrome_strings_pa.xtb
+++ b/chrome/app/resources/google_chrome_strings_pa.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">ChromeOS Flex ਤੁਹਾਡਾ ਡਾਟਾ ਸਿੰਕ ਨਹੀਂ ਕਰ ਸਕਿਆ ਕਿਉਂਕਿ ਸਿੰਕ ਤੁਹਾਡੇ ਡੋਮੇਨ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> ਨੇ ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਸਾਈਨ-ਇਨ ਕੀਤਾ ਹੋਇਆ ਹੈ।  ਆਪਣੀ ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ ਵੱਖਰਾ ਰੱਖਣ ਲਈ, Chrome ਦੇ ਅੰਦਰ ਆਪਣੇ ਖੁਦ ਦੇ ਪ੍ਰੋਫਾਈਲ ਵਿੱਚ <ph name="USER_EMAIL_ADDRESS" /> ਵਜੋਂ ਸਾਈਨ-ਇਨ ਕਰੋ।</translation>
 <translation id="4855026984605187434">ਆਪਣੀ ਸਕ੍ਰੀਨ ਨੂੰ ਸਾਂਝਾ ਕਰਨ ਲਈ, ਸਿਸਟਮ ਸੈਟਿੰਗਾਂ ਵਿੱਚ Chrome ਵਾਸਤੇ ਸਕ੍ਰੀਨ ਰਿਕਾਰਡ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿਓ</translation>
-<translation id="4873692836499071887">Google Chrome ਸੰਬੰਧੀ ਭਵਿੱਖੀ ਅੱਪਡੇਟ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ macOS 11 ਜਾਂ ਇਸ ਤੋਂ ਬਾਅਦ ਵਾਲੇ ਵਰਜਨ ਦੀ ਲੋੜ ਪਵੇਗੀ। ਇਸ ਕੰਪਿਊਟਰ 'ਤੇ macOS 10.15 ਵਰਜਨ ਵਰਤਿਆ ਜਾ ਰਿਹਾ ਹੈ।</translation>
 <translation id="4873783916118289636">Chrome 'ਤੇ ਪ੍ਰਮੁੱਖ ਪਰਦੇਦਾਰੀ ਅਤੇ ਸੁਰੱਖਿਆ ਕੰਟਰੋਲਾਂ ਦੀ ਸਮੀਖਿਆ ਕਰੋ</translation>
 <translation id="4885446229353981848">ਹਮੇਸ਼ਾਂ Google Lens ਸ਼ਾਰਟਕੱਟ ਦਿਖਾਓ</translation>
 <translation id="4891791193823137474">Google Chrome ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਵਿੱਚ ਚੱਲਣ ਦਿਓ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb
index a5e020b..bd29784 100644
--- a/chrome/app/resources/google_chrome_strings_pl.xtb
+++ b/chrome/app/resources/google_chrome_strings_pl.xtb
@@ -295,7 +295,6 @@
 <translation id="4842397268809523050">W ChromeOS Flex nie udało się zsynchronizować danych, ponieważ synchronizacja jest niedostępna w Twojej domenie.</translation>
 <translation id="4851866215237571846">Jesteś już zalogowany(a) na konto <ph name="EXISTING_USER" />.  Aby przeglądać osobno, zaloguj się w Chrome w swoim profilu jako <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Aby udostępnić ekran, pozwól Chrome na nagrywanie ekranu w ustawieniach systemu</translation>
-<translation id="4873692836499071887">Aby otrzymywać w przyszłości aktualizacje Google Chrome, musisz mieć system macOS 11 lub nowszy. Na tym komputerze jest zainstalowany system macOS 10.15.</translation>
 <translation id="4873783916118289636">Zapoznaj się z najważniejszymi funkcjami prywatności i bezpieczeństwa w Chrome</translation>
 <translation id="4885446229353981848">Zawsze pokazuj skrót do Obiektywu Google</translation>
 <translation id="4891791193823137474">Zezwalaj przeglądarce Google Chrome na działanie w tle</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-BR.xtb b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
index e83c1afa..795c6d4 100644
--- a/chrome/app/resources/google_chrome_strings_pt-BR.xtb
+++ b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">O ChromeOS Flex não pôde sincronizar seus dados porque a sincronização não está disponível para seu domínio.</translation>
 <translation id="4851866215237571846">A conta <ph name="EXISTING_USER" /> já está conectada.  Para manter sua navegação separada, faça login no Chrome no seu perfil como <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Para compartilhar a tela, use os Ajustes do Sistema para permitir a gravação de tela do Chrome</translation>
-<translation id="4873692836499071887">Para receber as próximas atualizações do Google Chrome, você vai precisar do macOS 11 ou versão mais recente. Este computador está usando o macOS 10.15.</translation>
 <translation id="4873783916118289636">Revise os principais controles de privacidade e segurança no Chrome</translation>
 <translation id="4885446229353981848">Sempre mostrar o atalho do Google Lens</translation>
 <translation id="4891791193823137474">Executar o Google Chrome em segundo plano</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-PT.xtb b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
index eea1bb3..0dde497 100644
--- a/chrome/app/resources/google_chrome_strings_pt-PT.xtb
+++ b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">O ChromeOS Flex não conseguiu sincronizar os dados porque a sincronização não está disponível para o seu domínio.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> já tem sessão iniciada.  Para manter a sua navegação separada, inicie sessão no Chrome no seu perfil como <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Para partilhar o ecrã, permita a gravação de ecrã para o Chrome nas Definições do sistema</translation>
-<translation id="4873692836499071887">Para receber atualizações futuras do Google Chrome, precisa do macOS 11 ou posterior. Este computador está a usar o macOS 10.15.</translation>
 <translation id="4873783916118289636">Reveja os principais controlos de privacidade e segurança no Chrome</translation>
 <translation id="4885446229353981848">Mostrar sempre o atalho do Google Lens</translation>
 <translation id="4891791193823137474">Permitir que o Google Chrome seja executado em segundo plano</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb
index fe1216a6..6c040e2a 100644
--- a/chrome/app/resources/google_chrome_strings_ro.xtb
+++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">ChromeOS Flex nu a putut sincroniza datele, deoarece sincronizarea nu este disponibilă pentru domeniu.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> s-a conectat deja.  Pentru a separa navigarea, conectează-te la Chrome în propriul profil ca <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Pentru a permite accesul la ecran, permite înregistrarea ecranului pentru Chrome din Setări de sistem</translation>
-<translation id="4873692836499071887">Pentru a primi actualizările Google Chrome viitoare, vei avea nevoie de macOS 11 sau o versiune ulterioară. Acest computer folosește macOS 10.15.</translation>
 <translation id="4873783916118289636">Examinează cele mai importante opțiuni de confidențialitate și de securitate din Chrome</translation>
 <translation id="4885446229353981848">Afișează întotdeauna comanda rapidă Google Lens</translation>
 <translation id="4891791193823137474">Permite ca Google Chrome să ruleze în fundal</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb
index 6637e56fb..dd038ac9 100644
--- a/chrome/app/resources/google_chrome_strings_ru.xtb
+++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -295,7 +295,6 @@
 <translation id="4842397268809523050">Chrome OS Flex не удалось синхронизировать данные, так как эта функция недоступна для вашего домена.</translation>
 <translation id="4851866215237571846">Активный профиль пользователя: <ph name="EXISTING_USER" />.  Чтобы данные о вашей работе в браузере хранились отдельно, войдите в собственный профиль Chrome (<ph name="USER_EMAIL_ADDRESS" />).</translation>
 <translation id="4855026984605187434">Чтобы запустить демонстрацию экрана, в системных настройках разрешите Chrome записывать с него видео.</translation>
-<translation id="4873692836499071887">На вашем устройстве используется macOS 10.15. Чтобы получать обновления Google Chrome, установите macOS 11 или более поздней версии.</translation>
 <translation id="4873783916118289636">Проверьте основные настройки конфиденциальности и безопасности в Chrome.</translation>
 <translation id="4885446229353981848">Всегда показывать значок Google Объектива</translation>
 <translation id="4891791193823137474">Разрешить работу Google Chrome в фоновом режиме</translation>
diff --git a/chrome/app/resources/google_chrome_strings_si.xtb b/chrome/app/resources/google_chrome_strings_si.xtb
index 06e0271..350b618 100644
--- a/chrome/app/resources/google_chrome_strings_si.xtb
+++ b/chrome/app/resources/google_chrome_strings_si.xtb
@@ -299,7 +299,6 @@
 <translation id="4842397268809523050">ඔබගේ වසම සඳහා සමමුහුර්තකරණය ලබා ගත නොහැකි නිසා ChromeOS Flex හට ඔබගේ දත්ත සමමුහුර්ත කළ නොහැකි විය.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> දැනටමත් පුරනය වී නැත.  ඔබේ බ්‍රවුස් කිරීම වෙනම තබා ගැනීමට, <ph name="USER_EMAIL_ADDRESS" /> ලෙස ඔබේම පැතිකඩෙන් Chrome හට පුරන්න.</translation>
 <translation id="4855026984605187434">ඔබේ තිරය බෙදා ගැනීමට, පද්ධති සැකසීම් තුළ Chrome සඳහා තිර පටිගත කිරීමට ඉඩ දෙන්න</translation>
-<translation id="4873692836499071887">අනාගත Google Chrome යාවත්කාලීන ලබා ගැනීමට, ඔබට macOS 11 හෝ ඊට පසු අනුවාද අවශ්‍ය වෙයි. මෙම පරිගණකය macOS 10.15 භාවිත කරයි.</translation>
 <translation id="4873783916118289636">Chrome හි ප්‍රධාන පෞද්ගලිකත්ව සහ ආරක්ෂක පාලන සමාලෝචනය කරන්න</translation>
 <translation id="4885446229353981848">සැම විට ම Google Lens කෙටිමඟ පෙන්වන්න</translation>
 <translation id="4891791193823137474">Google Chrome හට පසුබිමේ ක්‍රියාත්මක වීමට ඉඩ දෙන්න</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb
index 0f4ce79..3ba665ce 100644
--- a/chrome/app/resources/google_chrome_strings_sk.xtb
+++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -297,7 +297,6 @@
 <translation id="4842397268809523050">Systému Chrome OS Flex sa nepodarilo synchronizovať vaše údaje, pretože možnosť synchronizácie nie je pre vašu doménu k dispozícii.</translation>
 <translation id="4851866215237571846">Používateľ <ph name="EXISTING_USER" /> je už prihlásený.  Ak chcete, aby bolo vaše prehliadanie naďalej samostatné, prihláste sa vo svojom profile do Chromu profile účtom <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Ak chcete zdieľať obrazovku, povoľte Chromu nahrávať obrazovku v nastaveniach systému</translation>
-<translation id="4873692836499071887">Ak chcete dostávať budúce aktualizácie prehliadača Google Chrome, musíte používať systém macOS 11 alebo novší. V tomto počítači používate macOS 10.15.</translation>
 <translation id="4873783916118289636">Pozrite si hlavné ovládacie prvky ochrany súkromia a zabezpečenia v Chrome</translation>
 <translation id="4885446229353981848">Vždy zobrazovať odkaz na Google Lens</translation>
 <translation id="4891791193823137474">Povoliť prehliadaču Google Chrome spustenie na pozadí</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb
index 274743a..8e4d698 100644
--- a/chrome/app/resources/google_chrome_strings_sl.xtb
+++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">ChromeOS Flex ni mogel sinhronizirati podatkov, ker sinhronizacija ni na voljo za vašo domeno.</translation>
 <translation id="4851866215237571846">Uporabnik <ph name="EXISTING_USER" /> je že prijavljen.  Če želite ločiti brskanje, se v Chromu prijavite v svoj profil kot <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Če želite deliti zaslon, v sistemskih nastavitvah omogočite snemanje zaslona za Chrome.</translation>
-<translation id="4873692836499071887">Če želite prejemati prihodnje posodobitve Googla Chrome, potrebujete macOS 11 ali novejšo različico. V tem računalniku je nameščen macOS 10.15.</translation>
 <translation id="4873783916118289636">Oglejte si ključne kontrolnike zasebnosti in varnosti v Chromu.</translation>
 <translation id="4885446229353981848">Vedno pokaži bližnjico do Googla Lens</translation>
 <translation id="4891791193823137474">Naj se Google Chrome izvaja v ozadju</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sq.xtb b/chrome/app/resources/google_chrome_strings_sq.xtb
index a41b150..d2f89c0 100644
--- a/chrome/app/resources/google_chrome_strings_sq.xtb
+++ b/chrome/app/resources/google_chrome_strings_sq.xtb
@@ -299,7 +299,6 @@
 <translation id="4842397268809523050">Chrome OS Flex nuk mund t'i sinkronizonte të dhënat e tua sepse "Sinkronizimi" nuk ofrohet për domenin tënd.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> është identifikuar tashmë.  Për ta mbajtur shfletimin tënd të ndarë, identifikohu në Chrome në profilin tënd si <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Për të ndarë ekranin, lejo regjistrimin e ekranit për Chrome te "Cilësimet e sistemit"</translation>
-<translation id="4873692836499071887">Për të marrë përditësimet e ardhshme të Google Chrome, do të të duhet macOS 11 ose një version i mëvonshëm. Ky kompjuter përdor macOS 10.15.</translation>
 <translation id="4873783916118289636">Shqyrto kontrollet kryesore të sigurisë dhe privatësisë në Chrome</translation>
 <translation id="4885446229353981848">Shfaq gjithmonë shkurtoren e "Lentes së Google"</translation>
 <translation id="4891791193823137474">Lejo që Google Chrome të ekzekutohet në sfond</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb
index a3699b45..8111fcfe 100644
--- a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb
+++ b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">Chrome OS Flex ne može da sinhronizuje podatke jer sinhronizacija nije dostupna za domen.</translation>
 <translation id="4851866215237571846">Korisnik <ph name="EXISTING_USER" /> je već prijavljen.  Da bi vam pregledanje bilo razdvojeno, prijavite se u Chrome preko svog profila kao <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Da biste delili ekran, dozvolite snimanje ekrana za Chrome u podešavanjima sistema</translation>
-<translation id="4873692836499071887">Da biste dobijali buduća Google Chrome ažuriranja, treba vam macOS 11 ili novija verzija. Ovaj računar koristi macOS 10.15.</translation>
 <translation id="4873783916118289636">Pregledajte ključne kontrole privatnosti i bezbednosti u Chrome-u</translation>
 <translation id="4885446229353981848">Uvek prikazuj prečicu za Google objektiv</translation>
 <translation id="4891791193823137474">Neka Google Chrome radi u pozadini</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr.xtb b/chrome/app/resources/google_chrome_strings_sr.xtb
index c7fc1c4..d548ba0 100644
--- a/chrome/app/resources/google_chrome_strings_sr.xtb
+++ b/chrome/app/resources/google_chrome_strings_sr.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">Chrome OS Flex не може да синхронизује податке јер синхронизација није доступна за домен.</translation>
 <translation id="4851866215237571846">Корисник <ph name="EXISTING_USER" /> је већ пријављен.  Да би вам прегледање било раздвојено, пријавите се у Chrome преко свог профила као <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Да бисте делили екран, дозволите снимање екрана за Chrome у подешавањима система</translation>
-<translation id="4873692836499071887">Да бисте добијали будућа Google Chrome ажурирања, треба вам macOS 11 или новија верзија. Овај рачунар користи macOS 10.15.</translation>
 <translation id="4873783916118289636">Прегледајте кључне контроле приватности и безбедности у Chrome-у</translation>
 <translation id="4885446229353981848">Увек приказуј пречицу за Google објектив</translation>
 <translation id="4891791193823137474">Нека Google Chrome ради у позадини</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb
index 0fddc077..e2d4b2b 100644
--- a/chrome/app/resources/google_chrome_strings_sv.xtb
+++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">Det gick inte att synkronisera data med ChromeOS Flex eftersom synkronisering inte är tillgängligt för din domän.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> är redan inloggad.  Om du vill hålla isär webbinformationen loggar du in i Chrome i din egen profil med <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">För att dela skärmen tillåter du skärminspelning för Chrome i systeminställningarna</translation>
-<translation id="4873692836499071887">Du behöver macOS 11 eller senare för att få kommande uppdateringar av Google Chrome. På den här datorn används macOS 10.15.</translation>
 <translation id="4873783916118289636">Granska viktiga integritets- och säkerhetskontroller i Chrome</translation>
 <translation id="4885446229353981848">Visa alltid genväg till Google Lens</translation>
 <translation id="4891791193823137474">Låt Google Chrome köras i bakgrunden</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb
index 00d0368e..010fc60 100644
--- a/chrome/app/resources/google_chrome_strings_sw.xtb
+++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -300,7 +300,6 @@
 <translation id="4842397268809523050">ChromeOS Flex haikuweza kusawazisha data yako kwa sababu usawazishaji haupatikani katika kikoa chako.</translation>
 <translation id="4851866215237571846">Tayari umeingia katika akaunti ya <ph name="EXISTING_USER" />.  Ili utenganishe shughuli zako za kuvinjari, ingia katika akaunti kwenye Chrome katika wasifu wako binafsi ukitumia <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Ili uonyeshe skrini yako, washa kinasa skrini katika Chrome kwenye Mipangilio ya Mfumo</translation>
-<translation id="4873692836499071887">Utahitaji toleo la macOS 11 au toleo jipya zaidi ili upate masasisho ya Google Chrome ya siku zijazo Kompyuta hii inatumia toleo la macOS 10.15.</translation>
 <translation id="4873783916118289636">Kagua vidhibiti muhimu vya faragha na usalama katika Chrome</translation>
 <translation id="4885446229353981848">Onyesha njia ya mkato ya Lenzi ya Google kila wakati</translation>
 <translation id="4891791193823137474">Ruhusu Google Chrome iendeshe katika mandharinyuma</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ta.xtb b/chrome/app/resources/google_chrome_strings_ta.xtb
index 3e6a09a..84f286cd 100644
--- a/chrome/app/resources/google_chrome_strings_ta.xtb
+++ b/chrome/app/resources/google_chrome_strings_ta.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">உங்கள் டொமைனில் ஒத்திசைவு இல்லாததால், உங்கள் தரவை ChromeOS Flexஸால் ஒத்திசைக்க முடியவில்லை.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> ஆக ஏற்கெனவே உள்நுழைந்துள்ளீர்கள்.  உங்கள் உலாவலைத் தனிப்பட்டதாக வைத்திருக்க, உங்கள் சுயவிவரத்தில் <ph name="USER_EMAIL_ADDRESS" /> என்ற மின்னஞ்சல் முகவரி மூலம் Chromeமில் உள்நுழையவும்.</translation>
 <translation id="4855026984605187434">ஸ்கிரீனைப் பகிர, சிஸ்டம் அமைப்புகளில் Chromeமிற்கு ஸ்கிரீன் ரெக்கார்டிங்கை அனுமதிக்கவும்</translation>
-<translation id="4873692836499071887">இனிவரும் Google Chrome புதுப்பிப்புகளைப் பெற, macOS 11 அல்லது அதற்குப் பிந்தைய பதிப்பு தேவை. இந்தக் கம்ப்யூட்டர் macOS 10.15 பதிப்பைப் பயன்படுத்துகிறது.</translation>
 <translation id="4873783916118289636">Chromeமில் உள்ள முக்கியமான தனியுரிமை மற்றும் பாதுகாப்புக் கட்டுப்பாடுகளைச் சரிபாருங்கள்</translation>
 <translation id="4885446229353981848">Google Lens ஷார்ட்கட்டை எப்போதும் காட்டு</translation>
 <translation id="4891791193823137474">பின்னணியில் Google Chrome ஐ இயக்கு</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb
index a9c731d..02abc53a 100644
--- a/chrome/app/resources/google_chrome_strings_te.xtb
+++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">మీ డొమైన్‌కు సింక్ అందుబాటులో లేనందున, ChromeOS Flex మీ డేటాను సింక్ చేయలేకపోయింది.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" />‌తో ఇప్పటికే సైన్ ఇన్ చేశారు.  మీ బ్రౌజింగ్‌ను ప్రత్యేకంగా ఉంచడానికి, <ph name="USER_EMAIL_ADDRESS" />‌గా మీ స్వంత ప్రొఫైల్‌లో Chromeకి సైన్ ఇన్ చేయండి.</translation>
 <translation id="4855026984605187434">మీ స్క్రీన్‌ను షేర్ చేయడానికి, సిస్టమ్ సెట్టింగ్‌లలో Chrome కోసం స్క్రీన్ రికార్డింగ్‌ను అనుమతించండి</translation>
-<translation id="4873692836499071887">భవిష్యత్తులో Google Chrome అప్‌డేట్‌లను పొందడానికి, మీకు macOS 11 లేదా ఆ తర్వాతి వెర్షన్ అవసరం అవుతుంది. ఈ కంప్యూటర్ macOS 10.15 వెర్షన్‌ను ఉపయోగిస్తోంది.</translation>
 <translation id="4873783916118289636">Chromeలోని ముఖ్య గోప్యతా, సెక్యూరిటీ కంట్రోల్స్‌ను రివ్యూ చేయండి</translation>
 <translation id="4885446229353981848">Google Lens షార్ట్‌కట్‌ను ఎల్లప్పుడూ చూపించు</translation>
 <translation id="4891791193823137474">Google Chromeను బ్యాక్‌గ్రౌండ్‌లో అమలు అయ్యేలా అనుమతించండి</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb
index 96a96ef..a7e31285 100644
--- a/chrome/app/resources/google_chrome_strings_th.xtb
+++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -295,7 +295,6 @@
 <translation id="4842397268809523050">Chrome OS Flex ซิงค์ข้อมูลไม่ได้เนื่องจากการซิงค์ใช้ไม่ได้กับโดเมนของคุณ</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> ลงชื่อเข้าใช้อยู่แล้ว  หากต้องการแยกการท่องเว็บไว้ต่างหาก ให้ลงชื่อเข้าใช้ Chrome ในโปรไฟล์ของคุณเองด้วย <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="4855026984605187434">หากต้องการแชร์หน้าจอ ให้อนุญาตการบันทึกหน้าจอสำหรับ Chrome ใน "การตั้งค่าระบบ"</translation>
-<translation id="4873692836499071887">คุณจะต้องใช้ macOS 11 ขึ้นไปเพื่อรับการอัปเดต Google Chrome ในอนาคต คอมพิวเตอร์เครื่องนี้ใช้ macOS 10.15</translation>
 <translation id="4873783916118289636">ตรวจสอบการควบคุมที่สำคัญด้านความเป็นส่วนตัวและความปลอดภัยใน Chrome</translation>
 <translation id="4885446229353981848">แสดงทางลัด Google Lens เสมอ</translation>
 <translation id="4891791193823137474">ให้ Google Chrome ทำงานในเบื้องหลัง</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb
index 2231916..49d54ed 100644
--- a/chrome/app/resources/google_chrome_strings_tr.xtb
+++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -295,7 +295,6 @@
 <translation id="4842397268809523050">Alanınızda senkronizasyon kullanılamadığı için ChromeOS Flex, verilerinizi senkronize edemedi.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> zaten oturum açmış durumda.  Göz atma işlemlerinizi ayrı tutmak için Chrome'da kendi profilinizde <ph name="USER_EMAIL_ADDRESS" /> olarak oturum açın.</translation>
 <translation id="4855026984605187434">Ekranınızı paylaşmak için Sistem Ayarları'nda Chrome'un ekranı kaydetmesine izin verin.</translation>
-<translation id="4873692836499071887">Gelecekteki Google Chrome güncellemelerini almak için macOS 11 veya sonraki bir sürümün yüklü olması gerekir. Bu bilgisayar macOS 10.15 kullanıyor.</translation>
 <translation id="4873783916118289636">Chrome'daki önemli gizlilik ve güvenlik kontrollerini inceleyin</translation>
 <translation id="4885446229353981848">Google Lens kısayolunu her zaman göster</translation>
 <translation id="4891791193823137474">Google Chrome'un arka planda çalışmasına izin ver</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb
index 7d40b76f..c1491f7 100644
--- a/chrome/app/resources/google_chrome_strings_uk.xtb
+++ b/chrome/app/resources/google_chrome_strings_uk.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">ОС Chrome Flex не змогла синхронізувати дані, оскільки ця функція недоступна для вашого домену.</translation>
 <translation id="4851866215237571846">Ви вже ввійшли в обліковий запис <ph name="EXISTING_USER" />.  Щоб переглядати вебсторінки окремо, увійдіть у свій профіль у Chrome як <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Щоб показувати свій екран, у системних параметрах дозвольте Chrome записувати відео з екрана</translation>
-<translation id="4873692836499071887">Щоб отримувати майбутні оновлення Google Chrome, потрібна операційна система macOS 11 або новішої версії. На цьому комп’ютері встановлено macOS 10.15.</translation>
 <translation id="4873783916118289636">Перевірте основні елементи керування конфіденційністю та безпекою в Chrome</translation>
 <translation id="4885446229353981848">Завжди показувати ярлик Google Об’єктива</translation>
 <translation id="4891791193823137474">Дозволити Google Chrome працювати у фоновому режимі</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ur.xtb b/chrome/app/resources/google_chrome_strings_ur.xtb
index d83831b..e711a03 100644
--- a/chrome/app/resources/google_chrome_strings_ur.xtb
+++ b/chrome/app/resources/google_chrome_strings_ur.xtb
@@ -299,7 +299,6 @@
 <translation id="4842397268809523050">‏ChromeOS Flex آپ کے ڈیٹا کی مطابقت پذیری نہیں کر سکا کیونکہ مطابقت پذیری آپ کے ڈومین کیلئے دستیاب نہیں ہے۔</translation>
 <translation id="4851866215237571846">‏<ph name="EXISTING_USER" /> پہلے سے ہی سائن ان ہے۔  اپنی براؤزنگ کو الگ رکھنے کے لیے، اپنی پروفائل میں Chrome میں بطور <ph name="USER_EMAIL_ADDRESS" /> سائن ان کریں۔</translation>
 <translation id="4855026984605187434">‏اپنی اسکرین کا اشتراک کرنے کیلئے، سسٹم کی ترتیبات میں Chrome کیلئے اسکرین ریکارڈنگ کی اجازت دیں</translation>
-<translation id="4873692836499071887">‏مستقبل میں Google Chrome اپ ڈیٹس حاصل کرنے کے لیے، آپ کو macOS 11 یا اس کے بعد کے ورژن کی ضرورت ہوگی۔ یہ کمپیوٹر macOS 10.15 کا استعمال کر رہا ہے۔</translation>
 <translation id="4873783916118289636">‏Chrome میں کلیدی رازداری اور سیکیورٹی کنٹرولز کا جائزہ لیں</translation>
 <translation id="4885446229353981848">‏ہمیشہ Google لینز شارٹ کٹ دکھائیں</translation>
 <translation id="4891791193823137474">‏Google Chrome کو پس منظر میں چلنے دیں</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uz.xtb b/chrome/app/resources/google_chrome_strings_uz.xtb
index 1f34add..fde68a5 100644
--- a/chrome/app/resources/google_chrome_strings_uz.xtb
+++ b/chrome/app/resources/google_chrome_strings_uz.xtb
@@ -296,7 +296,6 @@
 <translation id="4842397268809523050">Domeningizda Sinxronlash xizmati mavjud emasligi sababli ChromeOS Flex maʼlumotlaringizni sinxronlay olmadi.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> hisobiga allaqachon kirilgan.  Internetni alohida kezish uchun Chromega shaxsiy profilingiz (<ph name="USER_EMAIL_ADDRESS" />) orqali kiring.</translation>
 <translation id="4855026984605187434">Ekranni ulashish uchun tizim sozlamalarida Chrome uchun ekranni yozib olishga ruxsat bering.</translation>
-<translation id="4873692836499071887">Google Chrome yangilanishlari macOS 11 yoki undan yuqori versiyalarda ishlaydi. Bu kompyuterdagi versiya: macOS 10.15.</translation>
 <translation id="4873783916118289636">Chrome ichida asosiy maxfiylik va xavfsizlik boshqaruvini tekshiring</translation>
 <translation id="4885446229353981848">Google Lens tezkor tugmasi doim chiqsin</translation>
 <translation id="4891791193823137474">Google Chrome fonda ishlashiga ruxsat</translation>
diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb
index a4e6f5e..9df0b75 100644
--- a/chrome/app/resources/google_chrome_strings_vi.xtb
+++ b/chrome/app/resources/google_chrome_strings_vi.xtb
@@ -298,7 +298,6 @@
 <translation id="4842397268809523050">ChromeOS Flex không đồng bộ hoá được dữ liệu của bạn vì miền của bạn không dùng được tính năng đồng bộ hoá.</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" /> đã đăng nhập.  Để tách biệt hoạt động duyệt web của bạn, hãy đăng nhập vào Chrome trong hồ sơ của riêng bạn qua địa chỉ <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Để chia sẻ màn hình, hãy cho phép Chrome ghi màn hình trong phần Cài đặt hệ thống</translation>
-<translation id="4873692836499071887">Để nhận các bản cập nhật Google Chrome sau này, bạn cần có macOS 11 trở lên. Máy tính này đang sử dụng macOS 10.15.</translation>
 <translation id="4873783916118289636">Xem các chế độ kiểm soát quan trọng đối với quyền riêng tư và tính bảo mật trong Chrome</translation>
 <translation id="4885446229353981848">Luôn hiện lối tắt đến Google Ống kính</translation>
 <translation id="4891791193823137474">Để Google Chrome chạy trên nền</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
index 4bde088..ae3afad 100644
--- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -295,7 +295,6 @@
 <translation id="4842397268809523050">ChromeOS Flex 无法同步您的数据,因为您的网域不支持同步。</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" />已登录。若要单独存储您的浏览数据,请使用您自己的个人资料 (<ph name="USER_EMAIL_ADDRESS" />) 登录 Chrome。</translation>
 <translation id="4855026984605187434">若要共享屏幕,请在“系统设置”中为 Chrome 启用屏幕录制功能</translation>
-<translation id="4873692836499071887">若要接收后续 Google Chrome 更新,您需使用 macOS 11 或更高版本。该计算机目前使用的是 macOS 10.15。</translation>
 <translation id="4873783916118289636">检查 Chrome 中重要的隐私控制设置和安全控件</translation>
 <translation id="4885446229353981848">始终显示 Google 智能镜头快捷方式</translation>
 <translation id="4891791193823137474">让 Google Chrome 浏览器在后台运行</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-HK.xtb b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
index cf560173..4642b72 100644
--- a/chrome/app/resources/google_chrome_strings_zh-HK.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
@@ -299,7 +299,6 @@
 <translation id="4842397268809523050">您的網域無法使用同步功能,因此 ChromeOS Flex 無法同步處理您的資料。</translation>
 <translation id="4851866215237571846"><ph name="EXISTING_USER" />已登入。如要分開保存你的瀏覽資料,請在 Chrome 中登入你的個人檔案 (<ph name="USER_EMAIL_ADDRESS" />)。</translation>
 <translation id="4855026984605187434">如要分享螢幕內容,請前往「系統設定」允許 Chrome 螢幕錄影</translation>
-<translation id="4873692836499071887">如要取得日後的 Google Chrome 更新,你將需要 macOS 11 或以上版本。此電腦正在使用 macOS 10.15。</translation>
 <translation id="4873783916118289636">查看 Chrome 中重要的私隱和安全控制項</translation>
 <translation id="4885446229353981848">總是顯示 Google 智能鏡頭捷徑</translation>
 <translation id="4891791193823137474">讓 Google Chrome 在背景執行</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
index 8590149..824316c 100644
--- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -295,7 +295,6 @@
 <translation id="4842397268809523050">你的網域無法使用同步功能,因此 ChromeOS Flex 無法同步處理你的資料。</translation>
 <translation id="4851866215237571846">目前登入的帳戶為:<ph name="EXISTING_USER" />。如要分開保存你的瀏覽資料,請在 Chrome 中登入你的設定檔 (<ph name="USER_EMAIL_ADDRESS" />)。</translation>
 <translation id="4855026984605187434">如要分享螢幕內容,請前往「系統設定」允許 Chrome 螢幕錄影</translation>
-<translation id="4873692836499071887">如果之後要更新 Google Chrome,請使用 macOS 11 以上版本。這部電腦目前的版本為 macOS 10.15。</translation>
 <translation id="4873783916118289636">查看 Chrome 中最重要的隱私權和安全性控制項</translation>
 <translation id="4885446229353981848">一律顯示 Google 智慧鏡頭捷徑</translation>
 <translation id="4891791193823137474">讓 Google Chrome 在背景執行</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zu.xtb b/chrome/app/resources/google_chrome_strings_zu.xtb
index c21e0bcd..0509503 100644
--- a/chrome/app/resources/google_chrome_strings_zu.xtb
+++ b/chrome/app/resources/google_chrome_strings_zu.xtb
@@ -299,7 +299,6 @@
 <translation id="4842397268809523050">I-ChromeOS Flex ayikwazanga ukuvumelanisa idatha yakho ngoba Ukuvumelanisa akutholakali esizindeni sakho.</translation>
 <translation id="4851866215237571846">U-<ph name="EXISTING_USER" /> usevele ungene ngemvume.  Ukugcina ukubhrawuza kwakho kuhlukile, ngena ngemvume ku-Chrome kuphrofayela yakho njengo-<ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="4855026984605187434">Ukuze wabelane ngesikrini sakho, vumela ukurekhodwa kwesikrini kweChrome Kumasethingi Ohlelo.</translation>
-<translation id="4873692836499071887">Ukuze uthole izibuyekezo zesikhathi esizayo ze-Google Chrome, uzodinga i-macOS 11 noma eyakamuva. Le khompyutha isebenzisa i-macOS 10.15.</translation>
 <translation id="4873783916118289636">Buyekeza izilawuli eziyinhloko zobumfihlo nokuvikeleka ku-Chrome</translation>
 <translation id="4885446229353981848">Bonisa njalo isinqmuleli seGoogle Lens</translation>
 <translation id="4891791193823137474">Vumela i-Google Chrome isebenze ngemuva</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 7eb5ae4..7aa5cd0 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -5098,6 +5098,9 @@
      flag_descriptions::kContextualPageActionsShareModelDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(
          segmentation_platform::features::kContextualPageActionShareModel)},
+    {"reader-mode-auto-distill", flag_descriptions::kReaderModeAutoDistillName,
+     flag_descriptions::kReaderModeAutoDistillDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(chrome::android::kReaderModeAutoDistill)},
     {"reader-mode-dev-entry-point",
      flag_descriptions::kReaderModeDevEntryPointName,
      flag_descriptions::kReaderModeDevEntryPointDescription, kOsAndroid,
diff --git a/chrome/browser/ai/ai_language_model.cc b/chrome/browser/ai/ai_language_model.cc
index 1eb246cc..8b44fff 100644
--- a/chrome/browser/ai/ai_language_model.cc
+++ b/chrome/browser/ai/ai_language_model.cc
@@ -61,54 +61,6 @@
       role, blink::mojom::AILanguageModelPromptContent::NewText(text));
 }
 
-// Get the corresponding ml::Token for the given `role`.
-ml::Token GetMLToken(blink::mojom::AILanguageModelPromptRole role) {
-  switch (role) {
-    case blink::mojom::AILanguageModelPromptRole::kSystem:
-      return ml::Token::kSystem;
-    case blink::mojom::AILanguageModelPromptRole::kUser:
-      return ml::Token::kUser;
-    case blink::mojom::AILanguageModelPromptRole::kAssistant:
-      return ml::Token::kModel;
-  }
-  NOTREACHED();
-}
-
-// Convert `prompts` to an on-device model input sequence.
-on_device_model::mojom::InputPtr BuildOnDeviceModelInput(
-    const std::vector<blink::mojom::AILanguageModelPromptPtr>& prompts) {
-  auto current_role = ml::Token::kEnd;
-  auto input = on_device_model::mojom::Input::New();
-
-  // Add `prompts` to `input`, interleaving role tokens as needed.
-  for (const auto& prompt : prompts) {
-    ml::Token new_role = GetMLToken(prompt->role);
-    if (new_role != current_role) {
-      input->pieces.emplace_back(new_role);
-      current_role = new_role;
-    }
-    if (prompt->content->is_text()) {
-      input->pieces.emplace_back(prompt->content->get_text());
-    } else if (prompt->content->is_bitmap()) {
-      input->pieces.emplace_back(prompt->content->get_bitmap());
-    } else if (prompt->content->is_audio()) {
-      // TODO: Export services/on_device_model/ml/chrome_ml_types_traits.cc.
-      const on_device_model::mojom::AudioDataPtr& audio_data =
-          prompt->content->get_audio();
-      ml::AudioBuffer audio_buffer;
-      audio_buffer.sample_rate_hz = audio_data->sample_rate;
-      audio_buffer.num_channels = audio_data->channel_count;
-      audio_buffer.num_frames = audio_data->frame_count;
-      audio_buffer.data = audio_data->data;
-      input->pieces.push_back(audio_buffer);
-    } else {
-      NOTREACHED();
-    }
-  }
-  input->pieces.emplace_back(ml::Token::kEnd);
-  return input;
-}
-
 // Construct an empty multimodal PromptApiRequest message.
 MultimodalMessage EmptyMessage() {
   return MultimodalMessage((PromptApiRequest()));
@@ -297,27 +249,6 @@
   for (auto& prompt : initial_prompts) {
     item.prompts.emplace_back(std::move(prompt));
   }
-  // TODO(crbug.com/385173789): Remove hacky multimodal prototype workarounds.
-  // If multimodal input is enabled, the initial prompts have to get added
-  // manually.
-  if (base::FeatureList::IsEnabled(
-          blink::features::kAIPromptAPIMultimodalInput)) {
-    if (system_prompt) {
-      auto system_prompt_ptr = blink::mojom::AILanguageModelPrompt::New();
-      system_prompt_ptr->role =
-          blink::mojom::AILanguageModelPromptRole::kSystem;
-      system_prompt_ptr->content =
-          blink::mojom::AILanguageModelPromptContent::NewText(*system_prompt);
-      initial_prompts.insert(initial_prompts.begin(),
-                             std::move(system_prompt_ptr));
-    }
-    if (!initial_prompts.empty()) {
-      auto append_options = on_device_model::mojom::AppendOptions::New();
-      append_options->input = BuildOnDeviceModelInput(initial_prompts);
-      append_options->max_tokens = context_->max_tokens();
-      session_->GetSession().Append(std::move(append_options), {});
-    }
-  }
   MultimodalMessage request = MakeInitialPrompt(item);
   session_->GetContextSizeInTokens(
       request.read(),
@@ -526,30 +457,6 @@
     return;
   }
 
-  // TODO(crbug.com/385173789): Remove hacky multimodal prototype workarounds.
-  // This lacks overflow handling, etc.
-  if (base::FeatureList::IsEnabled(
-          blink::features::kAIPromptAPIMultimodalInput)) {
-    mojo::PendingRemote<on_device_model::mojom::StreamingResponder>
-        response_remote;
-    mojo::PendingRemote<on_device_model::mojom::ContextClient> context_remote;
-    multimodal_responder_ = std::make_unique<MultimodalResponder>(
-        this, response_remote.InitWithNewPipeAndPassReceiver(),
-        context_remote.InitWithNewPipeAndPassReceiver(),
-        std::move(pending_responder));
-    auto append_options = on_device_model::mojom::AppendOptions::New();
-    append_options->input = BuildOnDeviceModelInput(prompts);
-    append_options->max_tokens = context_->max_tokens();
-    // Append the model token to make sure the model knows to give output.
-    append_options->input->pieces.push_back(ml::Token::kModel);
-    session_->GetSession().Append(std::move(append_options),
-                                  std::move(context_remote));
-    session_->GetSession().Generate(
-        on_device_model::mojom::GenerateOptions::New(),
-        std::move(response_remote));
-    return;
-  }
-
   // Clear the response from the previous execution.
   current_response_ = "";
   mojo::RemoteSetElementId responder_id =
diff --git a/chrome/browser/ai/ai_language_model_unittest.cc b/chrome/browser/ai/ai_language_model_unittest.cc
index b058416..5ebd3429 100644
--- a/chrome/browser/ai/ai_language_model_unittest.cc
+++ b/chrome/browser/ai/ai_language_model_unittest.cc
@@ -1113,137 +1113,4 @@
   }
 }
 
-// TODO(crbug.com/385173789): Remove hacky multimodal prototype workarounds.
-class MockOnDeviceVisionSession : public on_device_model::mojom::Session {
- public:
-  MockOnDeviceVisionSession() = default;
-  ~MockOnDeviceVisionSession() override = default;
-
-  // on_device_model::mojom::Session:
-  MOCK_METHOD(
-      void,
-      Append,
-      (on_device_model::mojom::AppendOptionsPtr options,
-       mojo::PendingRemote<on_device_model::mojom::ContextClient> client),
-      (override));
-
-  MOCK_METHOD(void,
-              Generate,
-              (on_device_model::mojom::GenerateOptionsPtr input,
-               mojo::PendingRemote<on_device_model::mojom::StreamingResponder>
-                   response),
-              (override));
-
-  MOCK_METHOD(void,
-              GetSizeInTokens,
-              (on_device_model::mojom::InputPtr input,
-               GetSizeInTokensCallback callback),
-              (override));
-
-  MOCK_METHOD(void,
-              Score,
-              (const std::string& text, ScoreCallback callback),
-              (override));
-
-  MOCK_METHOD(void,
-              Clone,
-              (mojo::PendingReceiver<on_device_model::mojom::Session> session),
-              (override));
-};
-
-// TODO(crbug.com/385173789): Remove hacky multimodal prototype workarounds.
-class AILanguageModelHackyPrototypeTest : public AILanguageModelTest {
- public:
-  void SetUp() override {
-    scoped_feature_list_.InitWithFeaturesAndParameters(
-        {{optimization_guide::features::kOptimizationGuideOnDeviceModel,
-          {{"on_device_model_image_input", "true"}}},
-         {blink::features::kAIPromptAPIMultimodalInput, {}}},
-        {});
-    // Avoid conflicting scoped_feature_list_ from AILanguageModelTest::SetUp().
-    AITestUtils::AITestBase::SetUp();
-  }
-
- private:
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-// Test Prompt() with image input.
-// TODO(crbug.com/385173789): Remove hacky multimodal prototype workarounds.
-TEST_F(AILanguageModelHackyPrototypeTest, Basic) {
-  MockOnDeviceVisionSession mock_on_device_vision_session;
-  // First call is for input.
-  EXPECT_CALL(mock_on_device_vision_session, Append(_, _))
-      .WillOnce([&](on_device_model::mojom::AppendOptionsPtr options,
-                    mojo::PendingRemote<on_device_model::mojom::ContextClient>
-                        client) {
-        auto pieces = options->input->pieces;
-        EXPECT_EQ(pieces.size(), 5u);
-        EXPECT_TRUE(std::holds_alternative<ml::Token>(pieces[0]));
-        EXPECT_TRUE(std::holds_alternative<std::string>(pieces[1]));
-        EXPECT_TRUE(std::holds_alternative<SkBitmap>(pieces[2]));
-        EXPECT_TRUE(std::holds_alternative<ml::Token>(pieces[3]));
-        EXPECT_TRUE(std::holds_alternative<ml::Token>(pieces[4]));
-        // Second call adds output to the session.
-        EXPECT_CALL(mock_on_device_vision_session, Append(_, _))
-            .WillOnce(
-                [&](on_device_model::mojom::AppendOptionsPtr options,
-                    mojo::PendingRemote<on_device_model::mojom::ContextClient>
-                        client) {
-                  auto pieces = options->input->pieces;
-                  EXPECT_EQ(pieces.size(), 2u);
-                  EXPECT_TRUE(std::holds_alternative<std::string>(pieces[0]));
-                  EXPECT_TRUE(std::holds_alternative<ml::Token>(pieces[1]));
-                });
-      });
-  EXPECT_CALL(mock_on_device_vision_session, Generate(_, _))
-      .WillOnce(
-          [&](on_device_model::mojom::GenerateOptionsPtr options,
-              mojo::PendingRemote<on_device_model::mojom::StreamingResponder>
-                  pending_responder) {
-            mojo::Remote<on_device_model::mojom::StreamingResponder> responder(
-                std::move(pending_responder));
-            auto chunk = on_device_model::mojom::ResponseChunk::New();
-            chunk->text = "Lovely, thanks for sharing";
-            responder->OnResponse(std::move(chunk));
-            responder->OnComplete(
-                on_device_model::mojom::ResponseSummary::New());
-          });
-
-  SetupMockOptimizationGuideKeyedService();
-  EXPECT_CALL(*mock_optimization_guide_keyed_service_, StartSession(_, _))
-      .WillOnce(
-          [&](optimization_guide::ModelBasedCapabilityKey feature,
-              const std::optional<optimization_guide::SessionConfigParams>&
-                  config_params) {
-            auto session = std::make_unique<
-                testing::NiceMock<optimization_guide::MockSession>>();
-            SetUpMockSession(*session);
-            // optimization_guide::Session execution is bypassed for now.
-            EXPECT_CALL(*session, GetContextSizeInTokens(_, _)).Times(0);
-            EXPECT_CALL(*session, AddContext(_)).Times(0);
-            EXPECT_CALL(*session, ExecuteModel(_, _)).Times(0);
-            EXPECT_CALL(*session, GetSession())
-                .WillRepeatedly(ReturnRef(mock_on_device_vision_session));
-            return session;
-          });
-
-  mojo::Remote<blink::mojom::AILanguageModel> mock_session =
-      CreateMockSession();
-  AITestUtils::MockModelStreamingResponder mock_responder;
-  base::RunLoop run_loop;
-  EXPECT_CALL(mock_responder, OnStreaming("Lovely, thanks for sharing"));
-  EXPECT_CALL(mock_responder, OnCompletion(_))
-      .WillOnce(testing::InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
-
-  std::vector<blink::mojom::AILanguageModelPromptPtr> input =
-      MakeInput(kTestPrompt);
-  input.push_back(blink::mojom::AILanguageModelPrompt::New(
-      Role::kUser, blink::mojom::AILanguageModelPromptContent::NewBitmap(
-                       CreateTestBitmap(10, 10))));
-  mock_session->Prompt(std::move(input), /*response_json_schema=*/std::nullopt,
-                       mock_responder.BindNewPipeAndPassRemote());
-  run_loop.Run();
-}
-
 }  // namespace
diff --git a/chrome/browser/apps/app_preload_service/app_preload_service_unittest.cc b/chrome/browser/apps/app_preload_service/app_preload_service_unittest.cc
index 51620a5..10e43d60 100644
--- a/chrome/browser/apps/app_preload_service/app_preload_service_unittest.cc
+++ b/chrome/browser/apps/app_preload_service/app_preload_service_unittest.cc
@@ -17,16 +17,21 @@
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/ash/app_list/arc/arc_app_list_prefs.h"
-#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
+#include "chrome/browser/ash/settings/scoped_testing_cros_settings.h"
 #include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
 #include "chrome/common/chrome_features.h"
+#include "chrome/test/base/scoped_testing_local_state.h"
+#include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chromeos/ash/components/settings/cros_settings.h"
 #include "chromeos/ash/components/system/fake_statistics_provider.h"
 #include "components/prefs/pref_service.h"
 #include "components/services/app_service/public/cpp/app_registry_cache.h"
 #include "components/services/app_service/public/cpp/app_update.h"
+#include "components/user_manager/fake_user_manager_delegate.h"
 #include "components/user_manager/scoped_user_manager.h"
 #include "components/user_manager/user_manager.h"
+#include "components/user_manager/user_manager_impl.h"
 #include "content/public/test/browser_task_environment.h"
 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
 #include "services/network/test/test_url_loader_factory.h"
@@ -50,8 +55,7 @@
 class AppPreloadServiceTest : public testing::Test {
  protected:
   AppPreloadServiceTest()
-      : scoped_user_manager_(std::make_unique<ash::FakeChromeUserManager>()),
-        startup_check_resetter_(
+      : startup_check_resetter_(
             AppPreloadService::DisablePreloadsOnStartupForTesting()) {
     scoped_feature_list_.InitWithFeatures(
         {features::kAppPreloadService, kAppPreloadServiceEnableShelfPin}, {});
@@ -61,7 +65,7 @@
   void SetUp() override {
     testing::Test::SetUp();
 
-    GetFakeUserManager()->SetIsCurrentUserNew(true);
+    user_manager::UserManager::Get()->SetIsCurrentUserNew(true);
 
     TestingProfile::Builder profile_builder;
     profile_builder.SetSharedURLLoaderFactory(
@@ -77,19 +81,21 @@
 
   Profile* GetProfile() { return profile_.get(); }
 
-  ash::FakeChromeUserManager* GetFakeUserManager() const {
-    return static_cast<ash::FakeChromeUserManager*>(
-        user_manager::UserManager::Get());
-  }
-
   network::TestURLLoaderFactory url_loader_factory_;
 
  private:
   // BrowserTaskEnvironment has to be the first member or test will break.
   content::BrowserTaskEnvironment task_environment_;
   base::test::ScopedFeatureList scoped_feature_list_;
+  ScopedTestingLocalState testing_local_state_{
+      TestingBrowserProcess::GetGlobal()};
+  ash::ScopedTestingCrosSettings testing_cros_settings_;
+  user_manager::ScopedUserManager scoped_user_manager_{
+      std::make_unique<user_manager::UserManagerImpl>(
+          std::make_unique<user_manager::FakeUserManagerDelegate>(),
+          testing_local_state_.Get(),
+          ash::CrosSettings::Get())};
   std::unique_ptr<TestingProfile> profile_;
-  user_manager::ScopedUserManager scoped_user_manager_;
   ash::system::ScopedFakeStatisticsProvider fake_statistics_provider_;
   base::AutoReset<bool> startup_check_resetter_;
 };
@@ -180,7 +186,7 @@
 }
 
 TEST_F(AppPreloadServiceTest, FirstLoginExistingUserNotStarted) {
-  GetFakeUserManager()->SetIsCurrentUserNew(false);
+  user_manager::UserManager::Get()->SetIsCurrentUserNew(false);
   TestingProfile existing_user_profile;
 
   auto* service = AppPreloadService::Get(&existing_user_profile);
diff --git a/chrome/browser/ash/crostini/crostini_manager.cc b/chrome/browser/ash/crostini/crostini_manager.cc
index a3974b6..746bbf2 100644
--- a/chrome/browser/ash/crostini/crostini_manager.cc
+++ b/chrome/browser/ash/crostini/crostini_manager.cc
@@ -1778,6 +1778,7 @@
   request.add_group_names("cdrom");
   request.add_group_names("dialout");
   request.add_group_names("floppy");
+  request.add_group_names("kvm");
   request.add_group_names("netdev");
   request.add_group_names("sudo");
   request.add_group_names("tss");
diff --git a/chrome/browser/autofill/android/autofill_image_fetcher_impl.cc b/chrome/browser/autofill/android/autofill_image_fetcher_impl.cc
index a973b20a..6c4ecbcb 100644
--- a/chrome/browser/autofill/android/autofill_image_fetcher_impl.cc
+++ b/chrome/browser/autofill/android/autofill_image_fetcher_impl.cc
@@ -21,7 +21,7 @@
 
 AutofillImageFetcherImpl::~AutofillImageFetcherImpl() = default;
 
-void AutofillImageFetcherImpl::FetchImagesForURLs(
+void AutofillImageFetcherImpl::FetchCreditCardArtImagesForURLs(
     base::span<const GURL> image_urls,
     base::span<const AutofillImageFetcherBase::ImageSize> image_sizes) {
   if (image_urls.empty()) {
@@ -35,7 +35,7 @@
   std::transform(image_sizes.begin(), image_sizes.end(),
                  std::back_inserter(image_sizes_vector),
                  [](auto image_size) { return static_cast<int>(image_size); });
-  Java_AutofillImageFetcher_prefetchImages(
+  Java_AutofillImageFetcher_prefetchCardArtImages(
       env, GetOrCreateJavaImageFetcher(), image_urls,
       base::android::ToJavaIntArray(env, image_sizes_vector));
 }
diff --git a/chrome/browser/autofill/android/autofill_image_fetcher_impl.h b/chrome/browser/autofill/android/autofill_image_fetcher_impl.h
index 85021f41..72c82b8 100644
--- a/chrome/browser/autofill/android/autofill_image_fetcher_impl.h
+++ b/chrome/browser/autofill/android/autofill_image_fetcher_impl.h
@@ -23,9 +23,10 @@
   ~AutofillImageFetcherImpl() override;
 
   // AutofillImageFetcherBase:
-  void FetchImagesForURLs(base::span<const GURL> image_urls,
-                          base::span<const AutofillImageFetcherBase::ImageSize>
-                              image_sizes) override;
+  void FetchCreditCardArtImagesForURLs(
+      base::span<const GURL> image_urls,
+      base::span<const AutofillImageFetcherBase::ImageSize> image_sizes)
+      override;
   void FetchPixAccountImages(base::span<const GURL> image_urls) override;
   const gfx::Image* GetCachedImageForUrl(const GURL& image_url) const override;
   base::android::ScopedJavaLocalRef<jobject> GetOrCreateJavaImageFetcher()
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/AutofillImageFetcher.java b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/AutofillImageFetcher.java
index d0ec65a..9521a5b 100644
--- a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/AutofillImageFetcher.java
+++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/AutofillImageFetcher.java
@@ -52,7 +52,7 @@
      * @param imageSizes The list of image sizes that should be fetched for each of the above URLs.
      */
     @CalledByNative
-    void prefetchImages(
+    void prefetchCardArtImages(
             @JniType("base::span<const GURL>") GURL[] urls, @ImageSize int[] imageSizes) {
         Context context = ContextUtils.getApplicationContext();
 
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
index 85f4d4c..43a19b2 100644
--- a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
+++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
@@ -1141,7 +1141,8 @@
         for (int i = 0; i < size; ++i) {
             cardArtUrls[i] = cardsToSuggest.get(i).getCardArtUrl();
         }
-        mImageFetcher.prefetchImages(cardArtUrls, new int[] {ImageSize.SMALL, ImageSize.LARGE});
+        mImageFetcher.prefetchCardArtImages(
+                cardArtUrls, new int[] {ImageSize.SMALL, ImageSize.LARGE});
     }
 
     /**
diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarCoordinator.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarCoordinator.java
index ee8e1e0a..71f7ba87 100644
--- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarCoordinator.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarCoordinator.java
@@ -22,6 +22,7 @@
 import org.chromium.chrome.browser.bookmarks.BookmarkOpener;
 import org.chromium.chrome.browser.bookmarks.R;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
+import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
 import org.chromium.ui.modelutil.PropertyModel;
@@ -39,6 +40,7 @@
      * Constructs the bookmark bar coordinator.
      *
      * @param activity The activity which is hosting the bookmark bar.
+     * @param activityLifecycleDispatcher The lifecycle dispatcher for the host activity.
      * @param browserControlsStateProvider The state provider for browser controls.
      * @param heightChangeCallback A callback to notify of bookmark bar height change events.
      * @param profileSupplier The supplier for the currently active profile.
@@ -48,6 +50,7 @@
      */
     public BookmarkBarCoordinator(
             @NonNull Activity activity,
+            @NonNull ActivityLifecycleDispatcher activityLifecycleDispatcher,
             @NonNull BrowserControlsStateProvider browserControlsStateProvider,
             @NonNull Callback<Integer> heightChangeCallback,
             @NonNull ObservableSupplier<Profile> profileSupplier,
@@ -85,11 +88,13 @@
         mMediator =
                 new BookmarkBarMediator(
                         activity,
+                        activityLifecycleDispatcher,
                         allBookmarksButtonModel,
                         browserControlsStateProvider,
                         heightChangeCallback,
                         itemsModel,
                         itemsLayoutManager.getItemsOverflowSupplier(),
+                        itemsLayoutManager::setItemMaxWidth,
                         model,
                         profileSupplier,
                         bookmarkOpener,
diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsLayoutManager.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsLayoutManager.java
index bbde03d..2cab845 100644
--- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsLayoutManager.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarItemsLayoutManager.java
@@ -32,14 +32,15 @@
  */
 class BookmarkBarItemsLayoutManager extends RecyclerView.LayoutManager {
 
-    private final int mItemMaxWidth;
     private final int mItemSpacing;
     private final ObservableSupplierImpl<Boolean> mItemsOverflowSupplier;
 
+    private int mItemMaxWidth;
+
     /**
      * Constructor.
      *
-     * @param context the context in which to render items.
+     * @param context The context in which to render items.
      */
     public BookmarkBarItemsLayoutManager(@NonNull Context context) {
         final Resources resources = context.getResources();
@@ -54,7 +55,7 @@
     }
 
     /**
-     * @return the supplier for the current state of items overflow.
+     * @return The supplier for the current state of items overflow.
      */
     public @NonNull ObservableSupplier<Boolean> getItemsOverflowSupplier() {
         return mItemsOverflowSupplier;
@@ -108,6 +109,16 @@
         mItemsOverflowSupplier.set(itemsOverflow);
     }
 
+    /**
+     * Sets the max width constraint for bookmark bar items. Note that the new constraint will not
+     * take effect until the next layout pass.
+     *
+     * @param itemMaxWidth The max width constraint.
+     */
+    public void setItemMaxWidth(int itemMaxWidth) {
+        mItemMaxWidth = itemMaxWidth;
+    }
+
     private int getStartOffset() {
         return LocalizationUtils.isLayoutRtl() ? getWidth() : 0;
     }
@@ -127,6 +138,9 @@
     }
 
     private void measureChild(@NonNull View child) {
+        // NOTE: Max width constraint must be set before measure/layout.
+        assert mItemMaxWidth > 0;
+
         final var lp = child.getLayoutParams();
 
         // NOTE: Width must be constrained via both layout params and measure spec. Otherwise a
diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarMediator.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarMediator.java
index baca422..b3e1811d 100644
--- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarMediator.java
+++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/bar/BookmarkBarMediator.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.bookmarks.bar;
 
 import android.app.Activity;
+import android.content.res.Configuration;
 import android.view.KeyEvent;
 import android.view.View;
 
@@ -22,6 +23,8 @@
 import org.chromium.chrome.browser.bookmarks.BookmarkOpener;
 import org.chromium.chrome.browser.bookmarks.R;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
+import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
+import org.chromium.chrome.browser.lifecycle.ConfigurationChangedObserver;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.TabLaunchType;
 import org.chromium.chrome.browser.ui.favicon.FaviconUtils;
@@ -44,13 +47,16 @@
         implements BookmarkBarItemsProvider.Observer, BrowserControlsStateProvider.Observer {
 
     private final Activity mActivity;
+    private final ActivityLifecycleDispatcher mActivityLifecycleDispatcher;
     private final PropertyModel mAllBookmarksButtonModel;
     private final BrowserControlsStateProvider mBrowserControlsStateProvider;
+    private final ConfigurationChangedObserver mConfigurationChangeObserver;
     private final Callback<Integer> mHeightChangeCallback;
     private final ObservableSupplierImpl<Integer> mHeightSupplier;
     private final ModelList mItemsModel;
     private final ObservableSupplier<Boolean> mItemsOverflowSupplier;
     private final Callback<Boolean> mItemsOverflowSupplierObserver;
+    private final Callback<Integer> mItemMaxWidthChangeCallback;
     private final PropertyModel mModel;
     private final ObservableSupplier<Profile> mProfileSupplier;
     private final Callback<Profile> mProfileSupplierObserver;
@@ -63,28 +69,32 @@
     /**
      * Constructs the bookmark bar mediator.
      *
-     * @param activity the activity which is hosting the bookmark bar.
-     * @param allBookmarksButtonModel the model for the 'All Bookmarks' button.
-     * @param browserControlsStateProvider the state provider for browser control
-     *     positioning/visibility.
-     * @param heightChangeCallback a callback to notify of bookmark bar height change events.
-     * @param itemsModel the model for the items which are rendered within the bookmark bar.
-     * @param itemsOverflowSupplier the supplier for the current state of items overflow.
-     * @param model the model used to read/write bookmark bar properties.
-     * @param profileSupplier the supplier for the currently active profile.
+     * @param activity The activity which is hosting the bookmark bar.
+     * @param activityLifecycleDispatcher The lifecycle dispatcher for the host activity.
+     * @param allBookmarksButtonModel The model for the 'All Bookmarks' button.
+     * @param browserControlsStateProvider The state provider for browser controls.
+     * @param heightChangeCallback A callback to notify of bookmark bar height change events.
+     * @param itemsModel The model for the items which are rendered within the bookmark bar.
+     * @param itemsOverflowSupplier The supplier for the current state of items overflow.
+     * @param itemMaxWidthChangeCallback A callback to notify of item max width change events.
+     * @param model The model used to read/write bookmark bar properties.
+     * @param profileSupplier The supplier for the currently active profile.
      */
     public BookmarkBarMediator(
             @NonNull Activity activity,
+            @NonNull ActivityLifecycleDispatcher activityLifecycleDispatcher,
             @NonNull PropertyModel allBookmarksButtonModel,
             @NonNull BrowserControlsStateProvider browserControlsStateProvider,
             @NonNull Callback<Integer> heightChangeCallback,
             @NonNull ModelList itemsModel,
             @NonNull ObservableSupplier<Boolean> itemsOverflowSupplier,
+            @NonNull Callback<Integer> itemMaxWidthChangeCallback,
             @NonNull PropertyModel model,
             @NonNull ObservableSupplier<Profile> profileSupplier,
             @NonNull BookmarkOpener bookmarkOpener,
             @NonNull ObservableSupplier<BookmarkManagerOpener> bookmarkManagerOpenerSupplier) {
         mActivity = activity;
+        mActivityLifecycleDispatcher = activityLifecycleDispatcher;
 
         mAllBookmarksButtonModel = allBookmarksButtonModel;
         mAllBookmarksButtonModel.set(
@@ -104,6 +114,9 @@
         mBrowserControlsStateProvider = browserControlsStateProvider;
         mBrowserControlsStateProvider.addObserver(this);
 
+        mConfigurationChangeObserver = this::onConfigurationChange;
+        mActivityLifecycleDispatcher.register(mConfigurationChangeObserver);
+
         // NOTE: Height will be updated when binding the `HEIGHT_CHANGE_CALLBACK` property.
         mHeightSupplier = new ObservableSupplierImpl<Integer>(0);
         mHeightChangeCallback = heightChangeCallback;
@@ -115,6 +128,8 @@
         mItemsOverflowSupplierObserver = this::onItemsOverflowChange;
         mItemsOverflowSupplier.addObserver(mItemsOverflowSupplierObserver);
 
+        mItemMaxWidthChangeCallback = itemMaxWidthChangeCallback;
+
         mModel = model;
         mModel.set(BookmarkBarProperties.HEIGHT_CHANGE_CALLBACK, mHeightSupplier::set);
         mModel.set(
@@ -128,12 +143,14 @@
         mBookmarkOpener = bookmarkOpener;
         mBookmarkManagerOpenerSupplier = bookmarkManagerOpenerSupplier;
 
+        updateItemMaxWidth();
         updateTopMargin();
         updateVisibility();
     }
 
     /** Destroys the bookmark bar mediator. */
     public void destroy() {
+        mActivityLifecycleDispatcher.unregister(mConfigurationChangeObserver);
         mAllBookmarksButtonModel.set(BookmarkBarButtonProperties.CLICK_CALLBACK, null);
         mBrowserControlsStateProvider.removeObserver(this);
         mHeightSupplier.removeObserver(mHeightChangeCallback);
@@ -277,6 +294,10 @@
         mBookmarkOpener.openBookmarkInCurrentTab(item.getId(), profile.isOffTheRecord());
     }
 
+    private void onConfigurationChange(@NonNull Configuration newConfig) {
+        updateItemMaxWidth();
+    }
+
     private void onItemsOverflowChange(boolean itemsOverflow) {
         mModel.set(
                 BookmarkBarProperties.OVERFLOW_BUTTON_VISIBILITY,
@@ -357,6 +378,13 @@
                 });
     }
 
+    private void updateItemMaxWidth() {
+        mItemMaxWidthChangeCallback.onResult(
+                mActivity
+                        .getResources()
+                        .getDimensionPixelSize(R.dimen.bookmark_bar_item_max_width));
+    }
+
     // TODO(crbug.com/339492600): Replace w/ positioning construct akin to `BottomControlsStacker`.
     private void updateTopMargin() {
         // NOTE: Top controls height is the sum of all top browser control heights which includes
diff --git a/chrome/browser/chrome_back_forward_cache_browsertest.cc b/chrome/browser/chrome_back_forward_cache_browsertest.cc
index 3caadd22..9004948 100644
--- a/chrome/browser/chrome_back_forward_cache_browsertest.cc
+++ b/chrome/browser/chrome_back_forward_cache_browsertest.cc
@@ -34,6 +34,7 @@
 #include "components/page_load_metrics/browser/observers/core/uma_page_load_metrics_observer.h"
 #include "components/permissions/permission_manager.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/permission_request_description.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/common/content_features.h"
@@ -244,7 +245,10 @@
       ->RequestPermissionFromCurrentDocument(
           rfh_a.get(),
           content::PermissionRequestDescription(
-              blink::PermissionType::GEOLOCATION, /* user_gesture = */ true),
+              content::PermissionDescriptorUtil::
+                  CreatePermissionDescriptorForPermissionType(
+                      blink::PermissionType::GEOLOCATION),
+              /* user_gesture = */ true),
           callback.Get());
 
   // Ensure |rfh_a| is evicted from the cache because it is not allowed to
diff --git a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabManagerUnitTest.java b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabManagerUnitTest.java
index 978f700..84d7177 100644
--- a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabManagerUnitTest.java
+++ b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/DataSharingTabManagerUnitTest.java
@@ -277,7 +277,11 @@
         doReturn(mProfile).when(mProfile).getOriginalProfile();
         doReturn(mSavedTabGroup).when(mTabGroupSyncService).getGroup(LOCAL_ID);
         mDataSharingTabManager.createOrManageFlow(
-                mActivity, /* syncId= */ null, LOCAL_ID, anyInt(), null);
+                mActivity,
+                /* syncId= */ null,
+                LOCAL_ID,
+                CollaborationServiceShareOrManageEntryPoint.UNKNOWN,
+                null);
 
         verify(mCollaborationService).startShareOrManageFlow(any(), eq(SYNC_GROUP_ID1), anyInt());
     }
diff --git a/chrome/browser/devtools/BUILD.gn b/chrome/browser/devtools/BUILD.gn
index 8ea5fa7..5c95b52a 100644
--- a/chrome/browser/devtools/BUILD.gn
+++ b/chrome/browser/devtools/BUILD.gn
@@ -394,7 +394,7 @@
   deps = []
   testonly = true
 
-  if (!is_android) {
+  if (enable_devtools_frontend) {
     deps += [
       ":devtools",
       "//base",
@@ -402,6 +402,20 @@
       "//chrome/browser/ui",
       "//content/public/browser",
       "//content/test:test_support",
+    ]
+
+    sources += [
+      "devtools_window_testing.cc",
+      "devtools_window_testing.h",
+    ]
+  }
+
+  if (!is_android) {
+    deps += [
+      ":devtools",
+      "//base",
+      "//content/public/browser",
+      "//content/test:test_support",
       "//net",
       "//net/traffic_annotation:test_support",
     ]
@@ -409,8 +423,6 @@
     sources += [
       "device/adb/mock_adb_server.cc",
       "device/adb/mock_adb_server.h",
-      "devtools_window_testing.cc",
-      "devtools_window_testing.h",
     ]
 
     defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
diff --git a/chrome/browser/devtools/devtools_browsertest.cc b/chrome/browser/devtools/devtools_browsertest.cc
index fb7d25d..51db30b 100644
--- a/chrome/browser/devtools/devtools_browsertest.cc
+++ b/chrome/browser/devtools/devtools_browsertest.cc
@@ -42,17 +42,6 @@
 #include "chrome/browser/devtools/devtools_window_testing.h"
 #include "chrome/browser/devtools/features.h"
 #include "chrome/browser/devtools/protocol/browser_handler.h"
-#include "chrome/browser/extensions/api/developer_private/developer_private_functions.h"
-#include "chrome/browser/extensions/chrome_extension_test_notification_observer.h"
-#include "chrome/browser/extensions/component_loader.h"
-#include "chrome/browser/extensions/extension_apitest.h"
-#include "chrome/browser/extensions/extension_browsertest.h"
-#include "chrome/browser/extensions/extension_management_constants.h"
-#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_util.h"
-#include "chrome/browser/extensions/scoped_test_mv2_enabler.h"
-#include "chrome/browser/extensions/unpacked_installer.h"
-#include "chrome/browser/lifetime/application_lifetime_desktop.h"
 #include "chrome/browser/lifetime/browser_shutdown.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "chrome/browser/policy/developer_tools_policy_handler.h"
@@ -68,22 +57,16 @@
 #include "chrome/browser/ui/autofill/autofill_popup_controller_impl_test_api.h"
 #include "chrome/browser/ui/autofill/autofill_suggestion_controller.h"
 #include "chrome/browser/ui/autofill/chrome_autofill_client.h"
-#include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/browser_list.h"
-#include "chrome/browser/ui/browser_window/public/browser_window_features.h"
-#include "chrome/browser/ui/tabs/tab_enums.h"
-#include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/ui/views/side_panel/extensions/extension_side_panel_manager.h"
-#include "chrome/browser/ui/views/side_panel/side_panel_ui.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_paths_internal.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/url_constants.h"
+#include "chrome/test/base/chrome_test_utils.h"
 #include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/platform_browser_test.h"
 #include "chrome/test/base/test_chrome_web_ui_controller_factory.h"
-#include "chrome/test/base/ui_test_utils.h"
 #include "components/autofill/content/browser/content_autofill_driver.h"
 #include "components/autofill/core/browser/foundations/browser_autofill_manager.h"
 #include "components/autofill/core/browser/foundations/browser_autofill_manager_test_delegate.h"
@@ -128,19 +111,6 @@
 #include "content/public/test/test_navigation_observer.h"
 #include "content/public/test/test_utils.h"
 #include "content/public/test/url_loader_interceptor.h"
-#include "extensions/browser/api_test_utils.h"
-#include "extensions/browser/extension_host_test_helper.h"
-#include "extensions/browser/extension_registry.h"
-#include "extensions/browser/extension_registry_observer.h"
-#include "extensions/browser/extension_system.h"
-#include "extensions/browser/offscreen_document_host.h"
-#include "extensions/browser/service_worker/service_worker_test_utils.h"
-#include "extensions/browser/test_extension_registry_observer.h"
-#include "extensions/common/manifest.h"
-#include "extensions/common/mojom/view_type.mojom.h"
-#include "extensions/common/switches.h"
-#include "extensions/test/extension_test_message_listener.h"
-#include "extensions/test/test_extension_dir.h"
 #include "mojo/public/cpp/bindings/sync_call_restrictions.h"
 #include "net/base/filename_util.h"
 #include "net/dns/mock_host_resolver.h"
@@ -158,6 +128,44 @@
 #include "ui/gl/gl_switches.h"
 #include "url/gurl.h"
 
+#if !BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/lifetime/application_lifetime_desktop.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/browser_window/public/browser_window_features.h"
+#include "chrome/browser/ui/tabs/tab_enums.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/views/side_panel/side_panel_ui.h"
+#include "chrome/test/base/ui_test_utils.h"
+#endif  // !BUILDFLAG(IS_ANDROID)
+
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+#include "chrome/browser/extensions/api/developer_private/developer_private_functions.h"
+#include "chrome/browser/extensions/chrome_extension_test_notification_observer.h"
+#include "chrome/browser/extensions/component_loader.h"
+#include "chrome/browser/extensions/extension_apitest.h"
+#include "chrome/browser/extensions/extension_browsertest.h"
+#include "chrome/browser/extensions/extension_management_constants.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_util.h"
+#include "chrome/browser/extensions/scoped_test_mv2_enabler.h"
+#include "chrome/browser/extensions/unpacked_installer.h"
+#include "chrome/browser/ui/views/side_panel/extensions/extension_side_panel_manager.h"
+#include "extensions/browser/api_test_utils.h"
+#include "extensions/browser/extension_host_test_helper.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extension_registry_observer.h"
+#include "extensions/browser/extension_system.h"
+#include "extensions/browser/offscreen_document_host.h"
+#include "extensions/browser/service_worker/service_worker_test_utils.h"
+#include "extensions/browser/test_extension_registry_observer.h"
+#include "extensions/common/manifest.h"
+#include "extensions/common/mojom/view_type.mojom.h"
+#include "extensions/common/switches.h"
+#include "extensions/test/extension_test_message_listener.h"
+#include "extensions/test/test_extension_dir.h"
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
+
 using content::DevToolsAgentHost;
 using content::DevToolsAgentHostObserver;
 using content::NavigationController;
@@ -171,9 +179,6 @@
 const char kDebuggerTestPage[] = "/devtools/debugger_test_page.html";
 const char kPauseWhenLoadingDevTools[] =
     "/devtools/pause_when_loading_devtools.html";
-const char kPageWithContentScript[] = "/devtools/page_with_content_script.html";
-const char kNavigateBackTestPage[] = "/devtools/navigate_back.html";
-const char kWindowOpenTestPage[] = "/devtools/window_open.html";
 const char kLatencyInfoTestPage[] = "/devtools/latency_info.html";
 const char kChunkedTestPage[] = "/chunked";
 const char kPushTestPage[] = "/devtools/push_test_page.html";
@@ -182,21 +187,25 @@
 const char kPushUseNullEndTime[] = "pushUseNullEndTime";
 const char kSlowTestPage[] =
     "/chunked?waitBeforeHeaders=100&waitBetweenChunks=100&chunksNumber=2";
-const char kSharedWorkerTestPage[] = "/workers/workers_ui_shared_worker.html";
-const char kSharedWorkerTestWorker[] = "/workers/workers_ui_shared_worker.js";
-const char kReloadSharedWorkerTestPage[] =
-    "/workers/debug_shared_worker_initialization.html";
-const char kReloadSharedWorkerTestWorker[] =
-    "/workers/debug_shared_worker_initialization.js";
-const char kEmulateNetworkConditionsPage[] =
-    "/devtools/emulate_network_conditions.html";
-const char kDispatchKeyEventShowsAutoFill[] =
-    "/devtools/dispatch_key_event_shows_auto_fill.html";
-const char kDOMWarningsTestPage[] = "/devtools/dom_warnings_page.html";
 const char kEmptyTestPage[] = "/devtools/empty.html";
 // Arbitrary page that returns a 200 response, for tests that don't care about
 // more than that.
 const char kArbitraryPage[] = "/title1.html";
+#if !BUILDFLAG(IS_ANDROID)
+const char kDispatchKeyEventShowsAutoFill[] =
+    "/devtools/dispatch_key_event_shows_auto_fill.html";
+const char kEmulateNetworkConditionsPage[] =
+    "/devtools/emulate_network_conditions.html";
+const char kNavigateBackTestPage[] = "/devtools/navigate_back.html";
+const char kPageWithContentScript[] = "/devtools/page_with_content_script.html";
+const char kReloadSharedWorkerTestPage[] =
+    "/workers/debug_shared_worker_initialization.html";
+const char kReloadSharedWorkerTestWorker[] =
+    "/workers/debug_shared_worker_initialization.js";
+const char kSharedWorkerTestPage[] = "/workers/workers_ui_shared_worker.html";
+const char kSharedWorkerTestWorker[] = "/workers/workers_ui_shared_worker.js";
+const char kWindowOpenTestPage[] = "/devtools/window_open.html";
+#endif  // !BUILDFLAG(IS_ANDROID)
 
 template <typename... T>
 void DispatchOnTestSuiteSkipCheck(DevToolsWindow* window,
@@ -246,6 +255,7 @@
   DispatchOnTestSuite(window, test_name);
 }
 
+#if !BUILDFLAG(IS_ANDROID)
 void SwitchToPanel(DevToolsWindow* window, const char* panel) {
   DispatchOnTestSuite(window, "switchToPanel", panel);
 }
@@ -286,10 +296,11 @@
     WebContents* wc) {
   return content::DevToolsAgentHost::GetOrCreateForTab(wc);
 }
+#endif  // !BUILDFLAG(IS_ANDROID)
 
 }  // namespace
 
-class DevToolsTest : public InProcessBrowserTest {
+class DevToolsTest : public PlatformBrowserTest {
  public:
   DevToolsTest() : window_(nullptr) {}
 
@@ -344,7 +355,7 @@
     } else {
       url = GURL(test_page);
     }
-    ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
+    ASSERT_TRUE(content::NavigateToURL(GetInspectedTab(), url));
   }
 
   void OpenDevToolsWindow(const std::string& test_page, bool is_docked) {
@@ -354,21 +365,13 @@
                                                             is_docked);
   }
 
-  void OpenDevToolsWindowOnOffTheRecordTab(const std::string& test_page) {
-    GURL url;
-    if (base::StartsWith(test_page, "/")) {
-      url = embedded_test_server()->GetURL(test_page);
-    } else {
-      url = GURL(test_page);
-    }
-    auto* otr_browser = OpenURLOffTheRecord(browser()->profile(), url);
-
-    window_ = DevToolsWindowTesting::OpenDevToolsWindowSync(
-        otr_browser->tab_strip_model()->GetWebContentsAt(0), false);
-  }
-
   WebContents* GetInspectedTab() {
+#if BUILDFLAG(IS_ANDROID)
+    // Note: This doesn't work well when there are multiple tabs.
+    return chrome_test_utils::GetActiveWebContents(this);
+#else
     return browser()->tab_strip_model()->GetWebContentsAt(0);
+#endif
   }
 
   void CloseDevToolsWindow() {
@@ -399,6 +402,7 @@
   }
 };
 
+#if !BUILDFLAG(IS_ANDROID)
 // Used to block until a dev tools window gets beforeunload event.
 class DevToolsWindowBeforeUnloadObserver : public content::WebContentsObserver {
  public:
@@ -525,7 +529,9 @@
     return view;
   }
 };
+#endif  // !BUILDFLAG(IS_ANDROID)
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
 constexpr char kPublicKey[] =
     "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8c4fBSPZ6utYoZ8NiWF/"
     "DSaimBhihjwgOsskyleFGaurhi3TDClTVSGPxNkgCzrz0wACML7M4aNjpd05qupdbR2d294j"
@@ -815,7 +821,9 @@
   RunTestFunction(window_, "waitForTestResultsInConsole");
   CloseDevToolsWindow();
 }
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
+#if !BUILDFLAG(IS_ANDROID)
 class WorkerDevToolsTest : public InProcessBrowserTest {
  public:
   WorkerDevToolsTest() : window_(nullptr) {}
@@ -1046,6 +1054,7 @@
     close_observer->Wait();
   }
 }
+#endif  // !BUILDFLAG(IS_ANDROID)
 
 // Tests scripts panel showing.
 IN_PROC_BROWSER_TEST_F(DevToolsTest, TestShowScriptsTab) {
@@ -1063,6 +1072,7 @@
   RunTest("testShowRecorderTab", kDebuggerTestPage);
 }
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
 // Tests that chrome.devtools extension is correctly exposed.
 IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest, TestDevToolsExtensionAPI) {
   LoadExtension("devtools_extension");
@@ -1666,6 +1676,7 @@
   EXPECT_EQ(extensions_instance,
             devtools_extension_panel_frame_rfh->GetSiteInstance());
 }
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
 // Tests that a devtools (not a devtools extension) Iframe can be injected into
 // devtools.  http://crbug.com/570483
@@ -1711,6 +1722,7 @@
   EXPECT_EQ(devtools_url.DeprecatedGetOriginAsURL().spec(), message + "/");
 }
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
 // Some web features, when used from an extension, are subject to browser-side
 // security policy enforcement. Make sure they work properly from inside a
 // devtools extension.
@@ -2175,6 +2187,7 @@
                        CantGetFileResourceWithoutFileAccessMixedCase) {
   Run(false, "fILe:");
 }
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
 // This test is flaky on Mac and Linux.
 // TODO(crbug.com/40787389): Enable the test.
@@ -2288,16 +2301,7 @@
   CloseDevToolsWindow();
 }
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
-// Flaky on Windows: https://crbug.com/1087320
-// Flaky on Linux: http://crbug.com/331650494
-#define MAYBE_TestDOMWarnings DISABLED_TestDOMWarnings
-#else
-#define MAYBE_TestDOMWarnings TestDOMWarnings
-#endif
-IN_PROC_BROWSER_TEST_F(DevToolsTest, MAYBE_TestDOMWarnings) {
-  RunTest("testDOMWarnings", kDOMWarningsTestPage);
-}
+#if !BUILDFLAG(IS_ANDROID)
 
 // Tests that console messages are not duplicated on navigation back.
 // Flaking on windows swarm try runs: crbug.com/409285.
@@ -2400,6 +2404,7 @@
   RunTestFunction(window_, "testForwardedKeysChanged");
   CloseDevToolsWindow();
 }
+#endif  // !BUILDFLAG(IS_ANDROID)
 
 IN_PROC_BROWSER_TEST_F(DevToolsTest, testCloseActionRecorded) {
   base::UserActionTester user_action_tester;
@@ -2430,6 +2435,7 @@
   CloseDevToolsWindow();
 }
 
+#if !BUILDFLAG(IS_ANDROID)
 // Tests that external navigation from inspector page is always handled by
 // DevToolsWindow and results in inspected page navigation.  See also
 // https://crbug.com/180555.
@@ -2662,7 +2668,9 @@
   EXPECT_FALSE(DevToolsAgentHost::GetForId(agent_id).get())
       << "DevToolsAgentHost is not released when the tab is closed";
 }
+#endif  // !BUILDFLAG(IS_ANDROID)
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
 class RemoteDebuggingTest : public extensions::ExtensionApiTest {
   void SetUpCommandLine(base::CommandLine* command_line) override {
     extensions::ExtensionApiTest::SetUpCommandLine(command_line);
@@ -2742,7 +2750,9 @@
     });
 
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
+#if !BUILDFLAG(IS_ANDROID)
 IN_PROC_BROWSER_TEST_F(DevToolsTest, PolicyDisallowed) {
   DisallowDevTools(browser());
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));
@@ -2766,7 +2776,9 @@
   DisallowDevTools(browser());
   EXPECT_FALSE(DevToolsWindow::FindDevToolsWindow(agent_host.get()));
 }
+#endif  // !BUILDFLAG(IS_ANDROID)
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
 using ManifestLocation = extensions::mojom::ManifestLocation;
 class DevToolsDisallowedForForceInstalledExtensionsPolicyTest
     : public extensions::ExtensionBrowserTest {
@@ -2941,6 +2953,7 @@
   EXPECT_FALSE(DevToolsWindow::FindDevToolsWindow(agent_host.get()));
 #endif
 }
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
 class DevToolsPixelOutputTests : public DevToolsTest {
  public:
@@ -2996,6 +3009,7 @@
   CloseDevToolsWindow();
 }
 
+#if !BUILDFLAG(IS_ANDROID)
 class DevToolsNetInfoTest : public DevToolsTest {
  protected:
   void SetUpCommandLine(base::CommandLine* command_line) override {
@@ -3453,7 +3467,9 @@
   window = DevToolsWindow::FindDevToolsWindow(agent.get());
   ASSERT_EQ(nullptr, window);
 }
+#endif  // !BUILDFLAG(IS_ANDROID)
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
 class DevToolsExtensionHostsPolicyTest : public DevToolsExtensionTest {
  protected:
   DevToolsExtensionHostsPolicyTest() {
@@ -3540,7 +3556,9 @@
   ASSERT_TRUE(extension);
   RunTest("waitForTestResultsAsMessage", url.spec());
 }
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
+#if !BUILDFLAG(IS_ANDROID)
 // Times out. See https://crbug.com/819285.
 IN_PROC_BROWSER_TEST_F(SitePerProcessDevToolsTest,
                        DISABLED_InputDispatchEventsToOOPIF) {
@@ -3569,7 +3587,9 @@
   RunTestFunction(window, "testInputDispatchEventsToOOPIF");
   DevToolsWindowTesting::CloseDevToolsWindowSync(window);
 }
+#endif  // !BUILDFLAG(IS_ANDROID)
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
 // See https://crbug.com/971241
 IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
                        DISABLED_ExtensionWebSocketUserAgentOverride) {
@@ -3603,6 +3623,7 @@
   DispatchOnTestSuite(window_, "testSourceMapsFromDevtools");
   CloseDevToolsWindow();
 }
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
 // TODO(crbug.com/331650494): Test is flaky on Linux debug build.
 #if BUILDFLAG(IS_LINUX) && !defined(NDEBUG)
@@ -3619,6 +3640,7 @@
   CloseDevToolsWindow();
 }
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
 // TODO(crbug.com/40937316): Test is flaky on Linux.
 #if BUILDFLAG(IS_LINUX)
 #define MAYBE_ExtensionWebSocketOfflineNetworkConditions \
@@ -3666,6 +3688,7 @@
 
   histograms.ExpectBucketCount(histogram_name, false, 2);
 }
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
 namespace {
 
@@ -3707,7 +3730,7 @@
   OpenDevToolsWindow("about:blank", true);
   EXPECT_TRUE(NavigatorLanguageMatches("es"));
 
-  PrefService* prefs = browser()->profile()->GetPrefs();
+  PrefService* prefs = chrome_test_utils::GetProfile(this)->GetPrefs();
   prefs->SetString(language::prefs::kAcceptLanguages, "de-DE");
 
   EXPECT_TRUE(NavigatorLanguageMatches("es"));
@@ -3770,6 +3793,7 @@
   CloseDevToolsWindow();
 }
 
+#if !BUILDFLAG(IS_ANDROID)
 IN_PROC_BROWSER_TEST_F(DevToolsFetchTest, FetchFromDevToolsSchemeIsProhibited) {
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));
 
@@ -4442,3 +4466,4 @@
   EXPECT_EQ(window_, DevToolsWindow::FindDevToolsWindow(agent_host.get()));
   DevToolsWindowTesting::Get(window_)->CloseDevToolsWindowSync(window_);
 }
+#endif  // !BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/devtools/devtools_window_testing.cc b/chrome/browser/devtools/devtools_window_testing.cc
index d2fa937..4c1a078b 100644
--- a/chrome/browser/devtools/devtools_window_testing.cc
+++ b/chrome/browser/devtools/devtools_window_testing.cc
@@ -13,14 +13,17 @@
 #include "chrome/browser/browser_features.h"
 #include "chrome/browser/devtools/chrome_devtools_manager_delegate.h"
 #include "chrome/browser/devtools/devtools_window.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_window.h"
-#include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "content/public/browser/devtools_agent_host.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/test_utils.h"
 
+#if !BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#endif  // !BUILDFLAG(IS_ANDROID)
+
 namespace {
 
 const char kHarnessScript[] = "Tests.js";
@@ -47,9 +50,11 @@
   if (!close_callback_.is_null())
     std::move(close_callback_).Run();
 
+#if !BUILDFLAG(IS_ANDROID)
   // Needed for Chrome_DevToolsADBThread to shut down gracefully in tests.
   ChromeDevToolsManagerDelegate::GetInstance()
       ->ResetAndroidDeviceManagerForTesting();
+#endif  // !BUILDFLAG(IS_ANDROID)
 }
 
 // static
@@ -157,6 +162,7 @@
       is_docked);
 }
 
+#if !BUILDFLAG(IS_ANDROID)
 // static
 DevToolsWindow* DevToolsWindowTesting::OpenDevToolsWindowSync(
     Browser* browser,
@@ -164,6 +170,7 @@
   return OpenDevToolsWindowSync(
       browser->tab_strip_model()->GetActiveWebContents(), is_docked);
 }
+#endif  // !BUILDFLAG(IS_ANDROID)
 
 // static
 DevToolsWindow* DevToolsWindowTesting::OpenDevToolsWindowSync(
@@ -191,7 +198,11 @@
   if (window->is_docked_) {
     window->CloseWindow();
   } else {
+#if BUILDFLAG(IS_ANDROID)
+    window->main_web_contents_->Close();
+#else
     window->browser_->window()->Close();
+#endif  // BUILDFLAG(IS_ANDROID)
   }
 }
 
diff --git a/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc b/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc
index bb3889ce..a374bb4 100644
--- a/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc
+++ b/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -1883,6 +1883,32 @@
   EXPECT_EQ(1u, result()->FindList("targetInfos")->size());
 }
 
+IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, HiddenTargetIsTheLastOne) {
+  AttachToBrowserTarget();
+
+  ASSERT_EQ(browser()->tab_strip_model()->count(), 1);
+
+  SendCommandSync("Target.getTargets");
+  ASSERT_EQ(1u, result()->FindList("targetInfos")->size());
+  const std::string targetId(*result()
+                                  ->FindList("targetInfos")
+                                  ->front()
+                                  .GetDict()
+                                  .FindString("targetId"));
+
+  SendCommandSync(
+      "Target.createTarget",
+      base::Value::Dict().Set("url", "about:blank").Set("hidden", true));
+
+  SendCommandSync("Target.getTargets");
+  EXPECT_EQ(2u, result()->FindList("targetInfos")->size());
+
+  SendCommandSync("Target.closeTarget",
+                  base::Value::Dict().Set("targetId", targetId));
+
+  ui_test_utils::WaitForBrowserToClose();
+}
+
 IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest,
                        NotHiddenTargetIsVisibleInTabStrip) {
   AttachToBrowserTarget();
diff --git a/chrome/browser/direct_sockets/direct_sockets_apitest.cc b/chrome/browser/direct_sockets/direct_sockets_apitest.cc
index 3f582d72..b1c634a 100644
--- a/chrome/browser/direct_sockets/direct_sockets_apitest.cc
+++ b/chrome/browser/direct_sockets/direct_sockets_apitest.cc
@@ -384,20 +384,61 @@
 
 class ChromeAppApiTest : public extensions::ExtensionApiTest {
  public:
+  static constexpr std::string_view kWorkerScriptTemplate = R"(
+    self.onmessage = async e => {
+      try {
+        await %s;
+        self.postMessage(null);
+      } catch (err) {
+        self.postMessage({ error: err });
+      }
+    };
+  )";
+
+  static constexpr std::string_view kWorkerConnect = R"(
+    new Promise((resolve, reject) => {
+      const policy = trustedTypes.createPolicy("default", {
+        createScriptURL: (url) => url,
+      });
+      const worker = new Worker(
+        policy.createScriptURL('/worker.js')
+      );
+      worker.onmessage = e => {
+        if (e.data) {
+          reject(e.data.error);
+        } else {
+          resolve();
+        }
+      };
+      worker.postMessage(null);
+    });
+  )";
   content::RenderFrameHost* InstallAndOpenChromeApp(
       const base::Value::Dict& manifest) {
-    dir.WriteManifest(manifest);
-    dir.WriteFile(FILE_PATH_LITERAL("background.js"), "");
+    dir_.WriteManifest(manifest);
+    dir_.WriteFile(FILE_PATH_LITERAL("background.js"), "");
+    return InstallAndOpenChromeApp();
+  }
 
+  content::RenderFrameHost* InstallAndOpenChromeAppWithWorkerScript(
+      const base::Value::Dict& manifest,
+      std::string_view worker_script) {
+    dir_.WriteManifest(manifest);
+    dir_.WriteFile(FILE_PATH_LITERAL("background.js"), "");
+    dir_.WriteFile(FILE_PATH_LITERAL("worker.js"), worker_script);
+    return InstallAndOpenChromeApp();
+  }
+
+ private:
+  content::RenderFrameHost* InstallAndOpenChromeApp() {
     const extensions::Extension& extension =
-        CHECK_DEREF(LoadExtension(dir.UnpackedPath()));
+        CHECK_DEREF(LoadExtension(dir_.UnpackedPath()));
     return CHECK_DEREF(extensions::ProcessManager::Get(profile())
                            ->GetBackgroundHostForExtension(extension.id()))
         .main_frame_host();
   }
 
- private:
-  extensions::TestExtensionDir dir;
+  extensions::TestExtensionDir dir_;
 };
 
 using ChromeDirectSocketsTcpApiTest =
@@ -415,6 +456,19 @@
       IsOk());
 }
 
+IN_PROC_BROWSER_TEST_F(ChromeDirectSocketsTcpApiTest, TcpReadWriteFromWorker) {
+  const std::string worker_script = base::StringPrintf(
+      kWorkerScriptTemplate, content::JsReplace(kTcpReadWriteScript, kHostname,
+                                                test_server()->port()));
+
+  content::RenderFrameHost* app_frame = InstallAndOpenChromeAppWithWorkerScript(
+      GenerateManifest(/*socket_permissions=*/base::Value::Dict().Set(
+          "tcp", base::Value::Dict().Set("connect", "*"))),
+      worker_script);
+
+  ASSERT_THAT(EvalJs(app_frame, kWorkerConnect), IsOk());
+}
+
 IN_PROC_BROWSER_TEST_F(ChromeDirectSocketsTcpApiTest,
                        TcpSocketUndefinedWithoutSocketsPermission) {
   // "sockets" key is not present in the manifest.
@@ -464,6 +518,20 @@
       IsOk());
 }
 
+IN_PROC_BROWSER_TEST_F(ChromeDirectSocketsUdpApiTest, UdpReadWriteFromWorker) {
+  const std::string worker_script =
+      base::StringPrintf(kWorkerScriptTemplate,
+                         content::JsReplace(kUdpConnectedReadWriteScript,
+                                            kHostname, test_server()->port()));
+
+  content::RenderFrameHost* app_frame = InstallAndOpenChromeAppWithWorkerScript(
+      GenerateManifest(/*socket_permissions=*/base::Value::Dict().Set(
+          "udp", base::Value::Dict().Set("send", "*"))),
+      worker_script);
+
+  ASSERT_THAT(EvalJs(app_frame, kWorkerConnect), IsOk());
+}
+
 IN_PROC_BROWSER_TEST_F(ChromeDirectSocketsUdpApiTest,
                        UdpSocketUndefinedWithoutSocketsPermission) {
   // "sockets" key is not present in the manifest.
diff --git a/chrome/browser/enterprise/browser_management/browser_management_service.cc b/chrome/browser/enterprise/browser_management/browser_management_service.cc
index d7b47317..203225a 100644
--- a/chrome/browser/enterprise/browser_management/browser_management_service.cc
+++ b/chrome/browser/enterprise/browser_management/browser_management_service.cc
@@ -53,7 +53,7 @@
       FROM_HERE,
       base::BindOnce(&BrowserManagementService::UpdateManagementIconForProfile,
                      weak_ptr_factory_.GetWeakPtr(), profile));
-  UpdateEnterpriseLabelForProfile(profile);
+  enterprise_util::SetEnterpriseProfileLabel(profile);
   pref_change_registrar_.Init(profile->GetPrefs());
   pref_change_registrar_.Add(
       prefs::kEnterpriseLogoUrlForProfile,
@@ -62,9 +62,8 @@
           weak_ptr_factory_.GetWeakPtr(), profile));
   pref_change_registrar_.Add(
       prefs::kEnterpriseCustomLabelForProfile,
-      base::BindRepeating(
-          &BrowserManagementService::UpdateEnterpriseLabelForProfile,
-          weak_ptr_factory_.GetWeakPtr(), profile));
+      base::BindRepeating(&enterprise_util::SetEnterpriseProfileLabel,
+                          profile));
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 }
 
@@ -87,25 +86,6 @@
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
-void BrowserManagementService::UpdateEnterpriseLabelForProfile(
-    Profile* profile) {
-  ProfileManager* profile_manager = g_browser_process->profile_manager();
-  // profile_manager might be null in testing environments.
-  if (!profile_manager) {
-    return;
-  }
-
-  ProfileAttributesEntry* entry =
-      profile_manager->GetProfileAttributesStorage()
-          .GetProfileAttributesWithPath(profile->GetPath());
-  if (!entry) {
-    return;
-  }
-
-  entry->SetEnterpriseProfileLabel(
-      enterprise_util::GetEnterpriseLabel(profile));
-}
-
 void BrowserManagementService::SetManagementIconForProfile(
     const gfx::Image& management_icon) {
   management_icon_for_profile_ = ui::ImageModel::FromImage(management_icon);
diff --git a/chrome/browser/enterprise/browser_management/browser_management_service.h b/chrome/browser/enterprise/browser_management/browser_management_service.h
index 2be3615..f56a77e 100644
--- a/chrome/browser/enterprise/browser_management/browser_management_service.h
+++ b/chrome/browser/enterprise/browser_management/browser_management_service.h
@@ -35,8 +35,6 @@
  private:
   // Updates the management icon used to indicate profile level management.
   void UpdateManagementIconForProfile(Profile* profile);
-  // Updates the management label used to indicate profile level management.
-  void UpdateEnterpriseLabelForProfile(Profile* profile);
   void SetManagementIconForProfile(const gfx::Image& management_icon);
 
   PrefChangeRegistrar pref_change_registrar_;
diff --git a/chrome/browser/enterprise/util/managed_browser_utils.cc b/chrome/browser/enterprise/util/managed_browser_utils.cc
index 4613757e..c23d2c2 100644
--- a/chrome/browser/enterprise/util/managed_browser_utils.cc
+++ b/chrome/browser/enterprise/util/managed_browser_utils.cc
@@ -18,7 +18,6 @@
 #include "chrome/browser/enterprise/browser_management/management_service_factory.h"
 #include "chrome/browser/image_fetcher/image_fetcher_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_attributes_entry.h"
 #include "chrome/browser/profiles/profile_attributes_storage.h"
 #include "chrome/browser/profiles/profile_key.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -223,10 +222,10 @@
       profile_manager->GetProfileAttributesStorage()
           .GetProfileAttributesWithPath(profile->GetPath());
   if (entry) {
-    entry->SetUserAcceptedAccountManagement(accepted);
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
-    entry->SetEnterpriseProfileLabel(GetEnterpriseLabel(profile));
+    SetEnterpriseProfileLabel(profile);
 #endif
+    entry->SetUserAcceptedAccountManagement(accepted);
   }
 }
 
@@ -241,6 +240,25 @@
   return entry && entry->UserAcceptedAccountManagement();
 }
 
+void SetEnterpriseProfileLabel(Profile* profile) {
+  ProfileManager* profile_manager = g_browser_process->profile_manager();
+  if (!profile_manager) {
+    // Can be null in tests.
+    return;
+  }
+  ProfileAttributesEntry* entry =
+      profile_manager->GetProfileAttributesStorage()
+          .GetProfileAttributesWithPath(profile->GetPath());
+  if (!entry) {
+    return;
+  }
+  std::string label = IsEnterpriseBadgingEnabledForToolbar(profile)
+                          ? profile->GetPrefs()->GetString(
+                                prefs::kEnterpriseCustomLabelForProfile)
+                          : std::string();
+  entry->SetEnterpriseProfileLabel(base::UTF8ToUTF16(label));
+}
+
 bool ProfileCanBeManaged(Profile* profile) {
   // Some tests do not have a profile manager.
   if (!g_browser_process->profile_manager() || !profile) {
@@ -269,10 +287,7 @@
 }
 
 bool CanShowEnterpriseBadgingForMenu(Profile* profile) {
-  if (profile->IsGuestSession() || profile->IsOffTheRecord()) {
-    return false;
-  }
-  if (!UserAcceptedAccountManagement(profile) && !profile->IsChild()) {
+  if (!CanShowEnterpriseProfileUI(profile) && !profile->IsChild()) {
     return false;
   }
   if (base::FeatureList::IsEnabled(
@@ -293,10 +308,7 @@
 }
 
 bool CanShowEnterpriseBadgingForAvatar(Profile* profile) {
-  if (profile->IsGuestSession() || profile->IsOffTheRecord()) {
-    return false;
-  }
-  if (!UserAcceptedAccountManagement(profile)) {
+  if (!CanShowEnterpriseProfileUI(profile)) {
     return false;
   }
   if (!IsEnterpriseBadgingEnabledForToolbar(profile)) {
@@ -316,6 +328,18 @@
               .empty();
 }
 
+bool CanShowEnterpriseProfileUI(Profile* profile) {
+  if (profile->IsOffTheRecord()) {
+    return false;
+  }
+  if (!UserAcceptedAccountManagement(profile) ||
+      !policy::ManagementServiceFactory::GetForProfile(profile)
+           ->IsAccountManaged()) {
+    return false;
+  }
+  return true;
+}
+
 bool IsKnownConsumerDomain(const std::string& email_domain) {
   return !signin::AccountManagedStatusFinder::MayBeEnterpriseDomain(
       email_domain);
diff --git a/chrome/browser/enterprise/util/managed_browser_utils.h b/chrome/browser/enterprise/util/managed_browser_utils.h
index 61c7bf8..e373f36b 100644
--- a/chrome/browser/enterprise/util/managed_browser_utils.h
+++ b/chrome/browser/enterprise/util/managed_browser_utils.h
@@ -11,6 +11,7 @@
 
 #include "base/functional/bind.h"
 #include "build/build_config.h"
+#include "chrome/browser/profiles/profile_attributes_entry.h"
 #include "net/base/host_port_pair.h"
 #include "net/ssl/client_cert_identity.h"
 #include "ui/gfx/image/image.h"
@@ -87,6 +88,12 @@
 
 bool CanShowEnterpriseBadgingForMenu(Profile* profile);
 
+bool CanShowEnterpriseProfileUI(Profile* profile);
+
+// Sets the enterprise label if an `EnterpriseCustomLabel` has been set which
+// will replace the profile name where it is used.
+void SetEnterpriseProfileLabel(Profile* profile);
+
 // Checks `email_domain` against the list of pre-defined known consumer domains.
 // Use this for optimization purposes when you want to skip some code paths for
 // most non-managed (=consumer) users with domains like gmail.com. Note that it
diff --git a/chrome/browser/enterprise/util/managed_browser_utils_browsertest.cc b/chrome/browser/enterprise/util/managed_browser_utils_browsertest.cc
index 7a2ff54..dd5aa21 100644
--- a/chrome/browser/enterprise/util/managed_browser_utils_browsertest.cc
+++ b/chrome/browser/enterprise/util/managed_browser_utils_browsertest.cc
@@ -107,14 +107,26 @@
 
   void SetUpOnMainThread() override {
     SetUserAcceptedAccountManagement(browser()->profile(), managed_profile());
+    if (managed_profile()) {
+      scoped_browser_management_ =
+          std::make_unique<policy::ScopedManagementServiceOverrideForTesting>(
+              policy::ManagementServiceFactory::GetForProfile(
+                  browser()->profile()),
+              policy::EnterpriseManagementAuthority::CLOUD);
+    }
     InProcessBrowserTest::SetUpOnMainThread();
   }
+
+  void TearDownOnMainThread() override { scoped_browser_management_.reset(); }
+
   bool avatar_feature_enabled() { return std::get<0>(GetParam()); }
   bool profile_menu_feature_enabled() { return std::get<1>(GetParam()); }
   bool policies_feature_enabled() { return std::get<2>(GetParam()); }
   bool managed_profile() { return std::get<3>(GetParam()); }
 
  private:
+  std::unique_ptr<policy::ScopedManagementServiceOverrideForTesting>
+      scoped_browser_management_;
   base::test::ScopedFeatureList scoped_feature_list_;
 };
 
diff --git a/chrome/browser/enterprise/util/managed_browser_utils_unittest.cc b/chrome/browser/enterprise/util/managed_browser_utils_unittest.cc
index bf34a31..b9722fc9 100644
--- a/chrome/browser/enterprise/util/managed_browser_utils_unittest.cc
+++ b/chrome/browser/enterprise/util/managed_browser_utils_unittest.cc
@@ -11,12 +11,14 @@
 #include "base/memory/raw_ptr.h"
 #include "build/build_config.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/enterprise/browser_management/management_service_factory.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "components/policy/core/common/management/scoped_management_service_override_for_testing.h"
 #include "content/public/test/browser_task_environment.h"
 #include "net/base/host_port_pair.h"
 #include "net/cert/x509_certificate.h"
@@ -117,11 +119,30 @@
 
   {
     enterprise_util::SetUserAcceptedAccountManagement(profile(), true);
+    policy::ScopedManagementServiceOverrideForTesting platform_management(
+        policy::ManagementServiceFactory::GetForProfile(profile()),
+        policy::EnterpriseManagementAuthority::CLOUD);
     EXPECT_EQ(enterprise_util::GetEnterpriseLabel(profile()), work_label);
   }
 
   {
     enterprise_util::SetUserAcceptedAccountManagement(profile(), false);
+    policy::ScopedManagementServiceOverrideForTesting platform_management(
+        policy::ManagementServiceFactory::GetForProfile(profile()),
+        policy::EnterpriseManagementAuthority::CLOUD);
+    EXPECT_NE(enterprise_util::GetEnterpriseLabel(profile()), work_label);
+  }
+
+  {
+    enterprise_util::SetUserAcceptedAccountManagement(profile(), true);
+    policy::ScopedManagementServiceOverrideForTesting platform_management(
+        policy::ManagementServiceFactory::GetForProfile(profile()),
+        policy::EnterpriseManagementAuthority::NONE);
+    EXPECT_NE(enterprise_util::GetEnterpriseLabel(profile()), work_label);
+  }
+
+  {
+    enterprise_util::SetUserAcceptedAccountManagement(profile(), false);
     EXPECT_NE(enterprise_util::GetEnterpriseLabel(profile()), work_label);
   }
 }
@@ -133,6 +154,9 @@
   profile()->GetPrefs()->SetInteger(
       prefs::kEnterpriseProfileBadgeToolbarSettings, 1);
   enterprise_util::SetUserAcceptedAccountManagement(profile(), true);
+  policy::ScopedManagementServiceOverrideForTesting platform_management(
+      policy::ManagementServiceFactory::GetForProfile(profile()),
+      policy::EnterpriseManagementAuthority::CLOUD);
 
   // There should be no text because the policy fully disables badging.
   EXPECT_EQ(enterprise_util::GetEnterpriseLabel(profile()), std::u16string());
@@ -146,6 +170,9 @@
   profile()->GetPrefs()->SetInteger(
       prefs::kEnterpriseProfileBadgeToolbarSettings, 1);
   enterprise_util::SetUserAcceptedAccountManagement(profile(), true);
+  policy::ScopedManagementServiceOverrideForTesting platform_management(
+      policy::ManagementServiceFactory::GetForProfile(profile()),
+      policy::EnterpriseManagementAuthority::CLOUD);
 
   // There should be no label because the policy fully disables badging.
   EXPECT_EQ(enterprise_util::GetEnterpriseLabel(profile()), std::u16string());
@@ -157,6 +184,9 @@
   profile()->GetPrefs()->SetString(prefs::kEnterpriseCustomLabelForProfile,
                                    "Custom Label Can Be Max 16 Characters");
   enterprise_util::SetUserAcceptedAccountManagement(profile(), true);
+  policy::ScopedManagementServiceOverrideForTesting platform_management(
+      policy::ManagementServiceFactory::GetForProfile(profile()),
+      policy::EnterpriseManagementAuthority::CLOUD);
 
   EXPECT_EQ(enterprise_util::GetEnterpriseLabel(profile()),
             u"Custom Label Can Be Max 16 Characters");
@@ -169,6 +199,9 @@
   scoped_feature_list_.InitAndDisableFeature(
       features::kEnterpriseProfileBadgingForAvatar);
   enterprise_util::SetUserAcceptedAccountManagement((profile()), true);
+  policy::ScopedManagementServiceOverrideForTesting platform_management(
+      policy::ManagementServiceFactory::GetForProfile(profile()),
+      policy::EnterpriseManagementAuthority::CLOUD);
 
   // The text should be truncated to 16 characters followed by ellipsis.
   EXPECT_EQ(enterprise_util::GetEnterpriseLabel((profile())), std::u16string());
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn
index d6848ee..52c8c4f 100644
--- a/chrome/browser/extensions/BUILD.gn
+++ b/chrome/browser/extensions/BUILD.gn
@@ -371,6 +371,8 @@
     "//components/content_settings/core/browser:cookie_settings",
     "//components/cookie_config",
     "//components/crx_file",
+    "//components/data_sharing/public",
+    "//components/data_sharing/public:features",
     "//components/embedder_support",
     "//components/infobars/content",
     "//components/infobars/core",
@@ -385,6 +387,7 @@
     "//components/safe_browsing/core/browser/db:database_manager",
     "//components/safe_browsing/core/common",
     "//components/safe_browsing/core/common:safe_browsing_prefs",
+    "//components/saved_tab_groups/public",
     "//components/services/patch/content",
     "//components/services/unzip/content",
     "//components/spellcheck/browser",
@@ -891,7 +894,6 @@
       "//components/device_reauth",
       "//components/optimization_guide/core:features",
       "//components/safe_browsing/content/browser",
-      "//components/saved_tab_groups/public",
       "//components/security_interstitials/content:security_interstitial_page",
       "//components/security_state/content",
       "//components/site_engagement/core/mojom:mojo_bindings",
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
index 71770905..ee186cc 100644
--- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
+++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
@@ -1161,8 +1161,23 @@
       async function asyncAssertions() {
         chrome.enterprise.reportingPrivate.onDataMaskingRulesTriggered.addListener(
           rules => {
-            chrome.test.assertEq(rules, []);
-            chrome.test.succeed();
+            if (rules.length === 0) {
+              chrome.test.fail(
+                  'There should not be an event when no rules are triggered');
+            } else {
+              chrome.test.assertEq(rules, [
+                {
+                  level:'mask_type',
+                  regex_pattern:'pattern',
+                  triggeredRuleInfo:{
+                    matchedDetectors:[],
+                    ruleId:'rule_id',
+                    ruleName:'rule_name'
+                  },
+                  url:'https://foo.bar/'
+                }]);
+              chrome.test.succeed();
+            }
           }
         );
       }
@@ -1178,10 +1193,27 @@
 
   ResultCatcher result_catcher;
 
-  EnterpriseReportingPrivateEventRouterFactory::GetInstance()
-      ->GetForProfile(profile())
-      ->OnUrlFilteringVerdict(GURL(kTestUrl),
-                              safe_browsing::RTLookupResponse());
+  auto* router = EnterpriseReportingPrivateEventRouterFactory::GetInstance()
+                     ->GetForProfile(profile());
+
+  // This first call should not produce any result as there are no triggered
+  // rules in the response.
+  router->OnUrlFilteringVerdict(GURL(kTestUrl),
+                                safe_browsing::RTLookupResponse());
+
+  safe_browsing::RTLookupResponse response;
+
+  auto* rule =
+      response.add_threat_info()->mutable_matched_url_navigation_rule();
+  rule->set_rule_id("rule_id");
+  rule->set_rule_name("rule_name");
+
+  auto* data_masking = rule->add_data_masking_actions();
+  data_masking->set_display_name("display_name");
+  data_masking->set_mask_type("mask_type");
+  data_masking->set_pattern("pattern");
+
+  router->OnUrlFilteringVerdict(GURL(kTestUrl), response);
 
   ASSERT_TRUE(result_catcher.GetNextResult()) << result_catcher.message();
 }
@@ -1194,34 +1226,34 @@
           rules => {
             chrome.test.assertEq(rules, [
               {
-                'level':'mask_type_1',
-                'regex_pattern':'pattern_1',
-                'triggeredRuleInfo':{
-                  'matchedDetectors':[],
-                  'ruleId':'rule_id_1',
-                  'ruleName':'rule_name_1'
+                level:'mask_type_1',
+                regex_pattern:'pattern_1',
+                triggeredRuleInfo:{
+                  matchedDetectors:[],
+                  ruleId:'rule_id_1',
+                  ruleName:'rule_name_1'
                 },
-                'url':'https://foo.bar/'
+                url:'https://foo.bar/'
               },
               {
-                'level':'mask_type_2',
-                'regex_pattern':'pattern_2',
-                'triggeredRuleInfo':{
-                  'matchedDetectors':[],
-                  'ruleId':'rule_id_1',
-                  'ruleName':'rule_name_1'
+                level:'mask_type_2',
+                regex_pattern:'pattern_2',
+                triggeredRuleInfo:{
+                  matchedDetectors:[],
+                  ruleId:'rule_id_1',
+                  ruleName:'rule_name_1'
                 },
-                'url':'https://foo.bar/'
+                url:'https://foo.bar/'
               },
               {
-                'level':'mask_type_3',
-                'regex_pattern':'pattern_3',
-                'triggeredRuleInfo':{
-                  'matchedDetectors':[],
-                  'ruleId':'rule_id_2',
-                  'ruleName':'rule_name_2'
+                level:'mask_type_3',
+                regex_pattern:'pattern_3',
+                triggeredRuleInfo:{
+                  matchedDetectors:[],
+                  ruleId:'rule_id_2',
+                  ruleName:'rule_name_2'
                 },
-                'url':'https://foo.bar/'
+                url:'https://foo.bar/'
               }]);
             chrome.test.succeed();
           }
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_event_router.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_event_router.cc
index db321318..0f51ffd 100644
--- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_event_router.cc
+++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_event_router.cc
@@ -59,6 +59,10 @@
     }
   }
 
+  if (rules_list.empty()) {
+    return;
+  }
+
   event_router_->BroadcastEvent(std::make_unique<Event>(
       events::ENTERPRISE_REPORTING_PRIVATE_ON_DATA_MASKING_RULES_TRIGGERED,
       api::enterprise_reporting_private::OnDataMaskingRulesTriggered::
diff --git a/chrome/browser/extensions/api/tab_groups/tab_groups_api.cc b/chrome/browser/extensions/api/tab_groups/tab_groups_api.cc
index 1d76547..0b1cbe1 100644
--- a/chrome/browser/extensions/api/tab_groups/tab_groups_api.cc
+++ b/chrome/browser/extensions/api/tab_groups/tab_groups_api.cc
@@ -78,6 +78,8 @@
 ExtensionFunction::ResponseAction TabGroupsGetFunction::Run() {
   std::optional<api::tab_groups::Get::Params> params =
       api::tab_groups::Get::Params::Create(args());
+  DCHECK(params.has_value());
+
   EXTENSION_FUNCTION_VALIDATE(params);
   int group_id = params->group_id;
 
@@ -168,6 +170,12 @@
         continue;
       }
 
+      if (params->query_info.shared.has_value() &&
+          ExtensionTabUtil::GetSharedStateOfGroup(id) !=
+              params->query_info.shared.value()) {
+        continue;
+      }
+
       result_list.Append(
           ExtensionTabUtil::CreateTabGroupObject(id, *visual_data).ToValue());
     }
diff --git a/chrome/browser/extensions/api/tab_groups/tab_groups_api_unittest.cc b/chrome/browser/extensions/api/tab_groups/tab_groups_api_unittest.cc
index 8ff9a02..54bc3ad 100644
--- a/chrome/browser/extensions/api/tab_groups/tab_groups_api_unittest.cc
+++ b/chrome/browser/extensions/api/tab_groups/tab_groups_api_unittest.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/extensions/extension_service_test_base.h"
 #include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/sessions/session_tab_helper_factory.h"
+#include "chrome/browser/tab_group_sync/tab_group_sync_service_factory.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_utils.h"
@@ -29,7 +30,9 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/test/base/test_browser_window.h"
+#include "components/data_sharing/public/features.h"
 #include "components/keyed_service/core/keyed_service.h"
+#include "components/saved_tab_groups/public/features.h"
 #include "components/saved_tab_groups/public/tab_group_sync_service.h"
 #include "components/sessions/content/session_tab_helper.h"
 #include "components/tab_groups/tab_group_color.h"
@@ -110,11 +113,11 @@
     return web_contentses_[index];
   }
 
- private:
   // ExtensionServiceTestBase:
   void SetUp() override;
   void TearDown() override;
 
+ private:
   // The browser (and accompanying window).
   std::unique_ptr<TestBrowserWindow> browser_window_;
   std::unique_ptr<Browser> browser_;
@@ -280,6 +283,102 @@
             *group_info.GetDict().FindInt("id"));
 }
 
+class SharedTabGroupExtensionsTabUtilTest : public TabGroupsApiUnitTest {
+ public:
+  SharedTabGroupExtensionsTabUtilTest() {
+    feature_list_.InitWithFeatures(
+        {
+            tab_groups::kTabGroupSyncServiceDesktopMigration,
+            data_sharing::features::kDataSharingFeature,
+        },
+        {});
+  }
+
+  SharedTabGroupExtensionsTabUtilTest(
+      const SharedTabGroupExtensionsTabUtilTest&) = delete;
+  SharedTabGroupExtensionsTabUtilTest& operator=(
+      const SharedTabGroupExtensionsTabUtilTest&) = delete;
+
+  void SetUp() override {
+    TabGroupsApiUnitTest ::SetUp();
+    tab_groups::TabGroupSyncService* service =
+        static_cast<tab_groups::TabGroupSyncService*>(
+            tab_groups::TabGroupSyncServiceFactory::GetForProfile(
+                browser()->profile()));
+    service->SetIsInitializedForTesting(true);
+  }
+
+  void ShareTabGroup(const tab_groups::TabGroupId& group_id,
+                     const std::string& collaboration_id) {
+    tab_groups::TabGroupSyncService* service =
+        static_cast<tab_groups::TabGroupSyncService*>(
+            tab_groups::TabGroupSyncServiceFactory::GetForProfile(
+                browser()->profile()));
+    service->MakeTabGroupSharedForTesting(group_id, collaboration_id);
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+// Test that querying groups by color returns the correct groups.
+TEST_F(SharedTabGroupExtensionsTabUtilTest, TabGroupsQueryShared) {
+  TabStripModel* tab_strip_model = browser()->tab_strip_model();
+  ASSERT_TRUE(tab_strip_model->SupportsTabGroups());
+
+  TabGroupModel* tab_group_model = tab_strip_model->group_model();
+
+  // Create a group that is unshared.
+  tab_groups::TabGroupId group1 = tab_strip_model->AddToNewGroup({0});
+  tab_groups::TabGroupVisualData visual_data1(
+      std::u16string(), tab_groups::TabGroupColorId::kGrey);
+  tab_group_model->GetTabGroup(group1)->SetVisualData(visual_data1);
+
+  const char* not_shared_query = R"([{"shared": false}])";
+  const char* shared_query = R"([{"shared": true}])";
+
+  {  // Query unshared groups.
+    scoped_refptr<const Extension> extension = CreateTabGroupsExtension();
+
+    base::Value::List groups_list = RunTabGroupsQueryFunction(
+        browser()->profile(), extension.get(), not_shared_query);
+    ASSERT_EQ(1u, groups_list.size());
+
+    const base::Value& group_info = groups_list[0];
+    ASSERT_EQ(base::Value::Type::DICT, group_info.type());
+    EXPECT_EQ(ExtensionTabUtil::GetGroupId(group1),
+              *group_info.GetDict().FindInt("id"));
+  }
+
+  {  // Query shared groups.
+    scoped_refptr<const Extension> extension = CreateTabGroupsExtension();
+    base::Value::List groups_list =
+        RunTabGroupsQueryFunction(profile(), extension.get(), shared_query);
+    ASSERT_EQ(0u, groups_list.size());
+  }
+
+  ShareTabGroup(group1, "collaboration_id_1");
+
+  {  // Query unshared groups.
+    scoped_refptr<const Extension> extension = CreateTabGroupsExtension();
+    base::Value::List groups_list =
+        RunTabGroupsQueryFunction(profile(), extension.get(), not_shared_query);
+    ASSERT_EQ(0u, groups_list.size());
+  }
+
+  {  // Query shared groups.
+    scoped_refptr<const Extension> extension = CreateTabGroupsExtension();
+    base::Value::List groups_list =
+        RunTabGroupsQueryFunction(profile(), extension.get(), shared_query);
+    ASSERT_EQ(1u, groups_list.size());
+
+    const base::Value& group_info = groups_list[0];
+    ASSERT_EQ(base::Value::Type::DICT, group_info.type());
+    EXPECT_EQ(ExtensionTabUtil::GetGroupId(group1),
+              *group_info.GetDict().FindInt("id"));
+  }
+}
+
 // Test that getting a group returns the correct metadata.
 TEST_F(TabGroupsApiUnitTest, TabGroupsGetSuccess) {
   scoped_refptr<const Extension> extension = CreateTabGroupsExtension();
diff --git a/chrome/browser/extensions/extension_tab_util.cc b/chrome/browser/extensions/extension_tab_util.cc
index 8a2e378a..fc375bf 100644
--- a/chrome/browser/extensions/extension_tab_util.cc
+++ b/chrome/browser/extensions/extension_tab_util.cc
@@ -64,6 +64,9 @@
 #include "chrome/browser/ui/ui_features.h"           // nogncheck
 #include "chrome/common/extensions/api/tabs.h"
 #include "chrome/common/url_constants.h"
+#include "components/data_sharing/public/features.h"
+#include "components/saved_tab_groups/public/features.h"
+#include "components/sessions/content/session_tab_helper.h"
 #include "components/tab_groups/tab_group_id.h"  // nogncheck
 #include "components/url_formatter/url_fixer.h"
 #include "content/public/browser/back_forward_cache.h"
@@ -886,10 +889,37 @@
   tab_group_object.title = base::UTF16ToUTF8(visual_data.title());
   tab_group_object.window_id = GetWindowIdOfGroup(id);
 
+  tab_group_object.shared = GetSharedStateOfGroup(id);
   return tab_group_object;
 }
 
 // static
+bool ExtensionTabUtil::GetSharedStateOfGroup(const tab_groups::TabGroupId& id) {
+  if (!data_sharing::features::IsDataSharingFunctionalityEnabled()) {
+    return false;
+  }
+
+  Browser* browser = chrome::FindBrowserWithGroup(id, nullptr);
+  if (!browser) {
+    return false;
+  }
+
+  tab_groups::TabGroupSyncService* tab_group_service =
+      tab_groups::SavedTabGroupUtils::GetServiceForProfile(browser->profile());
+  if (!tab_group_service) {
+    return false;
+  }
+
+  std::optional<tab_groups::SavedTabGroup> saved_group =
+      tab_group_service->GetGroup(id);
+  if (!saved_group) {
+    return false;
+  }
+
+  return saved_group->is_shared_tab_group();
+}
+
+// static
 std::optional<api::tab_groups::TabGroup> ExtensionTabUtil::CreateTabGroupObject(
     const tab_groups::TabGroupId& id) {
   Browser* browser = chrome::FindBrowserWithGroup(id, nullptr);
diff --git a/chrome/browser/extensions/extension_tab_util.h b/chrome/browser/extensions/extension_tab_util.h
index ec87d13..9a7fdba 100644
--- a/chrome/browser/extensions/extension_tab_util.h
+++ b/chrome/browser/extensions/extension_tab_util.h
@@ -248,6 +248,9 @@
                            const tab_groups::TabGroupVisualData** visual_data,
                            std::string* error);
 
+  // Returns whether the group is shared or not.
+  static bool GetSharedStateOfGroup(const tab_groups::TabGroupId& id);
+
   // Creates a TabGroup object
   // (see chrome/common/extensions/api/tab_groups.json) with information about
   // the state of a tab group for the given group `id`. Most group metadata is
diff --git a/chrome/browser/extensions/extension_tab_util_browsertest.cc b/chrome/browser/extensions/extension_tab_util_browsertest.cc
index 6dfaa8b..94108075 100644
--- a/chrome/browser/extensions/extension_tab_util_browsertest.cc
+++ b/chrome/browser/extensions/extension_tab_util_browsertest.cc
@@ -2,18 +2,26 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "chrome/browser/extensions/extension_tab_util.h"
+
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "chrome/browser/extensions/extension_browsertest.h"
-#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/tab_group_sync/tab_group_sync_service_factory.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/data_sharing/public/features.h"
+#include "components/saved_tab_groups/public/features.h"
+#include "components/saved_tab_groups/public/tab_group_sync_service.h"
+#include "components/tab_groups/tab_group_id.h"
+#include "components/tabs/public/tab_interface.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
 #include "extensions/browser/extension_registry.h"
@@ -357,4 +365,67 @@
   }
 }
 
+class SharedTabGroupExtensionsTabUtilTest : public ExtensionTabUtilBrowserTest {
+ public:
+  SharedTabGroupExtensionsTabUtilTest() {
+    feature_list_.InitWithFeatures(
+        {
+            tab_groups::kTabGroupSyncServiceDesktopMigration,
+            data_sharing::features::kDataSharingFeature,
+        },
+        {});
+  }
+
+  SharedTabGroupExtensionsTabUtilTest(
+      const SharedTabGroupExtensionsTabUtilTest&) = delete;
+  SharedTabGroupExtensionsTabUtilTest& operator=(
+      const SharedTabGroupExtensionsTabUtilTest&) = delete;
+
+  void SetUp() override { ExtensionTabUtilBrowserTest ::SetUp(); }
+
+  // Adds tab navigated to |url| in the given |browser|.
+  tabs::TabInterface* AddTab(const GURL& url) {
+    return browser()->tab_strip_model()->GetTabForWebContents(
+        content::WebContents::FromRenderFrameHost(
+            ui_test_utils::NavigateToURLWithDisposition(
+                browser(), url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+                ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP)));
+  }
+
+  tab_groups::TabGroupId CreateTabGroup() {
+    auto* tab_1 = AddTab(GURL("https://www.site1.com"));
+    auto* tab_2 = AddTab(GURL("https://www.site2.com"));
+
+    auto* tsm = browser()->tab_strip_model();
+
+    return tsm->AddToNewGroup(
+        {tsm->GetIndexOfTab(tab_1), tsm->GetIndexOfTab(tab_2)});
+  }
+
+  void ShareTabGroup(const tab_groups::TabGroupId& group_id,
+                     const std::string& collaboration_id) {
+    tab_groups::TabGroupSyncService* service =
+        static_cast<tab_groups::TabGroupSyncService*>(
+            tab_groups::TabGroupSyncServiceFactory::GetForProfile(
+                browser()->profile()));
+    service->MakeTabGroupSharedForTesting(group_id, collaboration_id);
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_F(SharedTabGroupExtensionsTabUtilTest,
+                       GetSharedGroupState) {
+  auto group_id = CreateTabGroup();
+
+  EXPECT_FALSE(ExtensionTabUtil::GetSharedStateOfGroup(group_id));
+  EXPECT_FALSE(ExtensionTabUtil::CreateTabGroupObject(group_id)->shared);
+
+  ShareTabGroup(group_id, {"share_id"});
+
+  EXPECT_TRUE(ExtensionTabUtil::GetSharedStateOfGroup(group_id));
+  EXPECT_TRUE(ExtensionTabUtil::CreateTabGroupObject(group_id)->shared);
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/system_display/display_info_provider_win.cc b/chrome/browser/extensions/system_display/display_info_provider_win.cc
index 77b7873..36af183 100644
--- a/chrome/browser/extensions/system_display/display_info_provider_win.cc
+++ b/chrome/browser/extensions/system_display/display_info_provider_win.cc
@@ -49,7 +49,7 @@
   }
 
   std::string id = base::NumberToString(
-      display::win::ScreenWin::DisplayIdFromMonitorInfo(monitor_info));
+      display::win::GetScreenWin()->DisplayIdFromMonitorInfo(monitor_info));
   (*device_id_to_name)[id] = base::WideToUTF8(device.DeviceString);
   return TRUE;
 }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index e0a97c9..5e6831b 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -5898,6 +5898,11 @@
     "expiry_milestone": 140
   },
   {
+    "name": "lens-overlay-disable-iph-pan-gesture",
+    "owners": [ "stkhapugin@chromium.org", "christianxu@chromium.org", "lens-chrome@google.com" ],
+    "expiry_milestone": 140
+  },
+  {
     "name": "lens-overlay-disable-price-insights",
     "owners": ["christianxu@google.com", "stkhapugin@chromium.org"],
     "expiry_milestone": 135
@@ -7804,6 +7809,11 @@
     "expiry_milestone": 145
   },
   {
+    "name": "reader-mode-auto-distill",
+    "owners": ["wylieb@google.com", "chrome-reader-mode-team@google.com"],
+    "expiry_milestone": 145
+  },
+  {
     "name": "reader-mode-dev-entry-point",
     "owners": ["wylieb@google.com", "chrome-reader-mode-team@google.com"],
     "expiry_milestone": 145
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 524c95b..b28da794 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -4835,6 +4835,9 @@
     "Allow users to save tabs for later. Enables a new button and menu for "
     "accessing tabs saved for later.";
 
+const char kReaderModeAutoDistillName[] = "Reader Mode auto distillation";
+const char kReaderModeAutoDistillDescription[] =
+    "Automatically distills web contents on every page.";
 const char kReaderModeDevEntryPointName[] = "Reader Mode developer entry point";
 const char kReaderModeDevEntryPointDescription[] =
     "Shows a button in the app overflow menu to force reader mode.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 62685b3..c395843 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -2849,6 +2849,8 @@
 
 extern const char kReadAloudTapToSeekName[];
 extern const char kReadAloudTapToSeekDescription[];
+extern const char kReaderModeAutoDistillName[];
+extern const char kReaderModeAutoDistillDescription[];
 extern const char kReaderModeDevEntryPointName[];
 extern const char kReaderModeDevEntryPointDescription[];
 extern const char kReaderModeHeuristicsName[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 259237a7..21a1376e 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -321,6 +321,7 @@
     &kReadAloudPlayback,
     &kReadAloudTapToSeek,
     &kReadAloudIPHMenuButtonHighlightCCT,
+    &kReaderModeAutoDistill,
     &kReaderModeDevEntryPoint,
     &kRecordSuppressionMetrics,
     &kReengagementNotification,
@@ -1059,6 +1060,10 @@
              "ReadAloudIPHMenuButtonHighlightCCT",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kReaderModeAutoDistill,
+             "ReaderModeAutoDistill",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 BASE_FEATURE(kReaderModeDevEntryPoint,
              "ReaderModeDevEntryPoint",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h
index f9e91fd..32b2f96 100644
--- a/chrome/browser/flags/android/chrome_feature_list.h
+++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -172,6 +172,7 @@
 BASE_DECLARE_FEATURE(kReadAloudTapToSeek);
 BASE_DECLARE_FEATURE(kReadAloudServerExperiments);
 BASE_DECLARE_FEATURE(kReadAloudIPHMenuButtonHighlightCCT);
+BASE_DECLARE_FEATURE(kReaderModeAutoDistill);
 BASE_DECLARE_FEATURE(kReaderModeDevEntryPoint);
 BASE_DECLARE_FEATURE(kReengagementNotification);
 BASE_DECLARE_FEATURE(kRecordSuppressionMetrics);
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index a8f6f12cb..3e95fe66 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -480,6 +480,7 @@
     public static final String READALOUD_TAP_TO_SEEK = "ReadAloudTapToSeek";
     public static final String READALOUD_IPH_MENU_BUTTON_HIGHLIGHT_CCT =
             "ReadAloudIPHMenuButtonHighlightCCT";
+    public static final String READER_MODE_AUTO_DISTILL = "ReaderModeAutoDistill";
     public static final String READER_MODE_DEV_ENTRY_POINT = "ReaderModeDevEntryPoint";
     public static final String RECORD_SUPPRESSION_METRICS = "RecordSuppressionMetrics";
     public static final String REENGAGEMENT_NOTIFICATION = "ReengagementNotification";
diff --git a/chrome/browser/geolocation/geolocation_permission_context_delegate_unittest.cc b/chrome/browser/geolocation/geolocation_permission_context_delegate_unittest.cc
index 8e4533d..5ae3343 100644
--- a/chrome/browser/geolocation/geolocation_permission_context_delegate_unittest.cc
+++ b/chrome/browser/geolocation/geolocation_permission_context_delegate_unittest.cc
@@ -13,6 +13,7 @@
 #include "components/permissions/permission_manager.h"
 #include "components/permissions/permission_request_manager.h"
 #include "components/permissions/test/mock_permission_prompt_factory.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/permission_request_description.h"
 #include "content/public/browser/permission_result.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -77,7 +78,10 @@
     PermissionManagerFactory::GetForProfile(profile())
         ->RequestPermissionsFromCurrentDocument(
             render_frame_host,
-            content::PermissionRequestDescription(permission, user_gesture),
+            content::PermissionRequestDescription(
+                content::PermissionDescriptorUtil::
+                    CreatePermissionDescriptorForPermissionType(permission),
+                user_gesture),
             base::BindOnce(
                 [](base::OnceCallback<void(blink::mojom::PermissionStatus)>
                        callback,
diff --git a/chrome/browser/glic/BUILD.gn b/chrome/browser/glic/BUILD.gn
index c342d68..816f5fb 100644
--- a/chrome/browser/glic/BUILD.gn
+++ b/chrome/browser/glic/BUILD.gn
@@ -349,6 +349,7 @@
     "//chrome/browser:global_features",
     "//chrome/browser/actor:test_support",
     "//chrome/browser/background/glic",
+    "//chrome/browser/permissions:test_support",
     "//chrome/browser/ui",
     "//chrome/common",
     "//chrome/test:test_support",
diff --git a/chrome/browser/glic/fre/glic_fre_dialog_view.cc b/chrome/browser/glic/fre/glic_fre_dialog_view.cc
index c918d2b..10bfe95 100644
--- a/chrome/browser/glic/fre/glic_fre_dialog_view.cc
+++ b/chrome/browser/glic/fre/glic_fre_dialog_view.cc
@@ -6,12 +6,14 @@
 
 #include <memory>
 
+#include "chrome/browser/glic/resources/grit/glic_browser_resources.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/common/webui_url_constants.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "ui/base/interaction/element_identifier.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "ui/views/controls/webview/webview.h"
 #include "ui/views/layout/fill_layout.h"
 #include "ui/views/view_class_properties.h"
@@ -32,6 +34,7 @@
   // TODO(cuianthony): Share this constant in GlicWindowController to use with
   // both the FRE dialog and the main glic window.
   set_corner_radius(12);
+  SetAccessibleTitle(l10n_util::GetStringUTF16(IDS_GLIC_WINDOW_TITLE));
 
   SetUseDefaultFillLayout(true);
 
diff --git a/chrome/browser/glic/host/glic_api_uitest.cc b/chrome/browser/glic/host/glic_api_uitest.cc
index e519ea6..9102cd4 100644
--- a/chrome/browser/glic/host/glic_api_uitest.cc
+++ b/chrome/browser/glic/host/glic_api_uitest.cc
@@ -25,6 +25,7 @@
 #include "chrome/browser/glic/test_support/glic_test_util.h"
 #include "chrome/browser/glic/test_support/interactive_glic_test.h"
 #include "chrome/browser/glic/widget/glic_window_controller.h"
+#include "chrome/browser/permissions/system/mock_platform_handle.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_navigator.h"
 #include "chrome/browser/ui/chrome_pages.h"
@@ -32,6 +33,7 @@
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/test/interaction/interactive_browser_test.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 #include "components/metrics/metrics_service.h"
 #include "components/variations/synthetic_trial_registry.h"
 #include "content/public/browser/render_frame_host.h"
@@ -57,6 +59,7 @@
       "GlicApiTest",
       "GlicApiTestWithOneTab",
       "GlicApiTestWithFastTimeout",
+      "GlicApiTestSystemSettingsTest",
   };
 }
 
@@ -301,7 +304,12 @@
 
 // Checks that all tests in api_test.ts have a corresponding test case in this
 // file.
-IN_PROC_BROWSER_TEST_F(GlicApiTestWithOneTab, testAllTestsAreRegistered) {
+#if defined(SLOW_BINARY)
+#define MAYBE_testAllTestsAreRegistered DISABLED_testAllTestsAreRegistered
+#else
+#define MAYBE_testAllTestsAreRegistered testAllTestsAreRegistered
+#endif
+IN_PROC_BROWSER_TEST_F(GlicApiTestWithOneTab, MAYBE_testAllTestsAreRegistered) {
   ExecuteJsTest();
   ASSERT_TRUE(step_data()->is_list());
   ::testing::UnitTest* unit_test = ::testing::UnitTest::GetInstance();
@@ -371,7 +379,13 @@
   WaitForWebUiState(mojom::WebUiState::kReady);
 }
 
-IN_PROC_BROWSER_TEST_F(GlicApiTest, testReload) {
+// TODO(crbug.com/409042450): This is a flaky on MSAN.
+#if defined(SLOW_BINARY)
+#define MAYBE_testReload DISABLED_testReload
+#else
+#define MAYBE_testReload testReload
+#endif
+IN_PROC_BROWSER_TEST_F(GlicApiTest, MAYBE_testReload) {
   RunTestSequence(
       OpenGlicWindow(GlicWindowMode::kDetached, GlicInstrumentMode::kNone));
   WebUIStateListener listener(&window_controller());
@@ -727,5 +741,107 @@
   RunTestSequence(CheckWidgetMinimumSize(gfx::Size(width, height)));
   ContinueJsTest();
 }
+
+class GlicApiTestSystemSettingsTest : public GlicApiTestWithOneTab {
+ public:
+  GlicApiTestSystemSettingsTest() {
+    system_permission_settings::SetInstanceForTesting(&mock_platform_handle);
+  }
+
+  ~GlicApiTestSystemSettingsTest() override {
+    system_permission_settings::SetInstanceForTesting(nullptr);
+  }
+
+  testing::NiceMock<system_permission_settings::MockPlatformHandle>
+      mock_platform_handle;
+};
+
+// Opening system settings is only available for MacOS. These tests are not
+// fully gated behind the mac buildflag, because
+// GlicApiTestWithOneTab#testAllTestsAreRegistered checks if all the tests in JS
+// are registered in a CC test.
+#if BUILDFLAG(IS_MAC)
+#define MAYBE_testOpenOsMediaPermissionSettings \
+  testOpenOsMediaPermissionSettings
+#else
+#define MAYBE_testOpenOsMediaPermissionSettings \
+  DISABLED_testOpenOsMediaPermissionSettings
+#endif
+IN_PROC_BROWSER_TEST_F(GlicApiTestSystemSettingsTest,
+                       MAYBE_testOpenOsMediaPermissionSettings) {
+  base::test::TestFuture<void> signal;
+  EXPECT_CALL(
+      mock_platform_handle,
+      OpenSystemSettings(testing::_, ContentSettingsType::MEDIASTREAM_MIC))
+      .WillOnce(base::test::InvokeFuture(signal));
+
+  // Trigger the openOsPermissionSettingsMenu API with 'media'.
+  ExecuteJsTest();
+  // Wait for OpenSystemSettings to be called.
+  EXPECT_TRUE(signal.Wait());
+}
+
+#if BUILDFLAG(IS_MAC)
+#define MAYBE_testOpenOsGeoPermissionSettings testOpenOsGeoPermissionSettings
+#else
+#define MAYBE_testOpenOsGeoPermissionSettings \
+  DISABLED_testOpenOsGeoPermissionSettings
+#endif
+IN_PROC_BROWSER_TEST_F(GlicApiTestSystemSettingsTest,
+                       MAYBE_testOpenOsGeoPermissionSettings) {
+  base::test::TestFuture<void> signal;
+  EXPECT_CALL(mock_platform_handle,
+              OpenSystemSettings(testing::_, ContentSettingsType::GEOLOCATION))
+      .WillOnce(base::test::InvokeFuture(signal));
+
+  // Trigger the openOsPermissionSettingsMenu API with 'geolocation'.
+  ExecuteJsTest();
+  // Wait for OpenSystemSettings to be called.
+  EXPECT_TRUE(signal.Wait());
+}
+
+#if BUILDFLAG(IS_MAC)
+#define MAYBE_testIncompatiblePermissionWithOsPermissionSettings \
+  testIncompatiblePermissionWithOsPermissionSettings
+#else
+#define MAYBE_testIncompatiblePermissionWithOsPermissionSettings \
+  DISABLED_testIncompatiblePermissionWithOsPermissionSettings
+#endif
+IN_PROC_BROWSER_TEST_F(
+    GlicApiTestSystemSettingsTest,
+    MAYBE_testIncompatiblePermissionWithOsPermissionSettings) {
+  EXPECT_CALL(mock_platform_handle, OpenSystemSettings(testing::_, testing::_))
+      .Times(0);
+
+  // Trigger the openOsPermissionSettingsMenu API with 'notifications', which is
+  // not supported by Glic.
+  ExecuteJsTest();
+
+  // Wait for eventual calls of OpenSystemSettings, which is async.
+  base::RunLoop().RunUntilIdle();
+}
+
+IN_PROC_BROWSER_TEST_F(GlicApiTestSystemSettingsTest,
+                       testGetOsMicrophonePermissionStatusAllowed) {
+  EXPECT_CALL(mock_platform_handle,
+              IsAllowed(ContentSettingsType::MEDIASTREAM_MIC))
+      .WillOnce(testing::Return(true));
+
+  // Trigger the GetOsMicrophonePermissionStatus API and check if it returns
+  // true as mocked by this test.
+  ExecuteJsTest();
+}
+
+IN_PROC_BROWSER_TEST_F(GlicApiTestSystemSettingsTest,
+                       testGetOsMicrophonePermissionStatusNotAllowed) {
+  EXPECT_CALL(mock_platform_handle,
+              IsAllowed(ContentSettingsType::MEDIASTREAM_MIC))
+      .WillOnce(testing::Return(false));
+
+  // Trigger the GetOsMicrophonePermissionStatus API and check if it returns
+  // false as mocked by this test.
+  ExecuteJsTest();
+}
+
 }  // namespace
 }  // namespace glic
diff --git a/chrome/browser/glic/host/webui_contents_container.cc b/chrome/browser/glic/host/webui_contents_container.cc
index 7fe52d8..9acc17e 100644
--- a/chrome/browser/glic/host/webui_contents_container.cc
+++ b/chrome/browser/glic/host/webui_contents_container.cc
@@ -20,32 +20,6 @@
 
 namespace glic {
 
-class WebUIContentsContainer::WCObserver : public content::WebContentsObserver {
- public:
-  WCObserver(content::WebContents* web_contents,
-             WebUIContentsContainer* container)
-      : container_(container) {
-    Observe(web_contents);
-  }
-
- private:
-  // content::WebContentsObserver:
-  void InnerWebContentsAttached(
-      content::WebContents* inner_web_contents,
-      content::RenderFrameHost* render_frame_host) override {
-    container_->InnerWebContentsAttached(inner_web_contents, this);
-  }
-
-  void PrimaryMainFrameRenderProcessGone(
-      base::TerminationStatus status) override {
-    container_->RendererCrashed(this);
-    // WARNING: Do not do any more work, as `this` may have been destroyed.
-  }
-
-  // The container that owns this.
-  const raw_ptr<WebUIContentsContainer> container_;
-};
-
 WebUIContentsContainer::WebUIContentsContainer(
     Profile* profile,
     GlicWindowController* glic_window_controller)
@@ -54,13 +28,13 @@
           content::WebContents::CreateParams(profile))),
       glic_window_controller_(glic_window_controller) {
   CHECK(web_contents_);
+  Observe(web_contents_.get());
   web_contents_->SetDelegate(this);
   web_contents_->SetPageBaseBackgroundColor(SK_ColorTRANSPARENT);
 
   web_contents_->GetController().LoadURLWithParams(
       content::NavigationController::LoadURLParams(
           GURL{chrome::kChromeUIGlicURL}));
-  outer_wc_observer_ = std::make_unique<WCObserver>(web_contents_.get(), this);
 }
 
 WebUIContentsContainer::~WebUIContentsContainer() {
@@ -86,32 +60,13 @@
       web_contents, request, std::move(callback), nullptr);
 }
 
-void WebUIContentsContainer::InnerWebContentsAttached(
-    content::WebContents* contents,
-    WCObserver* observer) {
-  if (outer_wc_observer_.get() == observer) {
-    inner_wc_observer_ = std::make_unique<WCObserver>(contents, this);
-  }
-}
-
-void WebUIContentsContainer::RendererCrashed(WCObserver* observer) {
-  RecordRendererCrashedMetrics(observer);
-  if (outer_wc_observer_.get() == observer) {
-    auto* keyed_service = GlicKeyedServiceFactory::GetGlicKeyedService(
-        web_contents_->GetBrowserContext());
-    keyed_service->CloseUI();
-  }
+void WebUIContentsContainer::PrimaryMainFrameRenderProcessGone(
+    base::TerminationStatus status) {
+  base::RecordAction(base::UserMetricsAction("GlicSessionWebUiCrash"));
+  auto* keyed_service = GlicKeyedServiceFactory::GetGlicKeyedService(
+      web_contents_->GetBrowserContext());
+  keyed_service->CloseUI();
   // WARNING: Do not do any more work, as `this` may have been destroyed.
 }
 
-void WebUIContentsContainer::RecordRendererCrashedMetrics(
-    WCObserver* observer) {
-  if (inner_wc_observer_.get() == observer) {
-    base::RecordAction(base::UserMetricsAction("GlicSessionWebClientCrash"));
-  }
-  if (outer_wc_observer_.get() == observer) {
-    base::RecordAction(base::UserMetricsAction("GlicSessionWebUiCrash"));
-  }
-}
-
 }  // namespace glic
diff --git a/chrome/browser/glic/host/webui_contents_container.h b/chrome/browser/glic/host/webui_contents_container.h
index daabd42..c22681c0 100644
--- a/chrome/browser/glic/host/webui_contents_container.h
+++ b/chrome/browser/glic/host/webui_contents_container.h
@@ -9,13 +9,15 @@
 
 #include "chrome/browser/profiles/keep_alive/scoped_profile_keep_alive.h"
 #include "content/public/browser/web_contents_delegate.h"
+#include "content/public/browser/web_contents_observer.h"
 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
 
 namespace glic {
 class GlicWindowController;
 
 // Owns the `WebContents` that houses the chrome://glic WebUI.
-class WebUIContentsContainer : public content::WebContentsDelegate {
+class WebUIContentsContainer : public content::WebContentsDelegate,
+                               public content::WebContentsObserver {
  public:
   WebUIContentsContainer(Profile* profile,
                          GlicWindowController* glic_window_controller);
@@ -24,13 +26,7 @@
   WebUIContentsContainer(const WebUIContentsContainer&) = delete;
   WebUIContentsContainer& operator=(const WebUIContentsContainer&) = delete;
 
-  content::WebContents* web_contents() { return web_contents_.get(); }
-
  private:
-  // Observes the outer and inner web contents.
-  class WCObserver;
-  friend class WCObserver;
-
   // content::WebContentsDelegate:
   bool HandleKeyboardEvent(content::WebContents* source,
                            const input::NativeWebKeyboardEvent& event) override;
@@ -39,15 +35,12 @@
       const content::MediaStreamRequest& request,
       content::MediaResponseCallback callback) override;
 
-  void InnerWebContentsAttached(content::WebContents* contents,
-                                WCObserver* observer);
-  void RendererCrashed(WCObserver* observer);
-  void RecordRendererCrashedMetrics(WCObserver* observer);
+  // content::WebContentsObserver:
+  void PrimaryMainFrameRenderProcessGone(
+      base::TerminationStatus status) override;
 
   ScopedProfileKeepAlive profile_keep_alive_;
   const std::unique_ptr<content::WebContents> web_contents_;
-  std::unique_ptr<WCObserver> outer_wc_observer_;
-  std::unique_ptr<WCObserver> inner_wc_observer_;
   views::UnhandledKeyboardEventHandler unhandled_keyboard_event_handler_;
   // GlicWindowController owns this.
   const raw_ptr<GlicWindowController> glic_window_controller_;
diff --git a/chrome/browser/glic/resources/browser_resources.grd b/chrome/browser/glic/resources/browser_resources.grd
index c49de0c..24f2adc 100644
--- a/chrome/browser/glic/resources/browser_resources.grd
+++ b/chrome/browser/glic/resources/browser_resources.grd
@@ -259,6 +259,9 @@
       <message name="IDS_GLIC_UNPIN" translateable="false" desc="Name of the context menu item for toggling Glic pinning, when glic is pinned.">
         Unpin Glic
       </message>
+      <message name="IDS_GLIC_CONTEXTUAL_CUEING_ANNOUNCEMENT" desc="Polite announcement that happens when a contextual nudge is shown next to the Glic button." translateable="false">
+        To open Glic in Chrome, press <ph name="GLOBAL_HOTKEY">⌘+G</ph>
+      </message>
 
       <!-- Screenpicker Menu String -->
       <message name="IDS_GLIC_SCREEN_PICKER_REQUESTER" desc="Text shown on screen picker dialog that indicates the requesting source is Glic." translateable="false">
@@ -278,6 +281,12 @@
       <message name="IDS_GLIC_WINDOW_TITLE" desc="Accessible title for the Glic Window." translateable="false">
         Glic
       </message>
+      <message name="IDS_GLIC_WINDOW_TITLE_FIRST_LOAD" desc="Accessible title for the Glic Window. Only included on first load." translateable="false">
+        Glic. To return to where you were on the page press <ph name="FOCUS_TOGGLE_HOTKEY">Ctrl+⌘+G</ph>
+      </message>
+      <message name="IDS_GLIC_WINDOW_FIRST_FOCUS_LOST_ANNOUNCEMENT" desc="Announcement triggered the first time the Glic window loses focus." translateable="false">
+        To return to Glic, press <ph name="FOCUS_TOGGLE_HOTKEY">Ctrl+⌘+G</ph>
+      </message>
 
       <!-- Task Manager -->
       <message name="IDS_TASK_MANAGER_GLIC_RENDERER_PREFIX" desc="Task Manager row for a render process used to host the Glic UI" translateable="false">
diff --git a/chrome/browser/glic/resources/internal b/chrome/browser/glic/resources/internal
index 8b40ed7..92c43ad 160000
--- a/chrome/browser/glic/resources/internal
+++ b/chrome/browser/glic/resources/internal
@@ -1 +1 @@
-Subproject commit 8b40ed74efe47630c4d0b8d568a4f3e0e2292af8
+Subproject commit 92c43ad104487e9b5e8814dee4be94e18656fa27
diff --git a/chrome/browser/glic/widget/glic_window_controller.cc b/chrome/browser/glic/widget/glic_window_controller.cc
index 36d9bd9e..8401e37 100644
--- a/chrome/browser/glic/widget/glic_window_controller.cc
+++ b/chrome/browser/glic/widget/glic_window_controller.cc
@@ -1105,7 +1105,7 @@
 void GlicWindowController::ShowTitleBarContextMenuAt(gfx::Point event_loc) {
 #if BUILDFLAG(IS_WIN)
   views::View::ConvertPointToScreen(GetGlicView(), &event_loc);
-  event_loc = display::win::ScreenWin::DIPToScreenPoint(event_loc);
+  event_loc = display::win::GetScreenWin()->DIPToScreenPoint(event_loc);
   views::ShowSystemMenuAtScreenPixelLocation(views::HWNDForView(GetGlicView()),
                                              event_loc);
 #endif  // BUILDFLAG(IS_WIN)
diff --git a/chrome/browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.cc b/chrome/browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.cc
index 81069a5..617b84c1 100644
--- a/chrome/browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.cc
+++ b/chrome/browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.cc
@@ -20,6 +20,7 @@
 #include "components/permissions/permission_util.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_view_host.h"
@@ -356,7 +357,10 @@
       ->RequestPermissionFromCurrentDocument(
           web_view_guest()->embedder_rfh(),
           content::PermissionRequestDescription(
-              blink::PermissionType::GEOLOCATION, user_gesture),
+              content::PermissionDescriptorUtil::
+                  CreatePermissionDescriptorForPermissionType(
+                      blink::PermissionType::GEOLOCATION),
+              user_gesture),
           std::move(callback));
 }
 
diff --git a/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterCoordinator.java b/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterCoordinator.java
index 70a22fe..67ff86b 100644
--- a/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterCoordinator.java
+++ b/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterCoordinator.java
@@ -11,10 +11,11 @@
 import android.view.View;
 import android.view.ViewGroup;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.recyclerview.widget.RecyclerView;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
@@ -25,6 +26,7 @@
 import java.util.List;
 
 /** Coordinator class of the app filter bottom sheet UI for history page. */
+@NullMarked
 class AppFilterCoordinator implements View.OnLayoutChangeListener {
     // Maximum number of app filter items shown on the sheet at once if screen dimension allows.
     static final int MAX_VISIBLE_ITEM_COUNT = 5;
@@ -50,10 +52,10 @@
     /** Data class for individual app item in the filter list. */
     public static class AppInfo {
         public final String id;
-        public final Drawable icon;
+        public final @Nullable Drawable icon;
         public final CharSequence label;
 
-        public AppInfo(String id, Drawable icon, CharSequence label) {
+        public AppInfo(String id, @Nullable Drawable icon, CharSequence label) {
             this.id = id;
             this.icon = icon;
             this.label = label;
@@ -77,7 +79,7 @@
          * @param appInfo {@link AppInfo} containing the app information. May be {@code null} if no
          *     app is selected.
          */
-        void onAppUpdated(AppInfo appInfo);
+        void onAppUpdated(@Nullable AppInfo appInfo);
     }
 
     /**
@@ -184,7 +186,7 @@
         return Math.min(visibleRowCount * rowHeight, maxHeight);
     }
 
-    private void closeSheet(AppInfo appInfo) {
+    private void closeSheet(@Nullable AppInfo appInfo) {
         mBottomSheetController.hideContent(mSheetContent, true);
         mCloseCallback.onAppUpdated(appInfo);
     }
@@ -205,7 +207,7 @@
         mMediator.setCurrentAppForTesting(appId); // IN-TEST
     }
 
-    String getCurrentAppIdForTesting() {
+    @Nullable String getCurrentAppIdForTesting() {
         return mMediator.getCurrentAppIdForTesting(); // IN-TEST
     }
 }
diff --git a/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterMediator.java b/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterMediator.java
index c2cb34d..dacde9c 100644
--- a/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterMediator.java
+++ b/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterMediator.java
@@ -4,11 +4,15 @@
 
 package org.chromium.chrome.browser.history;
 
+import static org.chromium.build.NullUtil.assertNonNull;
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.Context;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.history.AppFilterCoordinator.AppInfo;
 import org.chromium.chrome.browser.history.AppFilterCoordinator.CloseCallback;
 import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
@@ -18,6 +22,7 @@
 import java.util.List;
 
 /** Mediator class for history app filter sheet. */
+@NullMarked
 class AppFilterMediator {
     private final ModelList mModelList;
     private final CloseCallback mCloseCallback;
@@ -37,7 +42,7 @@
         }
     }
 
-    private @Nullable PropertyModel generateListItem(AppInfo info) {
+    private PropertyModel generateListItem(AppInfo info) {
         PropertyModel model =
                 new PropertyModel.Builder(AppFilterProperties.LIST_ITEM_KEYS)
                         .with(AppFilterProperties.ID, info.id)
@@ -49,13 +54,14 @@
         return model;
     }
 
-    void resetState(AppInfo currentApp) {
+    void resetState(@Nullable AppInfo currentApp) {
         if (mSelectedModel != null) {
             mSelectedModel.set(AppFilterProperties.SELECTED, false);
             mSelectedModel = null;
         }
         if (currentApp != null) {
             mSelectedModel = getModelForAppId(currentApp.id);
+            assumeNonNull(mSelectedModel);
             mSelectedModel.set(AppFilterProperties.SELECTED, true);
         }
     }
@@ -68,17 +74,18 @@
         boolean toFullHistory = prevModel != null && prevModel == model;
 
         if (prevModel != null) prevModel.set(AppFilterProperties.SELECTED, false);
-        mSelectedModel = toFullHistory ? null : model;
         if (toFullHistory) {
+            mSelectedModel = null;
             mCloseCallback.onAppUpdated(null);
         } else {
+            mSelectedModel = model;
             mSelectedModel.set(AppFilterProperties.SELECTED, true);
             AppInfo appInfo = new AppInfo(appId, null, model.get(AppFilterProperties.LABEL));
             mCloseCallback.onAppUpdated(appInfo);
         }
     }
 
-    private PropertyModel getModelForAppId(String appId) {
+    private @Nullable PropertyModel getModelForAppId(String appId) {
         for (SimpleRecyclerViewAdapter.ListItem item : mModelList) {
             if (appId.equals(item.model.get(AppFilterProperties.ID))) {
                 return item.model;
@@ -88,14 +95,14 @@
     }
 
     void clickItemForTesting(String appId) {
-        handleClick(getModelForAppId(appId));
+        handleClick(assertNonNull(getModelForAppId(appId)));
     }
 
     void setCurrentAppForTesting(String appId) {
         mSelectedModel = getModelForAppId(appId);
     }
 
-    String getCurrentAppIdForTesting() {
+    @Nullable String getCurrentAppIdForTesting() {
         return mSelectedModel != null ? mSelectedModel.get(AppFilterProperties.ID) : null;
     }
 }
diff --git a/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterProperties.java b/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterProperties.java
index 01d949f..ec40d6c 100644
--- a/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterProperties.java
+++ b/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterProperties.java
@@ -7,12 +7,14 @@
 import android.graphics.drawable.Drawable;
 import android.view.View;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel.ReadableObjectPropertyKey;
 import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey;
 import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey;
 
 /** Property model properties for app filter sheet UI. */
+@NullMarked
 class AppFilterProperties {
     public static final ReadableObjectPropertyKey<String> ID = new ReadableObjectPropertyKey();
     public static final ReadableObjectPropertyKey<Drawable> ICON = new ReadableObjectPropertyKey();
diff --git a/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterSheetContent.java b/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterSheetContent.java
index 23686f8..60feee1 100644
--- a/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterSheetContent.java
+++ b/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterSheetContent.java
@@ -9,13 +9,14 @@
 import android.view.LayoutInflater;
 import android.view.View;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.StringRes;
 import androidx.recyclerview.widget.RecyclerView;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
 
 /** BottomSheetContent implementation for app filter bottom sheet. */
+@NullMarked
 class AppFilterSheetContent implements BottomSheetContent {
     private final View mContentView;
     private final View mToolbarView;
@@ -78,7 +79,7 @@
     }
 
     @Override
-    public @NonNull String getSheetContentDescription(Context context) {
+    public String getSheetContentDescription(Context context) {
         return context.getString(R.string.history_app_filter_sheet_description);
     }
 
diff --git a/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterViewBinder.java b/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterViewBinder.java
index f4365b3b3..8e4b26a6 100644
--- a/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterViewBinder.java
+++ b/chrome/browser/history/java/src/org/chromium/chrome/browser/history/AppFilterViewBinder.java
@@ -8,10 +8,12 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
 
 /** Binder object for the appfilter sheet content model and the view. */
+@NullMarked
 class AppFilterViewBinder {
     static void bind(PropertyModel model, View view, PropertyKey key) {
         if (AppFilterProperties.ICON == key) {
diff --git a/chrome/browser/history/java/src/org/chromium/chrome/browser/history/HistoryTabHelper.java b/chrome/browser/history/java/src/org/chromium/chrome/browser/history/HistoryTabHelper.java
index b4d07b0..2de1458 100644
--- a/chrome/browser/history/java/src/org/chromium/chrome/browser/history/HistoryTabHelper.java
+++ b/chrome/browser/history/java/src/org/chromium/chrome/browser/history/HistoryTabHelper.java
@@ -4,12 +4,11 @@
 
 package org.chromium.chrome.browser.history;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
 import org.jni_zero.JniType;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabWebContentsUserData;
 import org.chromium.content_public.browser.WebContents;
@@ -18,10 +17,11 @@
  * History helper class. Configures native WebContents objects at initialization or when switched to
  * a new one.
  */
+@NullMarked
 public class HistoryTabHelper extends TabWebContentsUserData {
 
     private static final Class<HistoryTabHelper> USER_DATA_KEY = HistoryTabHelper.class;
-    private String mAppId;
+    private @Nullable String mAppId;
 
     public static HistoryTabHelper from(Tab tab) {
         HistoryTabHelper handler = get(tab);
@@ -42,7 +42,7 @@
     /**
      * @param appId App ID
      */
-    public void setAppId(String appId, @NonNull WebContents webContents) {
+    public void setAppId(String appId, WebContents webContents) {
         mAppId = appId;
         setAppId(webContents);
     }
@@ -58,10 +58,11 @@
     }
 
     @Override
-    public void cleanupWebContents(WebContents webContents) {}
+    public void cleanupWebContents(@Nullable WebContents webContents) {}
 
     @NativeMethods
     interface Natives {
-        void setAppIdNative(@JniType("std::string") String appId, WebContents webContents);
+        void setAppIdNative(
+                @JniType("std::string") @Nullable String appId, WebContents webContents);
     }
 }
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DefaultPaneOrderController.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DefaultPaneOrderController.java
index bf76c95..fc2a5a9 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DefaultPaneOrderController.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DefaultPaneOrderController.java
@@ -6,7 +6,10 @@
 
 import com.google.common.collect.ImmutableSet;
 
+import org.chromium.build.annotations.NullMarked;
+
 /** The default {@link PaneOrderController}. */
+@NullMarked
 public class DefaultPaneOrderController implements PaneOrderController {
     @Override
     public ImmutableSet<Integer> getPaneOrder() {
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DelegateButtonData.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DelegateButtonData.java
index bf6f530..1ed24fa 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DelegateButtonData.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DelegateButtonData.java
@@ -7,15 +7,16 @@
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 /**
  * Holds a {@link Runnable} for handling on press, and delegates everything else to a {@link
  * DisplayButtonData}.
  */
+@NullMarked
 public class DelegateButtonData implements FullButtonData {
-    private final @NonNull DisplayButtonData mDelegateButtonData;
+    private final DisplayButtonData mDelegateButtonData;
     private final @Nullable Runnable mOnPress;
 
     /**
@@ -25,8 +26,7 @@
      * @param onPress The runnable to invoke when the button is pressed. A null value will disable
      *     the button.
      */
-    public DelegateButtonData(
-            @NonNull DisplayButtonData delegateButtonData, @Nullable Runnable onPress) {
+    public DelegateButtonData(DisplayButtonData delegateButtonData, @Nullable Runnable onPress) {
         mDelegateButtonData = delegateButtonData;
         mOnPress = onPress;
     }
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DisplayButtonData.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DisplayButtonData.java
index 9b60b6e..f314621 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DisplayButtonData.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DisplayButtonData.java
@@ -7,12 +7,15 @@
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 
+import org.chromium.build.annotations.NullMarked;
+
 /**
  * Combination of text, content description, and icon. Any combination of text and icon both may
  * ultimately be used for the actual button. Allows implementors to delay resolving the underlying
  * Android resources until bind time. This interface should be used directly when implementor is not
  * responsible for handling effect of the button.
  */
+@NullMarked
 public interface DisplayButtonData {
     /** Returns the text that should be shown for this button. */
     String resolveText(Context context);
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DrawableButtonData.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DrawableButtonData.java
index bf5362d..b28c50d 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DrawableButtonData.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/DrawableButtonData.java
@@ -7,12 +7,15 @@
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+
 import java.util.Objects;
 
 /** Resolves a non-resource drawable's button data. */
+@NullMarked
 public class DrawableButtonData implements DisplayButtonData {
     // The content description should be of type @StringRes, with the exception of use from the
     // TabSwitcherDrawable which will use a @PluralsRes type.
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/FullButtonData.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/FullButtonData.java
index 36f664e..fd64c017 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/FullButtonData.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/FullButtonData.java
@@ -4,9 +4,11 @@
 
 package org.chromium.chrome.browser.hub;
 
-import androidx.annotation.Nullable;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 /** Combination of display information and the event handling for pressing the button. */
+@NullMarked
 public interface FullButtonData extends DisplayButtonData {
     /**
      * Returns the {@link Runnable} that should be invoked when the button is pressed. If this
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubAnimationConstants.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubAnimationConstants.java
index 07e917c..388c9a2 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubAnimationConstants.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubAnimationConstants.java
@@ -6,10 +6,12 @@
 
 import android.view.animation.Interpolator;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.ui.interpolators.Interpolators;
 
 /** Animation constants for the Hub. */
+@NullMarked
 public class HubAnimationConstants {
     // Copied from TabSwitcherLayout.
     /** Duration in milliseconds of translate animations for the Hub Layout.. */
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubColorMixer.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubColorMixer.java
index 073cf4b..9e859de 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubColorMixer.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubColorMixer.java
@@ -12,6 +12,7 @@
 import androidx.annotation.IntDef;
 
 import org.chromium.base.supplier.ObservableSupplierImpl;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 import org.chromium.ui.modelutil.PropertyModel;
 
@@ -31,6 +32,7 @@
  * should be passed via the {@link #COLOR_MIXER} property on these models whenever these {@link
  * HubViewColorBlend}s need to be registered.
  */
+@NullMarked
 public interface HubColorMixer {
 
     /**
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubContainerView.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubContainerView.java
index 1fe3fe3..486bbc7 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubContainerView.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubContainerView.java
@@ -9,10 +9,12 @@
 import android.view.MotionEvent;
 import android.widget.FrameLayout;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.ui.animation.RunOnNextLayout;
 import org.chromium.ui.animation.RunOnNextLayoutDelegate;
 
 /** Container view for the Hub. */
+@NullMarked
 public class HubContainerView extends FrameLayout implements RunOnNextLayout {
     private static final String TAG = "HubContainerView";
     private final RunOnNextLayoutDelegate mRunOnNextLayoutDelegate;
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubController.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubController.java
index 8d05d58..c866709 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubController.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubController.java
@@ -7,16 +7,17 @@
 import android.view.View;
 
 import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
+
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 /** The interface for communication between the {@link HubLayout} and Hub internals. */
+@NullMarked
 public interface HubController {
     /** Called once by {@link HubLayout} when it is initialized. */
-    void setHubLayoutController(@NonNull HubLayoutController hubLayoutController);
+    void setHubLayoutController(HubLayoutController hubLayoutController);
 
     /** Returns the view that contains all the Hub UI. */
-    @NonNull
     HubContainerView getContainerView();
 
     /** Returns the view that contains the Hub panes. */
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutAnimationListener.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutAnimationListener.java
index 21ad5e5..f453584 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutAnimationListener.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutAnimationListener.java
@@ -4,10 +4,13 @@
 
 package org.chromium.chrome.browser.hub;
 
+import org.chromium.build.annotations.NullMarked;
+
 /**
  * Interface for observing {@link HubLayoutAnimationRunner} animation phases. Animation phases are
  * all always invoked even if the animation is forced to finish.
  */
+@NullMarked
 public interface HubLayoutAnimationListener {
     /** Called just before a {@link HubLayoutAnimationRunner} starts an animation. */
     default void beforeStart() {}
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutAnimationRunner.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutAnimationRunner.java
index 282093eb..3979cb3 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutAnimationRunner.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutAnimationRunner.java
@@ -5,7 +5,8 @@
 package org.chromium.chrome.browser.hub;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
+
+import org.chromium.build.annotations.NullMarked;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -36,6 +37,7 @@
  * This is the listening and execution portion of the {@link AnimatorSet} API, with additional
  * functionality required for {@link HubLayout} interaction.
  */
+@NullMarked
 public interface HubLayoutAnimationRunner {
     @IntDef({
         AnimationState.INITIALIZING,
@@ -86,5 +88,5 @@
      *
      * @param animationListener The {@link HubLayoutAnimationListener} to add.
      */
-    void addListener(@NonNull HubLayoutAnimationListener animationListener);
+    void addListener(HubLayoutAnimationListener animationListener);
 }
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutAnimator.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutAnimator.java
index b1f8d0b..375b39cb 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutAnimator.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutAnimator.java
@@ -6,16 +6,17 @@
 
 import android.animation.AnimatorSet;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 /**
  * A class for holding an animator that animates {@link HubLayout} transitions. This class is
  * supplied by an implementation of {@link HubLayoutAnimatorSupplier}.
  */
+@NullMarked
 public class HubLayoutAnimator {
     private final @HubLayoutAnimationType int mAnimationType;
-    private final @NonNull AnimatorSet mAnimatorSet;
+    private final AnimatorSet mAnimatorSet;
     private final @Nullable HubLayoutAnimationListener mListener;
 
     /**
@@ -27,7 +28,7 @@
      */
     HubLayoutAnimator(
             @HubLayoutAnimationType int animationType,
-            @NonNull AnimatorSet animatorSet,
+            AnimatorSet animatorSet,
             @Nullable HubLayoutAnimationListener listener) {
         mAnimationType = animationType;
         mAnimatorSet = animatorSet;
@@ -38,7 +39,7 @@
         return mAnimationType;
     }
 
-    public @NonNull AnimatorSet getAnimatorSet() {
+    public AnimatorSet getAnimatorSet() {
         return mAnimatorSet;
     }
 
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutAnimatorProvider.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutAnimatorProvider.java
index e7c585d..e0f064db 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutAnimatorProvider.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutAnimatorProvider.java
@@ -8,11 +8,10 @@
 import android.graphics.Bitmap;
 import android.view.View;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
 import org.chromium.base.Callback;
 import org.chromium.base.supplier.SyncOneshotSupplier;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 /**
  * Interface for providing an {@link HubLayoutAnimator} that may have async dependencies.
@@ -22,6 +21,7 @@
  * registering {@link HubLayoutAnimationListeners}, and running of the actual animation. This serves
  * to cleanly divide the API of the {@link AnimatorSet} between setup and observation + execution.
  */
+@NullMarked
 public interface HubLayoutAnimatorProvider {
 
     /**
@@ -37,7 +37,6 @@
      * <p>The animator will be started once the {@link HubContainerView} is laid out to the match
      * its containers width and height and will be in {@link View#INVISIBLE} state.
      */
-    @NonNull
     SyncOneshotSupplier<HubLayoutAnimator> getAnimatorSupplier();
 
     /**
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutController.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutController.java
index 6270c72..e7e7915b 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutController.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutController.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.hub;
 
 import org.chromium.base.supplier.ObservableSupplier;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.layouts.LayoutType;
 import org.chromium.chrome.browser.tab.Tab;
 
@@ -13,6 +14,7 @@
  * set via {@link HubController#setHubLayoutController} once during {@link HubLayout}
  * initialization.
  */
+@NullMarked
 public interface HubLayoutController {
     /**
      * Sets a tab as active and hides the Hub. A tab must be selected if the browser is
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutDependencyHolder.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutDependencyHolder.java
index 0cdca26..795f8da 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutDependencyHolder.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutDependencyHolder.java
@@ -4,15 +4,17 @@
 
 package org.chromium.chrome.browser.hub;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.view.View;
 import android.view.ViewGroup;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.supplier.LazyOneshotSupplier;
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.Supplier;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.browser_ui.widget.scrim.ScrimManager;
 
 import java.util.function.DoubleConsumer;
@@ -23,11 +25,12 @@
  * being constructed. Any dependencies already readily available from the {@link
  * LayoutManagerChrome} level are not included.
  */
+@NullMarked
 public class HubLayoutDependencyHolder {
-    private final @NonNull LazyOneshotSupplier<HubManager> mHubManagerSupplier;
-    private final @NonNull LazyOneshotSupplier<ViewGroup> mHubRootViewGroupSupplier;
-    private final @NonNull HubLayoutScrimController mScrimController;
-    private final @NonNull DoubleConsumer mOnToolbarAlphaChange;
+    private final LazyOneshotSupplier<HubManager> mHubManagerSupplier;
+    private final LazyOneshotSupplier<ViewGroup> mHubRootViewGroupSupplier;
+    private final HubLayoutScrimController mScrimController;
+    private final DoubleConsumer mOnToolbarAlphaChange;
 
     /**
      * @param hubManagerSupplier The supplier of {@link HubManager}.
@@ -41,12 +44,12 @@
      * @param onToolbarAlphaChange Observer to notify when alpha changes during animations.
      */
     public HubLayoutDependencyHolder(
-            @NonNull LazyOneshotSupplier<HubManager> hubManagerSupplier,
-            @NonNull LazyOneshotSupplier<ViewGroup> hubRootViewGroupSupplier,
-            @NonNull ScrimManager scrimManager,
-            @NonNull Supplier<View> scrimAnchorViewSupplier,
-            @NonNull ObservableSupplier<Boolean> isIncognitoSupplier,
-            @NonNull DoubleConsumer onToolbarAlphaChange) {
+            LazyOneshotSupplier<HubManager> hubManagerSupplier,
+            LazyOneshotSupplier<ViewGroup> hubRootViewGroupSupplier,
+            ScrimManager scrimManager,
+            Supplier<View> scrimAnchorViewSupplier,
+            ObservableSupplier<Boolean> isIncognitoSupplier,
+            DoubleConsumer onToolbarAlphaChange) {
         this(
                 hubManagerSupplier,
                 hubRootViewGroupSupplier,
@@ -63,10 +66,10 @@
      */
     @VisibleForTesting
     HubLayoutDependencyHolder(
-            @NonNull LazyOneshotSupplier<HubManager> hubManagerSupplier,
-            @NonNull LazyOneshotSupplier<ViewGroup> hubRootViewGroupSupplier,
-            @NonNull HubLayoutScrimController scrimController,
-            @NonNull DoubleConsumer onToolbarAlphaChange) {
+            LazyOneshotSupplier<HubManager> hubManagerSupplier,
+            LazyOneshotSupplier<ViewGroup> hubRootViewGroupSupplier,
+            HubLayoutScrimController scrimController,
+            DoubleConsumer onToolbarAlphaChange) {
         mHubManagerSupplier = hubManagerSupplier;
         mHubRootViewGroupSupplier = hubRootViewGroupSupplier;
         mScrimController = scrimController;
@@ -74,22 +77,22 @@
     }
 
     /** Returns the {@link HubManager} creating it if necessary. */
-    public @NonNull HubManager getHubManager() {
-        return mHubManagerSupplier.get();
+    public HubManager getHubManager() {
+        return assumeNonNull(mHubManagerSupplier.get());
     }
 
     /** Returns the root view to attach the Hub to creating it if necessary. */
-    public @NonNull ViewGroup getHubRootView() {
-        return mHubRootViewGroupSupplier.get();
+    public ViewGroup getHubRootView() {
+        return assumeNonNull(mHubRootViewGroupSupplier.get());
     }
 
     /** Returns the {@link HubLayoutScrimController} used for the {@link HubLayout}. */
-    public @NonNull HubLayoutScrimController getScrimController() {
+    public HubLayoutScrimController getScrimController() {
         return mScrimController;
     }
 
     /** Returns the observer to notify when alpha changes during animations. */
-    public @NonNull DoubleConsumer getOnToolbarAlphaChange() {
+    public DoubleConsumer getOnToolbarAlphaChange() {
         return mOnToolbarAlphaChange;
     }
 }
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutScrimController.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutScrimController.java
index ce64b18..8b3f228cc 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutScrimController.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubLayoutScrimController.java
@@ -7,26 +7,27 @@
 import android.view.View;
 
 import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 
 import org.chromium.base.Callback;
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.Supplier;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.styles.ChromeColors;
 import org.chromium.components.browser_ui.widget.scrim.ScrimManager;
 import org.chromium.components.browser_ui.widget.scrim.ScrimProperties;
 import org.chromium.ui.modelutil.PropertyModel;
 
 /** Wrapper around {@link ScrimManager} to inject into {@link HubLayout}. */
+@NullMarked
 public class HubLayoutScrimController implements ScrimController {
     // From TabSwitcherLayout.java.
     private static final int SCRIM_FADE_DURATION_MS = 350;
 
-    private final @NonNull ScrimManager mScrimManager;
-    private final @NonNull Supplier<View> mAnchorViewSupplier;
-    private final @NonNull ObservableSupplier<Boolean> mIsIncognitoSupplier;
-    private final @NonNull Callback<Boolean> mOnIncognitoChange = this::onIncognitoChange;
+    private final ScrimManager mScrimManager;
+    private final Supplier<View> mAnchorViewSupplier;
+    private final ObservableSupplier<Boolean> mIsIncognitoSupplier;
+    private final Callback<Boolean> mOnIncognitoChange = this::onIncognitoChange;
 
     private @Nullable PropertyModel mPropertyModel;
 
@@ -37,9 +38,9 @@
      * @param isIncognitoSupplier For checking and observing if the current UI is incognito.
      */
     public HubLayoutScrimController(
-            @NonNull ScrimManager scrimManager,
-            @NonNull Supplier<View> anchorViewSupplier,
-            @NonNull ObservableSupplier<Boolean> isIncognitoSupplier) {
+            ScrimManager scrimManager,
+            Supplier<View> anchorViewSupplier,
+            ObservableSupplier<Boolean> isIncognitoSupplier) {
         mScrimManager = scrimManager;
         mAnchorViewSupplier = anchorViewSupplier;
         mIsIncognitoSupplier = isIncognitoSupplier;
@@ -57,6 +58,7 @@
                         .with(ScrimProperties.BACKGROUND_COLOR, calculateScrimColor());
 
         mPropertyModel = scrimPropertiesBuilder.build();
+        assert mPropertyModel != null;
         mIsIncognitoSupplier.addObserver(mOnIncognitoChange);
         mScrimManager.showScrim(mPropertyModel);
     }
@@ -65,6 +67,8 @@
     public void startHidingScrim() {
         if (!mScrimManager.isShowingScrim()) return;
 
+        assert mPropertyModel != null;
+
         mIsIncognitoSupplier.removeObserver(mOnIncognitoChange);
         mScrimManager.hideScrim(mPropertyModel, /* animate= */ true, SCRIM_FADE_DURATION_MS);
         mPropertyModel = null;
@@ -72,6 +76,8 @@
 
     /** Forces the current animation to finish. */
     public void forceAnimationToFinish() {
+        if (mPropertyModel == null) return;
+
         mScrimManager.forceAnimationToFinish(mPropertyModel);
     }
 
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubManager.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubManager.java
index a5a8de0..3b2fb1e 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubManager.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubManager.java
@@ -4,38 +4,34 @@
 
 package org.chromium.chrome.browser.hub;
 
-import androidx.annotation.NonNull;
-
 import org.chromium.base.supplier.ObservableSupplier;
+import org.chromium.build.annotations.NullMarked;
 
 /**
  * This is the primary interface for interacting with the Hub. Create using {@link
  * HubManagerFactory}.
  */
+@NullMarked
 public interface HubManager {
     /** Destroys the {@link HubManager}, it cannot be used again. */
     void destroy();
 
     /** Returns the {@link PaneManager} for interacting with {@link Pane}s. */
-    @NonNull
     PaneManager getPaneManager();
 
     /**
      * Returns the {@link HubController} used by the {@link HubLayout} to control the visibility and
      * display of the Hub.
      */
-    @NonNull
     HubController getHubController();
 
     /** Returns a supplier that contains true when the Hub is visible and false otherwise. */
-    @NonNull
     ObservableSupplier<Boolean> getHubVisibilitySupplier();
 
     /**
      * Returns the {@link HubShowPaneHelper} used to select a pane before opening the {@link
      * HubLayout}.
      */
-    @NonNull
     HubShowPaneHelper getHubShowPaneHelper();
 
     /** Sets the status indicator height. */
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubShowPaneHelper.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubShowPaneHelper.java
index f131de7e..202ef99 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubShowPaneHelper.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubShowPaneHelper.java
@@ -4,9 +4,13 @@
 
 package org.chromium.chrome.browser.hub;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+
 /** A helper class to select a pane before opening the {@link HubLayout}. */
+@NullMarked
 public class HubShowPaneHelper {
-    private @PaneId Integer mNextPaneId;
+    private @Nullable @PaneId Integer mNextPaneId;
 
     public HubShowPaneHelper() {}
 
@@ -52,7 +56,7 @@
         return nextPaneId;
     }
 
-    Integer getNextPaneIdForTesting() {
+    @Nullable Integer getNextPaneIdForTesting() {
         return mNextPaneId;
     }
 }
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubUtils.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubUtils.java
index 7059920..2f00869 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubUtils.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubUtils.java
@@ -8,7 +8,10 @@
 
 import androidx.annotation.IdRes;
 
+import org.chromium.build.annotations.NullMarked;
+
 /** Feature related utilities for Hub. */
+@NullMarked
 public class HubUtils {
     /**
      * Returns the height of the hub search box's calculated container.
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubViewColorBlend.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubViewColorBlend.java
index 5b4c203..430031a6 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubViewColorBlend.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubViewColorBlend.java
@@ -8,7 +8,10 @@
 
 import androidx.annotation.ColorInt;
 
+import org.chromium.build.annotations.NullMarked;
+
 /** Helper class to manage Animator object creation for views during a hub color scheme change. */
+@NullMarked
 public interface HubViewColorBlend {
 
     interface ColorGetter {
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/Pane.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/Pane.java
index e7a2019..d1d91ba6 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/Pane.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/Pane.java
@@ -6,21 +6,20 @@
 
 import android.view.ViewGroup;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
 import org.chromium.base.supplier.ObservableSupplier;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.widget.MenuOrKeyboardActionController.MenuOrKeyboardActionHandler;
 import org.chromium.components.browser_ui.widget.gesture.BackPressHandler;
 
 /** A base interface representing a UI that will be displayed as a Pane in the Hub. */
+@NullMarked
 public interface Pane extends BackPressHandler {
     /** Returns the {@link PaneId} corresponding to this Pane. */
     @PaneId
     int getPaneId();
 
     /** Returns the {@link ViewGroup} containing the contents of the Pane. */
-    @NonNull
     ViewGroup getRootView();
 
     /** Returns the {@link MenuOrKeyboardActionHandler} for the Pane. */
@@ -54,15 +53,12 @@
     void notifyLoadHint(@LoadHint int loadHint);
 
     /** Returns button data for the primary action on the page, such as adding a tab. */
-    @NonNull
     ObservableSupplier<FullButtonData> getActionButtonDataSupplier();
 
     /** Returns the visuals for creating a button to navigate to this pane. */
-    @NonNull
     ObservableSupplier<DisplayButtonData> getReferenceButtonDataSupplier();
 
     /** Returns whether to show the hairline for the pane. */
-    @NonNull
     ObservableSupplier<Boolean> getHairlineVisibilitySupplier();
 
     /** Returns an optional listener for animation progress. */
@@ -75,9 +71,8 @@
      *
      * @param hubContainerView The {@link HubContainerView} that should show.
      */
-    @NonNull
     HubLayoutAnimatorProvider createShowHubLayoutAnimatorProvider(
-            @NonNull HubContainerView hubContainerView);
+            HubContainerView hubContainerView);
 
     /**
      * Create a {@link HubLayoutAnimatorProvider} to use when hiding the {@link HubLayout} if this
@@ -85,11 +80,9 @@
      *
      * @param hubContainerView The {@link HubContainerView} that should hide.
      */
-    @NonNull
     HubLayoutAnimatorProvider createHideHubLayoutAnimatorProvider(
-            @NonNull HubContainerView hubContainerView);
+            HubContainerView hubContainerView);
 
     /** Returns whether to enable the state of hub search. */
-    @NonNull
     ObservableSupplier<Boolean> getHubSearchEnabledStateSupplier();
 }
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneHubController.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneHubController.java
index d4dc4ab..1bc27647 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneHubController.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneHubController.java
@@ -6,14 +6,15 @@
 
 import android.view.View;
 
-import androidx.annotation.Nullable;
-
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.tab.Tab;
 
 /**
  * Interface for controlling the Hub from a {@link Pane}. This is only available to the focused
  * pane.
  */
+@NullMarked
 public interface PaneHubController {
     /**
      * Sets a tab as active and hides the Hub. A tab must be selected if the browser is
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneListBuilder.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneListBuilder.java
index 0223c7d..c255a001 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneListBuilder.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneListBuilder.java
@@ -4,18 +4,19 @@
 
 package org.chromium.chrome.browser.hub;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
 import com.google.common.collect.ImmutableMap;
 
 import org.chromium.base.Log;
 import org.chromium.base.supplier.LazyOneshotSupplier;
+import org.chromium.build.annotations.EnsuresNonNullIf;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 import java.util.HashMap;
 import java.util.Locale;
 
 /** Builder for creating an immutable list of all {@link Pane}s to be shown in the Hub. */
+@NullMarked
 public class PaneListBuilder {
     private static final String TAG = "PaneListBuilder";
 
@@ -30,9 +31,10 @@
 
     /**
      * Constructs a builder to assemble a list of {@link Pane}s to show in the Hub.
+     *
      * @param paneOrderController That will specify the order to show Panes in the Hub.
      */
-    public PaneListBuilder(@NonNull PaneOrderController paneOrderController) {
+    public PaneListBuilder(PaneOrderController paneOrderController) {
         mPaneOrderController = paneOrderController;
     }
 
@@ -50,7 +52,7 @@
      *     at registration time to facilitate lazy initialization.
      */
     public PaneListBuilder registerPane(
-            @PaneId int paneId, @NonNull LazyOneshotSupplier<Pane> paneSupplier) {
+            @PaneId int paneId, LazyOneshotSupplier<Pane> paneSupplier) {
         if (isBuilt()) {
             throw new IllegalStateException(
                     "PaneListBuilder#build() was already invoked. Cannot add a pane for " + paneId);
@@ -68,6 +70,9 @@
      * true, future calls to {@link #registerPane(int, Supplier)} will throw an {@link
      * IllegalStateException}.
      */
+    @EnsuresNonNullIf(
+            value = {"mRegisteredPanes"},
+            result = false)
     public boolean isBuilt() {
         return mRegisteredPanes == null;
     }
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneLookup.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneLookup.java
index 85e15d60..ad6d986 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneLookup.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneLookup.java
@@ -4,9 +4,11 @@
 
 package org.chromium.chrome.browser.hub;
 
-import androidx.annotation.Nullable;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 /** Interface for providing access to Panes. */
+@NullMarked
 public interface PaneLookup {
     @Nullable
     Pane getPaneForId(@PaneId int paneId);
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneManager.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneManager.java
index c770db1..47650dd 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneManager.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneManager.java
@@ -4,18 +4,16 @@
 
 package org.chromium.chrome.browser.hub;
 
-import androidx.annotation.NonNull;
-
 import org.chromium.base.supplier.ObservableSupplier;
+import org.chromium.build.annotations.NullMarked;
 
 /** Interface for managing {@link Pane}s. */
+@NullMarked
 public interface PaneManager extends PaneLookup {
     /** Returns the authoritative source of the order of panes. */
-    @NonNull
     PaneOrderController getPaneOrderController();
 
     /** Returns an observable version of the current pane. */
-    @NonNull
     ObservableSupplier<Pane> getFocusedPaneSupplier();
 
     /**
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneOrderController.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneOrderController.java
index 9acc73e..cda3dc7 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneOrderController.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PaneOrderController.java
@@ -6,7 +6,10 @@
 
 import com.google.common.collect.ImmutableSet;
 
-/** Interface for specifying the order of {@link Pane}s in the Hub. **/
+import org.chromium.build.annotations.NullMarked;
+
+/** Interface for specifying the order of {@link Pane}s in the Hub. * */
+@NullMarked
 public interface PaneOrderController {
     /** Returns an ordered set of {@link PaneId} representing the order of Panes in the Hub. **/
     public ImmutableSet<Integer> getPaneOrder();
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PresetHubLayoutAnimatorProvider.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PresetHubLayoutAnimatorProvider.java
index 8a13999..ef7ad1c 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PresetHubLayoutAnimatorProvider.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/PresetHubLayoutAnimatorProvider.java
@@ -8,12 +8,14 @@
 
 import org.chromium.base.supplier.SyncOneshotSupplier;
 import org.chromium.base.supplier.SyncOneshotSupplierImpl;
+import org.chromium.build.annotations.NullMarked;
 
 /**
  * An implementation of {@link HubLayoutAnimatorProvider} to wrap an already completed {@link
  * HubLayoutAnimator}. Use this if adding a {@link HubLayoutAnimator} that has no async
  * dependencies.
  */
+@NullMarked
 public class PresetHubLayoutAnimatorProvider implements HubLayoutAnimatorProvider {
     private final SyncOneshotSupplierImpl<HubLayoutAnimator> mPresetAnimatorSupplier;
 
@@ -29,7 +31,9 @@
 
     @Override
     public @HubLayoutAnimationType int getPlannedAnimationType() {
-        return mPresetAnimatorSupplier.get().getAnimationType();
+        HubLayoutAnimator animator = mPresetAnimatorSupplier.get();
+        if (animator == null) return HubLayoutAnimationType.NONE;
+        return animator.getAnimationType();
     }
 
     @Override
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ResourceButtonData.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ResourceButtonData.java
index aefbf717..6e62325a 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ResourceButtonData.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ResourceButtonData.java
@@ -8,13 +8,16 @@
 import android.graphics.drawable.Drawable;
 
 import androidx.annotation.DrawableRes;
-import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 import androidx.appcompat.content.res.AppCompatResources;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+
 import java.util.Objects;
 
 /** Resolves data by reading from Android resources on demand. */
+@NullMarked
 public class ResourceButtonData implements DisplayButtonData {
     private final @StringRes int mTextRes;
     private final @StringRes int mContentDescriptionRes;
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/RoundedCornerAnimatorUtil.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/RoundedCornerAnimatorUtil.java
index 4660766a..a2a4756f 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/RoundedCornerAnimatorUtil.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/RoundedCornerAnimatorUtil.java
@@ -6,9 +6,11 @@
 
 import android.animation.ValueAnimator;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.browser_ui.widget.RoundedCornerImageView;
 
 /** Utilities related to {@link RoundedCornerImageView} animations. */
+@NullMarked
 public class RoundedCornerAnimatorUtil {
     /**
      * Returns a {@link ValueAnimator} for {@link RoundedCornerImageView#setRoundedCorners}
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ScrimController.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ScrimController.java
index 1bbc78c..bfcb91a 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ScrimController.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ScrimController.java
@@ -4,7 +4,10 @@
 
 package org.chromium.chrome.browser.hub;
 
+import org.chromium.build.annotations.NullMarked;
+
 /** Interface for controlling scrim visibility. */
+@NullMarked
 public interface ScrimController {
     /** Show a scrim with an animation. */
     void startShowingScrim();
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ShrinkExpandAnimationData.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ShrinkExpandAnimationData.java
index 47b2904..e6cd9d5 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ShrinkExpandAnimationData.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ShrinkExpandAnimationData.java
@@ -7,9 +7,8 @@
 import android.graphics.Rect;
 import android.util.Size;
 
-import androidx.annotation.Nullable;
-
 import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 /** Data to asynchronously supply to {@link ShrinkExpandHubLayoutAnimatorProvider}. */
 @NullMarked
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ShrinkExpandAnimator.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ShrinkExpandAnimator.java
index 224f9b9..8367558 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ShrinkExpandAnimator.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ShrinkExpandAnimator.java
@@ -10,12 +10,13 @@
 import android.util.Size;
 import android.widget.ImageView;
 
-import androidx.annotation.NonNull;
-
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.build.annotations.UsedByReflection;
 
 /** Animator for scaling a {@link ShrinkExpandImageView} from one rect to another. */
 // TODO(crbug.com/40286625): Move to hub/internal/ once TabSwitcherLayout no longer depends on this.
+@NullMarked
 public class ShrinkExpandAnimator {
     /**
      * Tag for the {@link ObjectAnimator#ofObject()} {@code propertyName} param. Using this triggers
@@ -29,7 +30,7 @@
     private final Rect mFinalRect;
     private final Matrix mImageMatrix;
     private final int mSearchBoxHeight;
-    private Size mThumbnailSize;
+    private @Nullable Size mThumbnailSize;
 
     /**
      * Create an animator that scales and translates a view from one rect to another.
@@ -40,10 +41,7 @@
      * @param finalRect the final rect that view will encompass in global coordinates.
      */
     public ShrinkExpandAnimator(
-            @NonNull ShrinkExpandImageView view,
-            @NonNull Rect initialRect,
-            @NonNull Rect finalRect,
-            int searchBoxHeight) {
+            ShrinkExpandImageView view, Rect initialRect, Rect finalRect, int searchBoxHeight) {
         mView = view;
         assert mView.getScaleX() == 1.0f;
         assert mView.getScaleY() == 1.0f;
@@ -74,7 +72,7 @@
      * @param rect The rect to scale the view to for the current frame.
      */
     @UsedByReflection("Used in ObjectAnimator")
-    public void setRect(@NonNull Rect rect) {
+    public void setRect(Rect rect) {
         final int currentRectWidth = rect.width();
         final int currentRectHeight = rect.height();
         final int initialRectWidth = mInitialRect.width();
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ShrinkExpandImageView.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ShrinkExpandImageView.java
index 6d14458b..c0f7ecc 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ShrinkExpandImageView.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/ShrinkExpandImageView.java
@@ -15,9 +15,9 @@
 import android.widget.FrameLayout;
 import android.widget.ImageView;
 
-import androidx.annotation.Nullable;
-
 import org.chromium.base.BuildInfo;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.widget.RoundedCornerImageView;
 import org.chromium.ui.animation.RunOnNextLayout;
 import org.chromium.ui.animation.RunOnNextLayoutDelegate;
@@ -25,6 +25,7 @@
 
 /** {@link ImageView} for the Shrink, Expand, and New Tab animations. */
 // TODO(crbug.com/40286625): Move to hub/internal/ once TabSwitcherLayout no longer depends on this.
+@NullMarked
 public class ShrinkExpandImageView extends RoundedCornerImageView implements RunOnNextLayout {
     private final RunOnNextLayoutDelegate mRunOnNextLayoutDelegate;
 
@@ -102,7 +103,7 @@
     }
 
     @Override
-    public void setImageBitmap(Bitmap bitmap) {
+    public void setImageBitmap(@Nullable Bitmap bitmap) {
         if (BuildInfo.getInstance().isAutomotive && bitmap != null) {
             bitmap.setDensity(
                     DisplayUtil.getUiDensityForAutomotive(getContext(), bitmap.getDensity()));
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/TabSwitcherDrawableButtonData.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/TabSwitcherDrawableButtonData.java
index d27e5915..40edb6c 100644
--- a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/TabSwitcherDrawableButtonData.java
+++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/TabSwitcherDrawableButtonData.java
@@ -7,13 +7,16 @@
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.PluralsRes;
 import androidx.annotation.StringRes;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+
 import java.util.Objects;
 
 /** Resolves the tab switcher drawable's button data. */
+@NullMarked
 public class TabSwitcherDrawableButtonData extends DrawableButtonData {
     private final int mTabCount;
 
diff --git a/chrome/browser/mandatory_reauth/android/java/src/org/chromium/chrome/browser/mandatory_reauth/MandatoryReauthOptInBottomSheetComponent.java b/chrome/browser/mandatory_reauth/android/java/src/org/chromium/chrome/browser/mandatory_reauth/MandatoryReauthOptInBottomSheetComponent.java
index cfc286dd..f16622f 100644
--- a/chrome/browser/mandatory_reauth/android/java/src/org/chromium/chrome/browser/mandatory_reauth/MandatoryReauthOptInBottomSheetComponent.java
+++ b/chrome/browser/mandatory_reauth/android/java/src/org/chromium/chrome/browser/mandatory_reauth/MandatoryReauthOptInBottomSheetComponent.java
@@ -4,9 +4,11 @@
 
 package org.chromium.chrome.browser.mandatory_reauth;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.autofill.PaymentsUiClosedReason;
 
 /** This component allows showing the Mandatory Reauth opt-in prompt in a bottom sheet. */
+@NullMarked
 interface MandatoryReauthOptInBottomSheetComponent {
     /** The delegate is used to relay the bottom sheet events to the native side. */
     interface Delegate {
diff --git a/chrome/browser/optimization_guide/model_execution/model_execution_browsertest.cc b/chrome/browser/optimization_guide/model_execution/model_execution_browsertest.cc
index f170ab1..92de187 100644
--- a/chrome/browser/optimization_guide/model_execution/model_execution_browsertest.cc
+++ b/chrome/browser/optimization_guide/model_execution/model_execution_browsertest.cc
@@ -1031,147 +1031,6 @@
 };
 
 IN_PROC_BROWSER_TEST_P(ModelExecutionEnterprisePolicyBrowserTest,
-                       DisableThenEnable) {
-  EnableSignin();
-
-  auto* prefs = browser()->profile()->GetPrefs();
-  prefs->SetInteger(
-      prefs::GetSettingEnabledPrefName(UserVisibleFeatureKey::kTabOrganization),
-      static_cast<int>(prefs::FeatureOptInState::kEnabled));
-  base::RunLoop().RunUntilIdle();
-
-  // Default policy value allows the feature.
-  EXPECT_TRUE(IsSettingVisible(UserVisibleFeatureKey::kTabOrganization));
-  EXPECT_TRUE(ShouldFeatureBeCurrentlyEnabledForUser(
-      UserVisibleFeatureKey::kTabOrganization));
-  EXPECT_TRUE(ShouldFeatureBeCurrentlyAllowedForLogging(
-      proto::LogAiDataRequest::FeatureCase::kTabOrganization));
-  EXPECT_FALSE(IsSettingVisible(UserVisibleFeatureKey::kCompose));
-  EXPECT_TRUE(ShouldFeatureBeCurrentlyAllowedForLogging(
-      proto::LogAiDataRequest::FeatureCase::kCompose));
-
-  // Disable via the enterprise policy.
-  policy::PolicyMap policies;
-  policies.Set(policy::key::kTabOrganizerSettings,
-               policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
-               policy::POLICY_SOURCE_CLOUD,
-               base::Value(static_cast<int>(
-                   model_execution::prefs::ModelExecutionEnterprisePolicyValue::
-                       kDisable)),
-               nullptr);
-  policy_provider_.UpdateChromePolicy(policies);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(ShowEnterpriseDisabledFeatures(),
-            IsSettingVisible(UserVisibleFeatureKey::kTabOrganization));
-  EXPECT_FALSE(ShouldFeatureBeCurrentlyEnabledForUser(
-      UserVisibleFeatureKey::kTabOrganization));
-  EXPECT_FALSE(IsSettingVisible(UserVisibleFeatureKey::kCompose));
-  EXPECT_TRUE(ShouldFeatureBeCurrentlyAllowedForLogging(
-      proto::LogAiDataRequest::FeatureCase::kCompose));
-  EXPECT_FALSE(ShouldFeatureBeCurrentlyAllowedForLogging(
-      proto::LogAiDataRequest::FeatureCase::kTabOrganization));
-
-  // Enable via the enterprise policy.
-  policies.Set(
-      policy::key::kTabOrganizerSettings, policy::POLICY_LEVEL_MANDATORY,
-      policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
-      base::Value(static_cast<int>(
-          model_execution::prefs::ModelExecutionEnterprisePolicyValue::kAllow)),
-      nullptr);
-  policy_provider_.UpdateChromePolicy(policies);
-  prefs->SetInteger(
-      prefs::GetSettingEnabledPrefName(UserVisibleFeatureKey::kTabOrganization),
-      static_cast<int>(prefs::FeatureOptInState::kEnabled));
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(IsSettingVisible(UserVisibleFeatureKey::kTabOrganization));
-  EXPECT_TRUE(ShouldFeatureBeCurrentlyEnabledForUser(
-      UserVisibleFeatureKey::kTabOrganization));
-  EXPECT_TRUE(ShouldFeatureBeCurrentlyAllowedForLogging(
-      proto::LogAiDataRequest::FeatureCase::kTabOrganization));
-  EXPECT_FALSE(IsSettingVisible(UserVisibleFeatureKey::kCompose));
-  EXPECT_TRUE(ShouldFeatureBeCurrentlyAllowedForLogging(
-      proto::LogAiDataRequest::FeatureCase::kCompose));
-}
-
-IN_PROC_BROWSER_TEST_P(ModelExecutionEnterprisePolicyBrowserTest,
-                       DisableThenEnableCompose) {
-  EnableSignin();
-
-  SetExpectedBearerAccessToken("Bearer access_token");
-  SetResponseType(ModelExecutionRemoteResponseType::kUnsupportedLanguage);
-
-  // Enable metrics consent for logging.
-  SetMetricsConsent(true);
-  ASSERT_TRUE(
-      g_browser_process->GetMetricsServicesManager()->IsMetricsConsentGiven());
-
-  auto* prefs = browser()->profile()->GetPrefs();
-  prefs->SetInteger(
-      prefs::GetSettingEnabledPrefName(UserVisibleFeatureKey::kCompose),
-      static_cast<int>(prefs::FeatureOptInState::kEnabled));
-  base::RunLoop().RunUntilIdle();
-
-  // Default policy value allows the feature.
-  EXPECT_TRUE(IsSettingVisible(UserVisibleFeatureKey::kCompose));
-  EXPECT_TRUE(
-      ShouldFeatureBeCurrentlyEnabledForUser(UserVisibleFeatureKey::kCompose));
-
-  // Disable via the enterprise policy.
-  policy::PolicyMap policies;
-  policies.Set(policy::key::kHelpMeWriteSettings,
-               policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
-               policy::POLICY_SOURCE_CLOUD,
-               base::Value(static_cast<int>(
-                   model_execution::prefs::ModelExecutionEnterprisePolicyValue::
-                       kDisable)),
-               nullptr);
-  policy_provider_.UpdateChromePolicy(policies);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(IsSettingVisible(UserVisibleFeatureKey::kCompose));
-  EXPECT_FALSE(
-      ShouldFeatureBeCurrentlyEnabledForUser(UserVisibleFeatureKey::kCompose));
-
-  proto::ComposeRequest request_1;
-  request_1.mutable_generate_params()->set_user_input("a user typed this");
-  ExecuteModel(UserVisibleFeatureKey::kCompose, request_1);
-
-  // As the feature is fully disabled by enterprise policy, logs should also be
-  // disabled.
-  histogram_tester_.ExpectUniqueSample(
-      "OptimizationGuide.ModelQualityLogsUploaderService.UploadStatus.Compose",
-      optimization_guide::ModelQualityLogsUploadStatus::
-          kDisabledDueToEnterprisePolicy,
-      1);
-
-  // Enable via the enterprise policy and check upload.
-  policies.Set(
-      policy::key::kHelpMeWriteSettings, policy::POLICY_LEVEL_MANDATORY,
-      policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
-      base::Value(static_cast<int>(
-          model_execution::prefs::ModelExecutionEnterprisePolicyValue::kAllow)),
-      nullptr);
-  policy_provider_.UpdateChromePolicy(policies);
-  prefs->SetInteger(
-      prefs::GetSettingEnabledPrefName(UserVisibleFeatureKey::kCompose),
-      static_cast<int>(optimization_guide::prefs::FeatureOptInState::kEnabled));
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(IsSettingVisible(UserVisibleFeatureKey::kCompose));
-  EXPECT_TRUE(
-      ShouldFeatureBeCurrentlyEnabledForUser(UserVisibleFeatureKey::kCompose));
-
-  proto::ComposeRequest request_2;
-  request_2.mutable_generate_params()->set_user_input("a user typed this");
-  ExecuteModel(UserVisibleFeatureKey::kCompose, request_2);
-
-  // No new blocked logs samples should have been recorded.
-  histogram_tester_.ExpectUniqueSample(
-      "OptimizationGuide.ModelQualityLogsUploaderService.UploadStatus.Compose",
-      optimization_guide::ModelQualityLogsUploadStatus::
-          kDisabledDueToEnterprisePolicy,
-      1);
-}
-
-IN_PROC_BROWSER_TEST_P(ModelExecutionEnterprisePolicyBrowserTest,
                        EnableComposeWithoutLogging) {
   EnableSignin();
 
@@ -1289,40 +1148,6 @@
       UserVisibleFeatureKey::kWallpaperSearch));
 }
 
-IN_PROC_BROWSER_TEST_P(ModelExecutionEnterprisePolicyBrowserTest,
-                       EnableTabOrganizationWithoutLogging) {
-  EnableSignin();
-
-  auto* prefs = browser()->profile()->GetPrefs();
-  prefs->SetInteger(
-      prefs::GetSettingEnabledPrefName(UserVisibleFeatureKey::kTabOrganization),
-      static_cast<int>(prefs::FeatureOptInState::kEnabled));
-  base::RunLoop().RunUntilIdle();
-
-  // EnableWithoutLogging via the enterprise policy.
-  policy::PolicyMap policies;
-  policies.Set(policy::key::kTabOrganizerSettings,
-               policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
-               policy::POLICY_SOURCE_CLOUD,
-               base::Value(static_cast<int>(
-                   model_execution::prefs::ModelExecutionEnterprisePolicyValue::
-                       kAllowWithoutLogging)),
-               nullptr);
-  policy_provider_.UpdateChromePolicy(policies);
-  prefs->SetInteger(
-      prefs::GetSettingEnabledPrefName(UserVisibleFeatureKey::kTabOrganization),
-      static_cast<int>(prefs::FeatureOptInState::kEnabled));
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(IsSettingVisible(UserVisibleFeatureKey::kTabOrganization));
-  EXPECT_TRUE(ShouldFeatureBeCurrentlyEnabledForUser(
-      UserVisibleFeatureKey::kTabOrganization));
-  EXPECT_FALSE(ShouldFeatureBeCurrentlyAllowedForLogging(
-      proto::LogAiDataRequest::FeatureCase::kTabOrganization));
-  EXPECT_FALSE(IsSettingVisible(UserVisibleFeatureKey::kCompose));
-  EXPECT_TRUE(ShouldFeatureBeCurrentlyAllowedForLogging(
-      proto::LogAiDataRequest::FeatureCase::kCompose));
-}
-
 INSTANTIATE_TEST_SUITE_P(,
                          ModelExecutionEnterprisePolicyBrowserTest,
                          ::testing::Bool());
diff --git a/chrome/browser/partnerbookmarks/android/java/src/org/chromium/chrome/browser/partnerbookmarks/Placeholder.java b/chrome/browser/partnerbookmarks/android/java/src/org/chromium/chrome/browser/partnerbookmarks/Placeholder.java
index b45df15..cfa8c3da 100644
--- a/chrome/browser/partnerbookmarks/android/java/src/org/chromium/chrome/browser/partnerbookmarks/Placeholder.java
+++ b/chrome/browser/partnerbookmarks/android/java/src/org/chromium/chrome/browser/partnerbookmarks/Placeholder.java
@@ -4,5 +4,8 @@
 
 package org.chromium.chrome.browser.partnerbookmarks;
 
+import org.chromium.build.annotations.NullMarked;
+
 /** For now a placeholder. */
+@NullMarked
 public interface Placeholder {}
diff --git a/chrome/browser/password_manager/android/shared_ui/java/src/org/chromium/chrome/browser/password_manager/shared_ui/AutoCompleteTextViewNoAutofill.java b/chrome/browser/password_manager/android/shared_ui/java/src/org/chromium/chrome/browser/password_manager/shared_ui/AutoCompleteTextViewNoAutofill.java
index 291df90b..32fee14 100644
--- a/chrome/browser/password_manager/android/shared_ui/java/src/org/chromium/chrome/browser/password_manager/shared_ui/AutoCompleteTextViewNoAutofill.java
+++ b/chrome/browser/password_manager/android/shared_ui/java/src/org/chromium/chrome/browser/password_manager/shared_ui/AutoCompleteTextViewNoAutofill.java
@@ -9,11 +9,14 @@
 import android.view.ViewStructure;
 import android.widget.AutoCompleteTextView;
 
+import org.chromium.build.annotations.NullMarked;
+
 /**
  * A wrapper class around {@link AutoCompleteTextView} to stop Android Autofill from showing the
  * save password prompt. This is achieved by overriding the {@code onProvideAutofillStructure}
  * method.
  */
+@NullMarked
 public class AutoCompleteTextViewNoAutofill extends AutoCompleteTextView {
     public AutoCompleteTextViewNoAutofill(Context context, AttributeSet attrs) {
         super(context, attrs);
diff --git a/chrome/browser/password_manager/android/shared_ui/java/src/org/chromium/chrome/browser/password_manager/shared_ui/TextInputEditTextNoAutofill.java b/chrome/browser/password_manager/android/shared_ui/java/src/org/chromium/chrome/browser/password_manager/shared_ui/TextInputEditTextNoAutofill.java
index 0a6d2013..e28391d 100644
--- a/chrome/browser/password_manager/android/shared_ui/java/src/org/chromium/chrome/browser/password_manager/shared_ui/TextInputEditTextNoAutofill.java
+++ b/chrome/browser/password_manager/android/shared_ui/java/src/org/chromium/chrome/browser/password_manager/shared_ui/TextInputEditTextNoAutofill.java
@@ -10,10 +10,13 @@
 
 import com.google.android.material.textfield.TextInputEditText;
 
+import org.chromium.build.annotations.NullMarked;
+
 /**
  * A wrapper class around {@link TextInputEditText} to stop Android Autofill from showing the save
  * password prompt. This is achieved by overriding the {@code onProvideAutofillStructure} method.
  */
+@NullMarked
 public class TextInputEditTextNoAutofill extends TextInputEditText {
 
     public TextInputEditTextNoAutofill(Context context, AttributeSet attrs) {
diff --git a/chrome/browser/permissions/BUILD.gn b/chrome/browser/permissions/BUILD.gn
index ff2cbe23..6b7a7af 100644
--- a/chrome/browser/permissions/BUILD.gn
+++ b/chrome/browser/permissions/BUILD.gn
@@ -181,6 +181,20 @@
   sources = [ "crowd_deny.proto" ]
 }
 
+source_set("test_support") {
+  testonly = true
+
+  sources = [
+    "system/mock_platform_handle.cc",
+    "system/mock_platform_handle.h",
+  ]
+
+  deps = [
+    ":permissions",
+    "//testing/gmock",
+  ]
+}
+
 source_set("unit_tests") {
   testonly = true
 
@@ -197,13 +211,12 @@
     "permissions_ai_handler_unittest.cc",
     "prediction_based_permission_ui_selector_unittest.cc",
     "pref_based_quiet_permission_ui_selector_unittest.cc",
-    "system/mock_platform_handle.cc",
-    "system/mock_platform_handle.h",
   ]
 
   deps = [
     ":permissions",
     ":permissions_proto",
+    ":test_support",
     "//chrome/browser/content_settings:content_settings_factory",
     "//chrome/browser/optimization_guide:test_support",
     "//chrome/browser/permissions/system",
diff --git a/chrome/browser/permissions/permission_request_manager_browsertest.cc b/chrome/browser/permissions/permission_request_manager_browsertest.cc
index 1fb7fb73..dc33274 100644
--- a/chrome/browser/permissions/permission_request_manager_browsertest.cc
+++ b/chrome/browser/permissions/permission_request_manager_browsertest.cc
@@ -41,6 +41,7 @@
 #include "components/permissions/test/mock_permission_ui_selector.h"
 #include "components/permissions/test/permission_request_observer.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_view_host.h"
@@ -1375,8 +1376,11 @@
       browser()->profile()->GetPermissionController();
   permission_controller->RequestPermissionFromCurrentDocument(
       fenced_frame_host,
-      content::PermissionRequestDescription(blink::PermissionType::SENSORS,
-                                            /* user_gesture = */ true),
+      content::PermissionRequestDescription(
+          content::PermissionDescriptorUtil::
+              CreatePermissionDescriptorForPermissionType(
+                  blink::PermissionType::SENSORS),
+          /* user_gesture = */ true),
       callback.Get());
   ASSERT_TRUE(console_observer.Wait());
   ASSERT_EQ(1u, console_observer.messages().size());
diff --git a/chrome/browser/policy/cloud/cloud_policy_invalidator.cc b/chrome/browser/policy/cloud/cloud_policy_invalidator.cc
index 5424189..27c55d4 100644
--- a/chrome/browser/policy/cloud/cloud_policy_invalidator.cc
+++ b/chrome/browser/policy/cloud/cloud_policy_invalidator.cc
@@ -453,8 +453,10 @@
   const std::string payload = invalidation.payload();
 
   // Ignore the invalidation if it is expired.
-  const auto last_fetch_time = base::Time::FromMillisecondsSinceUnixEpoch(
-      core_->store()->policy()->timestamp());
+  const auto* policy = core_->store()->policy();
+  const auto last_fetch_time =
+      policy ? base::Time::FromMillisecondsSinceUnixEpoch(policy->timestamp())
+             : base::Time();
   const auto current_time = clock_->Now();
   const bool is_expired =
       IsInvalidationExpired(invalidation, last_fetch_time, current_time);
diff --git a/chrome/browser/policy/cloud/cloud_policy_invalidator_with_listener_unittest.cc b/chrome/browser/policy/cloud/cloud_policy_invalidator_with_listener_unittest.cc
index 2007317..8bd07e5 100644
--- a/chrome/browser/policy/cloud/cloud_policy_invalidator_with_listener_unittest.cc
+++ b/chrome/browser/policy/cloud/cloud_policy_invalidator_with_listener_unittest.cc
@@ -501,8 +501,13 @@
 
 bool CloudPolicyInvalidatorWithListenerTestBase::CheckPolicyRefreshed(
     base::TimeDelta delay) {
-  base::TimeDelta max_delay =
-      delay + base::Milliseconds(CloudPolicyInvalidator::kMaxFetchDelayMin);
+  const auto* delay_policy_value = store_.policy_map().GetValue(
+      key::kMaxInvalidationFetchDelay, base::Value::Type::INTEGER);
+  const base::TimeDelta max_delay =
+      delay +
+      (delay_policy_value
+           ? base::Milliseconds(delay_policy_value->GetInt())
+           : base::Milliseconds(CloudPolicyInvalidator::kMaxFetchDelayMax));
 
   if (!task_runner_->HasPendingTask()) {
     return false;
@@ -651,6 +656,28 @@
   EXPECT_EQ(V(12), GetHighestHandledInvalidationVersion());
 }
 
+TEST_F(CloudPolicyInvalidatorWithListenerTest,
+       HandleInvalidationBeforePolicyLoaded) {
+  // Register and fire invalidation
+  StartInvalidator();
+  EXPECT_TRUE(InvalidationsEnabled());
+  const invalidation::Invalidation inv =
+      FireInvalidation(kTopicA, V(12), "test_payload");
+
+  // Make sure client info is set as soon as the invalidation is received.
+  EXPECT_TRUE(ClientInvalidationInfoMatches(inv));
+  EXPECT_TRUE(CheckPolicyRefreshed());
+
+  // Make sure invalidation data is not removed from the client until the store
+  // is loaded.
+  EXPECT_TRUE(ClientInvalidationInfoMatches(inv));
+  EXPECT_EQ(0, GetHighestHandledInvalidationVersion());
+  EXPECT_TRUE(ClientInvalidationInfoMatches(inv));
+  StorePolicy(V(12));
+  EXPECT_TRUE(ClientInvalidationInfoIsUnset());
+  EXPECT_EQ(V(12), GetHighestHandledInvalidationVersion());
+}
+
 TEST_F(CloudPolicyInvalidatorWithListenerTest, HandleMultipleInvalidations) {
   // Generate multiple invalidations.
   StorePolicy();
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index cc471a9c5..ced9445f 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -2305,9 +2305,6 @@
 #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 #endif // BUILDFLAG(ENABLE_EXTENSIONS)
 #if !BUILDFLAG(IS_ANDROID)
-  { key::kTabOrganizerSettings,
-    optimization_guide::prefs::kTabOrganizationEnterprisePolicyAllowed,
-    base::Value::Type::INTEGER},
   { key::kAutofillPredictionSettings,
     optimization_guide::prefs::kAutofillPredictionImprovementsEnterprisePolicyAllowed,
     base::Value::Type::INTEGER},
@@ -3339,9 +3336,6 @@
       key::kHelpMeWriteSettings,
       optimization_guide::prefs::kComposeEnterprisePolicyAllowed);
   gen_ai_default_policies.emplace_back(
-      key::kTabOrganizerSettings,
-      optimization_guide::prefs::kTabOrganizationEnterprisePolicyAllowed);
-  gen_ai_default_policies.emplace_back(
       key::kCreateThemesSettings,
       optimization_guide::prefs::kWallpaperSearchEnterprisePolicyAllowed);
   gen_ai_default_policies.emplace_back(key::kDevToolsGenAiSettings,
diff --git a/chrome/browser/prefs/BUILD.gn b/chrome/browser/prefs/BUILD.gn
index 51ef026..b4b5479 100644
--- a/chrome/browser/prefs/BUILD.gn
+++ b/chrome/browser/prefs/BUILD.gn
@@ -107,6 +107,7 @@
     "//components/privacy_sandbox:tpcd",
     "//components/proxy_config",
     "//components/reading_list/core",
+    "//components/regional_capabilities",
     "//components/safe_browsing/core/common",
     "//components/safe_browsing/core/common:safe_browsing_prefs",
     "//components/saved_tab_groups/public:prefs",
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 13f0a386..ae362e6 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -155,6 +155,7 @@
 #include "components/privacy_sandbox/privacy_sandbox_prefs.h"
 #include "components/privacy_sandbox/tpcd_pref_names.h"
 #include "components/proxy_config/pref_proxy_config_tracker_impl.h"
+#include "components/regional_capabilities/regional_capabilities_prefs.h"
 #include "components/safe_browsing/buildflags.h"
 #include "components/safe_browsing/core/common/safe_browsing_prefs.h"
 #include "components/saved_tab_groups/public/pref_names.h"
@@ -1916,6 +1917,7 @@
   custom_handlers::ProtocolHandlerRegistry::RegisterProfilePrefs(registry);
   PushMessagingAppIdentifier::RegisterProfilePrefs(registry);
   QuietNotificationPermissionUiState::RegisterProfilePrefs(registry);
+  regional_capabilities::prefs::RegisterProfilePrefs(registry);
   RegisterBrowserUserPrefs(registry);
   RegisterGeminiSettingsPrefs(registry);
   RegisterPrefersDefaultScrollbarStylesPrefs(registry);
diff --git a/chrome/browser/printing/web_api/web_printing_service_chromeos.cc b/chrome/browser/printing/web_api/web_printing_service_chromeos.cc
index 6ae23e3..5645d44 100644
--- a/chrome/browser/printing/web_api/web_printing_service_chromeos.cc
+++ b/chrome/browser/printing/web_api/web_printing_service_chromeos.cc
@@ -20,6 +20,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "components/permissions/permission_request_data.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/render_frame_host.h"
 #include "printing/backend/cups_ipp_constants.h"
 #include "printing/backend/print_backend.h"
@@ -214,7 +215,9 @@
       ->RequestPermissionFromCurrentDocument(
           &render_frame_host(),
           content::PermissionRequestDescription(
-              blink::PermissionType::WEB_PRINTING),
+              content::PermissionDescriptorUtil::
+                  CreatePermissionDescriptorForPermissionType(
+                      blink::PermissionType::WEB_PRINTING)),
           base::BindOnce(
               &WebPrintingServiceChromeOS::OnPermissionDecidedForGetPrinters,
               weak_factory_.GetWeakPtr(), std::move(callback)));
diff --git a/chrome/browser/privacy_sandbox/android/BUILD.gn b/chrome/browser/privacy_sandbox/android/BUILD.gn
index b4c3e94..f118b99 100644
--- a/chrome/browser/privacy_sandbox/android/BUILD.gn
+++ b/chrome/browser/privacy_sandbox/android/BUILD.gn
@@ -206,9 +206,9 @@
 android_resources("java_resources") {
   sources = [
     "java/res/drawable-night/privacy_sandbox_eea_consent_logo.xml",
-    "java/res/drawable-night/privacy_sandbox_eea_notice_logo.xml",
     "java/res/drawable-night/privacy_sandbox_interests_illustration.xml",
     "java/res/drawable-night/privacy_sandbox_notice_eea_illustration.xml",
+    "java/res/drawable-night/privacy_sandbox_notice_logo.xml",
     "java/res/drawable/fade_bottom.xml",
     "java/res/drawable/ic_arrow_back.xml",
     "java/res/drawable/ic_arrow_down.xml",
@@ -218,16 +218,18 @@
     "java/res/drawable/ic_checklist_24dp.xml",
     "java/res/drawable/ic_database_off_24dp.xml",
     "java/res/drawable/ic_delete_24dp.xml",
+    "java/res/drawable/ic_delete_history_24dp.xml",
     "java/res/drawable/ic_devices_24dp.xml",
     "java/res/drawable/ic_filter_list_24dp.xml",
     "java/res/drawable/ic_interests_24dp.xml",
     "java/res/drawable/ic_privacy_screen_24dp.xml",
+    "java/res/drawable/ic_rule_24dp.xml",
     "java/res/drawable/ic_table_chart_view_24dp.xml",
     "java/res/drawable/ic_web_traffic_24dp.xml",
     "java/res/drawable/privacy_sandbox_eea_consent_logo.xml",
-    "java/res/drawable/privacy_sandbox_eea_notice_logo.xml",
     "java/res/drawable/privacy_sandbox_interests_illustration.xml",
     "java/res/drawable/privacy_sandbox_notice_eea_illustration.xml",
+    "java/res/drawable/privacy_sandbox_notice_logo.xml",
     "java/res/drawable/topic_taxonomy_1_id_1.xml",
     "java/res/drawable/topic_taxonomy_1_id_100.xml",
     "java/res/drawable/topic_taxonomy_1_id_103.xml",
@@ -266,6 +268,7 @@
     "java/res/layout/privacy_sandbox_notice_restricted.xml",
     "java/res/layout/privacy_sandbox_notice_row.xml",
     "java/res/layout/privacy_sandbox_notice_row_dropdown.xml",
+    "java/res/layout/privacy_sandbox_notice_row_v3.xml",
     "java/res/layout/topics_explanation_summary.xml",
     "java/res/raw/keep_topic_taxonomy.xml",
     "java/res/values/dimens.xml",
diff --git a/chrome/browser/privacy_sandbox/android/java/res/drawable-night/privacy_sandbox_eea_notice_logo.xml b/chrome/browser/privacy_sandbox/android/java/res/drawable-night/privacy_sandbox_notice_logo.xml
similarity index 100%
rename from chrome/browser/privacy_sandbox/android/java/res/drawable-night/privacy_sandbox_eea_notice_logo.xml
rename to chrome/browser/privacy_sandbox/android/java/res/drawable-night/privacy_sandbox_notice_logo.xml
diff --git a/chrome/browser/privacy_sandbox/android/java/res/drawable/ic_delete_history_24dp.xml b/chrome/browser/privacy_sandbox/android/java/res/drawable/ic_delete_history_24dp.xml
new file mode 100644
index 0000000..b9ff5759
--- /dev/null
+++ b/chrome/browser/privacy_sandbox/android/java/res/drawable/ic_delete_history_24dp.xml
@@ -0,0 +1,3 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="960" android:viewportHeight="960" android:tint="?attr/colorControlNormal">
+<path android:fillColor="@android:color/white" android:pathData="M656,840L600,784L684,700L600,616L656,560L740,644L824,560L880,616L797,700L880,784L824,840L740,757L656,840ZM480,840Q342,840 239.5,748.5Q137,657 122,520L204,520Q218,624 296.5,692Q375,760 480,760Q491,760 500.5,759.5Q510,759 520,757L520,838Q510,839 500.5,839.5Q491,840 480,840ZM120,400L120,160L200,160L200,254Q251,190 324.5,155Q398,120 480,120Q630,120 735,225Q840,330 840,480Q840,480 840,480Q840,480 840,480L760,480Q760,480 760,480Q760,480 760,480Q760,363 678.5,281.5Q597,200 480,200Q411,200 351,232Q291,264 250,320L360,320L360,400L120,400ZM534,590L440,496L440,280L520,280L520,464L576,520L534,590Z"/>
+</vector>
diff --git a/chrome/browser/privacy_sandbox/android/java/res/drawable/ic_rule_24dp.xml b/chrome/browser/privacy_sandbox/android/java/res/drawable/ic_rule_24dp.xml
new file mode 100644
index 0000000..183cd43b
--- /dev/null
+++ b/chrome/browser/privacy_sandbox/android/java/res/drawable/ic_rule_24dp.xml
@@ -0,0 +1,3 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="960" android:viewportHeight="960" android:tint="?attr/colorControlNormal">
+<path android:fillColor="@android:color/white" android:pathData="M576,800L520,744L624,640L520,536L576,480L680,584L784,480L840,536L736,640L840,744L784,800L680,696L576,800ZM655,440L513,298L569,242L654,327L824,157L880,214L655,440ZM80,680L80,600L440,600L440,680L80,680ZM80,360L80,280L440,280L440,360L80,360Z"/>
+</vector>
diff --git a/chrome/browser/privacy_sandbox/android/java/res/drawable/privacy_sandbox_eea_notice_logo.xml b/chrome/browser/privacy_sandbox/android/java/res/drawable/privacy_sandbox_notice_logo.xml
similarity index 100%
rename from chrome/browser/privacy_sandbox/android/java/res/drawable/privacy_sandbox_eea_notice_logo.xml
rename to chrome/browser/privacy_sandbox/android/java/res/drawable/privacy_sandbox_notice_logo.xml
diff --git a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_consent_eea_v3.xml b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_consent_eea_v3.xml
index 507f161a4..47071f7 100644
--- a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_consent_eea_v3.xml
+++ b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_consent_eea_v3.xml
@@ -13,6 +13,7 @@
     android:layout_height="match_parent"
     android:orientation="vertical">
 
+   <!-- TODO(crbug.com/392943234) Move `ConstraintLayout` to be a child of `BoundedLinearLayout` such that the dialog is centered for tablet/landscape views.-->
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/privacy_sandbox_consent_eea_main_layout"
        android:layout_width="match_parent"
@@ -45,11 +46,11 @@
 
                    <ImageView
                        android:id="@+id/privacy_sandbox_eea_consent_logo"
-                       android:layout_height="@dimen/privacy_sandbox_eea_dialog_logo_height"
-                       android:layout_width="@dimen/privacy_sandbox_eea_dialog_logo_width"
+                       android:layout_height="@dimen/privacy_sandbox_dialog_logo_height"
+                       android:layout_width="@dimen/privacy_sandbox_dialog_logo_width"
                        android:layout_gravity="center"
                        app:srcCompat="@drawable/privacy_sandbox_eea_consent_logo"
-                       android:layout_marginVertical="@dimen/privacy_sandbox_dialog_eea_dialog_logo_vertical_margin"
+                       android:layout_marginVertical="@dimen/privacy_sandbox_dialog_dialog_logo_vertical_margin"
                        android:importantForAccessibility="no" />
 
                    <TextView
@@ -268,14 +269,14 @@
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            android:gravity="center_vertical"
-                           android:minHeight="@dimen/privacy_sandbox_consent_dropdown_button_height_v3"
+                           android:minHeight="@dimen/privacy_sandbox_dropdown_button_height_v3"
                            android:text="@string/privacy_sandbox_m1_consent_ads_topic_dropdown_v3"
                            style="@style/TextAppearance.TextMedium.Secondary" />
 
                        <org.chromium.ui.widget.CheckableImageView
                            android:id="@+id/dropdown_element_expand_arrow"
                            android:layout_width="20dp"
-                           android:layout_height="@dimen/privacy_sandbox_consent_dropdown_button_height_v3"/>
+                           android:layout_height="@dimen/privacy_sandbox_dropdown_button_height_v3"/>
                    </LinearLayout>
 
                    <LinearLayout
diff --git a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_eea_v3.xml b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_eea_v3.xml
index fc114cba..9e55f9a 100644
--- a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_eea_v3.xml
+++ b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_eea_v3.xml
@@ -13,6 +13,7 @@
     android:layout_height="match_parent"
     android:orientation="vertical">
 
+  <!-- TODO(crbug.com/392943234) Move `ConstraintLayout` to be a child of `BoundedLinearLayout` such that the dialog is centered for tablet/landscape views.-->
    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/privacy_sandbox_notice_eea_main_layout"
        android:layout_width="match_parent"
@@ -44,11 +45,11 @@
                    android:orientation="vertical">
 
                    <ImageView
-                       android:layout_height="@dimen/privacy_sandbox_eea_dialog_logo_height"
-                       android:layout_width="@dimen/privacy_sandbox_eea_dialog_logo_width"
+                       android:layout_height="@dimen/privacy_sandbox_dialog_logo_height"
+                       android:layout_width="@dimen/privacy_sandbox_dialog_logo_width"
                        android:layout_gravity="center"
-                       app:srcCompat="@drawable/privacy_sandbox_eea_notice_logo"
-                       android:layout_marginVertical="@dimen/privacy_sandbox_dialog_eea_dialog_logo_vertical_margin"
+                       app:srcCompat="@drawable/privacy_sandbox_notice_logo"
+                       android:layout_marginVertical="@dimen/privacy_sandbox_dialog_dialog_logo_vertical_margin"
                        android:importantForAccessibility="no" />
 
                    <TextView
@@ -185,14 +186,14 @@
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            android:gravity="center_vertical"
-                           android:minHeight="@dimen/privacy_sandbox_consent_dropdown_button_height_v3"
+                           android:minHeight="@dimen/privacy_sandbox_dropdown_button_height_v3"
                            android:text="@string/privacy_sandbox_m1_notice_dropdown_v3"
                            style="@style/TextAppearance.TextMediumThick.Secondary" />
 
                        <org.chromium.ui.widget.CheckableImageView
                            android:id="@+id/dropdown_element_expand_arrow"
                            android:layout_width="20dp"
-                           android:layout_height="@dimen/privacy_sandbox_consent_dropdown_button_height_v3"/>
+                           android:layout_height="@dimen/privacy_sandbox_dropdown_button_height_v3"/>
                    </LinearLayout>
 
                    <LinearLayout
diff --git a/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_row_v3.xml b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_row_v3.xml
new file mode 100644
index 0000000..6cfbf64
--- /dev/null
+++ b/chrome/browser/privacy_sandbox/android/java/res/layout/privacy_sandbox_notice_row_v3.xml
@@ -0,0 +1,385 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+Copyright 2025 The Chromium Authors
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/privacy_sandbox_dialog"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+  <org.chromium.components.browser_ui.widget.BoundedLinearLayout
+      android:id="@+id/privacy_sandbox_dialog_view"
+      android:layout_width="match_parent"
+      android:layout_height="match_parent"
+      android:layout_gravity="center"
+      app:maxWidthLandscape="@dimen/privacy_sandbox_dialog_max_landscape_width"
+      app:maxWidthPortrait="@dimen/privacy_sandbox_dialog_max_width">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/privacy_sandbox_notice_row_main_layout"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+      <ScrollView
+          android:id="@+id/privacy_sandbox_dialog_scroll_view"
+          android:layout_width="match_parent"
+          android:layout_height="0dp"
+          android:layout_weight="1"
+          android:fillViewport="true"
+          app:layout_constraintTop_toTopOf="parent"
+          app:layout_constraintStart_toStartOf="parent"
+          app:layout_constraintEnd_toEndOf="parent"
+          app:layout_constraintBottom_toTopOf="@+id/action_button_divider">
+
+        <LinearLayout
+            android:id="@+id/privacy_sandbox_notice_row_content"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginHorizontal="@dimen/list_item_default_margin"
+            android:gravity="center_vertical"
+            android:orientation="vertical">
+
+          <ImageView
+              android:id="@+id/privacy_sandbox_notice_logo"
+              android:layout_height="@dimen/privacy_sandbox_dialog_logo_height"
+              android:layout_width="@dimen/privacy_sandbox_dialog_logo_width"
+              android:layout_gravity="center"
+              app:srcCompat="@drawable/privacy_sandbox_notice_logo"
+              android:layout_marginVertical="@dimen/privacy_sandbox_dialog_dialog_logo_vertical_margin"
+              android:importantForAccessibility="no" />
+
+          <TextView
+              android:id="@+id/privacy_sandbox_notice_title"
+              android:layout_marginBottom="@dimen/list_item_default_margin"
+              android:includeFontPadding="false"
+              android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:accessibilityHeading="true"
+              android:text="@string/privacy_sandbox_m1_notice_row_title_v3"
+              android:layout_gravity="center"
+              android:gravity="center"
+              style="@style/TextAppearance.Headline.Primary" />
+
+          <org.chromium.ui.widget.TextViewWithLeading
+              android:id="@+id/privacy_sandbox_consent_description_v3"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:text="@string/privacy_sandbox_m1_notice_row_description_v3"
+              app:leading="@dimen/text_size_medium_leading"
+              style="@style/TextAppearance.TextMedium.Secondary" />
+
+          <LinearLayout
+              android:id="@+id/privacy_sandbox_notice_row_description_cards"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:layout_marginTop="8dp"
+              android:layout_marginBottom="16dp"
+              android:gravity="center_vertical"
+              android:orientation="vertical">
+
+            <org.chromium.components.browser_ui.widget.MaterialCardViewNoShadow
+                style="@style/MaterialCardStyle"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/privacy_sandbox_margin_between_cards"
+                android:id="@+id/description_card_one">
+
+              <androidx.constraintlayout.widget.ConstraintLayout
+                  android:id="@+id/description_1_layout"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content"
+                  android:padding="@dimen/privacy_sandbox_card_padding"
+                  android:orientation="vertical">
+
+                <ImageView
+                    android:id="@+id/description_1_image"
+                    android:layout_height="@dimen/privacy_sandbox_card_logo_height"
+                    android:layout_width="@dimen/privacy_sandbox_card_logo_width"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:srcCompat="@drawable/ic_privacy_screen_24dp"
+                    android:layout_marginTop="2dp"
+                    android:importantForAccessibility="no" />
+
+                <org.chromium.ui.widget.TextViewWithLeading
+                    android:id="@+id/description_one_text"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:layout_constraintStart_toEndOf="@id/description_1_image"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/privacy_sandbox_card_text_start_margin"
+                    app:leading="@dimen/text_size_medium_leading"
+                    android:text="@string/privacy_sandbox_m1_notice_row_card_1_v3"
+                    android:textAppearance="@style/TextAppearance.TextMedium.Primary" />
+
+              </androidx.constraintlayout.widget.ConstraintLayout>
+            </org.chromium.components.browser_ui.widget.MaterialCardViewNoShadow>
+
+            <org.chromium.components.browser_ui.widget.MaterialCardViewNoShadow
+                style="@style/MaterialCardStyle"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/privacy_sandbox_margin_between_cards"
+                android:id="@+id/description_card_2">
+
+              <androidx.constraintlayout.widget.ConstraintLayout
+                  android:id="@+id/description_card_2_layout"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content"
+                  android:padding="@dimen/privacy_sandbox_card_padding"
+                  android:orientation="vertical">
+
+                <ImageView
+                    android:id="@+id/description_card_2_image"
+                    android:layout_height="@dimen/privacy_sandbox_card_logo_height"
+                    android:layout_width="@dimen/privacy_sandbox_card_logo_width"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:srcCompat="@drawable/ic_delete_history_24dp"
+                    app:leading="@dimen/text_size_medium_leading"
+                    android:layout_marginTop="2dp"
+                    android:importantForAccessibility="no" />
+
+                <org.chromium.ui.widget.TextViewWithLeading
+                    android:id="@+id/description_card_2_text"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:layout_constraintStart_toEndOf="@id/description_card_2_image"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/privacy_sandbox_card_text_start_margin"
+                    android:text="@string/privacy_sandbox_m1_notice_row_card_2_v3"
+                    android:textAppearance="@style/TextAppearance.TextMedium.Primary" />
+
+              </androidx.constraintlayout.widget.ConstraintLayout>
+            </org.chromium.components.browser_ui.widget.MaterialCardViewNoShadow>
+
+            <org.chromium.components.browser_ui.widget.MaterialCardViewNoShadow
+                style="@style/MaterialCardStyle"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/privacy_sandbox_margin_between_cards"
+                android:id="@+id/description_card_3">
+
+              <androidx.constraintlayout.widget.ConstraintLayout
+                  android:id="@+id/description_card_3_layout"
+                  android:layout_width="match_parent"
+                  android:layout_height="wrap_content"
+                  android:padding="@dimen/privacy_sandbox_card_padding"
+                  android:orientation="vertical">
+
+                <ImageView
+                    android:id="@+id/description_card_3_image"
+                    android:layout_height="@dimen/privacy_sandbox_card_logo_height"
+                    android:layout_width="@dimen/privacy_sandbox_card_logo_width"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:srcCompat="@drawable/ic_rule_24dp"
+                    android:layout_marginTop="2dp"
+                    android:importantForAccessibility="no" />
+
+                <org.chromium.ui.widget.TextViewWithLeading
+                    android:id="@+id/description_card_3_text"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:layout_constraintStart_toEndOf="@id/description_card_3_image"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="@dimen/privacy_sandbox_card_text_start_margin"
+                    app:leading="@dimen/text_size_medium_leading"
+                    android:text="@string/privacy_sandbox_m1_notice_row_card_3_v3"
+                    android:textAppearance="@style/TextAppearance.TextMedium.Primary" />
+
+              </androidx.constraintlayout.widget.ConstraintLayout>
+            </org.chromium.components.browser_ui.widget.MaterialCardViewNoShadow>
+          </LinearLayout>
+
+          <org.chromium.ui.widget.TextViewWithLeading
+              android:id="@+id/privacy_sandbox_consent_ads_topic_description_v3"
+              android:layout_marginBottom="@dimen/promo_between_text_margin"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:text="@string/privacy_sandbox_m1_notice_row_ads_topic_description_v3"
+              app:leading="@dimen/text_size_medium_leading"
+              style="@style/TextAppearance.TextMedium.Secondary" />
+
+          <View
+              android:id="@+id/top_separator_for_dropdown"
+              android:layout_width="match_parent"
+              android:layout_height="1dp"
+              android:layout_marginTop="8dp"
+              android:layout_marginBottom="16dp"
+              style="@style/HorizontalDivider" />
+
+          <LinearLayout
+              android:id="@+id/dropdown_element"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:layout_gravity="center"
+              android:orientation="horizontal">
+
+            <TextView
+                android:id="@+id/dropdown_title"
+                android:layout_weight="1"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:gravity="center_vertical"
+                android:minHeight="@dimen/privacy_sandbox_dropdown_button_height_v3"
+                android:text="@string/privacy_sandbox_m1_notice_row_dropdown_title_v3"
+                style="@style/TextAppearance.TextMedium.Secondary" />
+
+            <org.chromium.ui.widget.CheckableImageView
+                android:id="@+id/dropdown_element_expand_arrow"
+                android:layout_width="20dp"
+                android:layout_height="@dimen/privacy_sandbox_dropdown_button_height_v3" />
+          </LinearLayout>
+
+          <LinearLayout
+              android:id="@+id/dropdown_container"
+              android:orientation="vertical"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:layout_marginTop="16dp"
+              android:visibility="gone" />
+
+          <View
+              android:id="@+id/bottom_separator_for_dropdown"
+              android:layout_width="match_parent"
+              android:layout_height="1dp"
+              android:layout_marginVertical="16dp"
+              style="@style/HorizontalDivider" />
+
+          <org.chromium.ui.widget.TextViewWithLeading
+              android:id="@+id/privacy_sandbox_consent_last_text_v3"
+              android:layout_marginBottom="22dp"
+              android:layout_width="match_parent"
+              android:layout_height="wrap_content"
+              android:layout_gravity="center_vertical"
+              android:text="@string/privacy_sandbox_m1_notice_row_last_text_v3"
+              app:leading="@dimen/text_size_medium_leading"
+              style="@style/TextAppearance.TextMedium.Secondary" />
+        </LinearLayout>
+      </ScrollView>
+
+      <View
+          android:id="@+id/action_button_divider"
+          android:layout_width="match_parent"
+          android:layout_height="1dp"
+          app:layout_constraintTop_toBottomOf="@+id/privacy_sandbox_dialog_scroll_view"
+          app:layout_constraintBottom_toTopOf="@+id/action_buttons"
+          style="@style/HorizontalDivider" />
+
+      <LinearLayout
+          android:id="@+id/action_buttons"
+          android:orientation="horizontal"
+          android:layout_width="match_parent"
+          android:layout_height="wrap_content"
+          android:weightSum="2"
+          android:layout_gravity="bottom"
+          app:layout_constraintTop_toBottomOf="@+id/action_button_divider"
+          app:layout_constraintStart_toStartOf="parent"
+          app:layout_constraintBottom_toBottomOf="parent"
+          app:layout_constraintEnd_toEndOf="parent"
+          android:layout_marginTop="@dimen/promo_dialog_padding"
+          android:layout_marginBottom="@dimen/promo_dialog_padding"
+          android:visibility="gone"
+          android:layout_marginHorizontal="@dimen/list_item_default_margin">
+
+        <org.chromium.ui.widget.ButtonCompat
+            android:id="@+id/settings_button"
+            android:focusable="true"
+            android:layout_width="0dp"
+            android:layout_weight="1"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginEnd="@dimen/privacy_sandbox_consent_button_margin_between"
+            android:text="@string/privacy_sandbox_m1_notice_row_settings_button_v3"
+            style="@style/FilledTonalButton" />
+
+        <org.chromium.ui.widget.ButtonCompat
+            android:id="@+id/ack_button"
+            android:focusable="true"
+            android:layout_width="0dp"
+            android:layout_weight="1"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/privacy_sandbox_consent_button_margin_between"
+            android:text="@string/privacy_sandbox_m1_notice_row_got_it_button_v3"
+            style="@style/FilledTonalButton" />
+
+      </LinearLayout>
+
+      <View
+          android:id="@+id/bottom_fade"
+          android:layout_width="match_parent"
+          app:layout_constraintBottom_toBottomOf="parent"
+          android:layout_height="48dp"
+          android:layout_gravity="bottom"
+          android:background="@drawable/fade_bottom" />
+
+      <org.chromium.ui.widget.ButtonCompat
+          android:id="@+id/more_button"
+          android:focusable="true"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          app:layout_constraintBottom_toBottomOf="parent"
+          app:layout_constraintEnd_toEndOf="parent"
+          android:text="@string/privacy_sandbox_m1_notice_more_v3"
+          android:layout_marginEnd="16dp"
+          android:layout_marginBottom="16dp"
+          android:layout_marginVertical="@dimen/promo_dialog_padding"
+          android:drawableStart="@drawable/ic_arrow_down"
+          android:drawableTint="?attr/globalFilledButtonTextColor"
+          android:drawablePadding="@dimen/privacy_sandbox_more_button_drawable_padding"
+          style="@style/FilledButton" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+  </org.chromium.components.browser_ui.widget.BoundedLinearLayout>
+
+  <org.chromium.components.browser_ui.widget.BoundedLinearLayout
+      android:id="@+id/privacy_policy_view"
+      android:layout_width="match_parent"
+      android:layout_height="match_parent"
+      android:orientation="vertical"
+      android:visibility="gone">
+
+    <LinearLayout
+        android:id="@+id/privacy_policy_header"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:padding="16dp"
+        android:paddingStart="12dp"
+        android:gravity="center_vertical"
+        android:background="@macro/default_bg_color">
+
+      <org.chromium.ui.widget.ChromeImageButton
+          android:id="@+id/privacy_policy_back_button"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:src="@drawable/ic_arrow_back"
+          android:background="?attr/selectableItemBackgroundBorderless"
+          android:contentDescription="@string/privacy_sandbox_privacy_policy_back_button"
+          android:padding="12dp" />
+
+      <TextView
+          android:id="@+id/privacy_policy_title"
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:text="@string/privacy_sandbox_privacy_policy_page_title"
+          android:layout_marginStart="12dp"
+          style="@style/TextAppearance.Headline.Primary" />
+    </LinearLayout>
+
+    <FrameLayout
+        android:id="@+id/privacy_policy_content"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+  </org.chromium.components.browser_ui.widget.BoundedLinearLayout>
+</LinearLayout>
diff --git a/chrome/browser/privacy_sandbox/android/java/res/values/dimens.xml b/chrome/browser/privacy_sandbox/android/java/res/values/dimens.xml
index 17e5090..8f58bc1 100644
--- a/chrome/browser/privacy_sandbox/android/java/res/values/dimens.xml
+++ b/chrome/browser/privacy_sandbox/android/java/res/values/dimens.xml
@@ -8,20 +8,21 @@
 <resources>
   <dimen name="privacy_sandbox_dialog_illustration_margin_top">32dp</dimen>
   <dimen name="privacy_sandbox_dialog_logo_margin">8dp</dimen>
-  <dimen name="privacy_sandbox_dialog_eea_dialog_logo_vertical_margin">16dp</dimen>
+  <dimen name="privacy_sandbox_dialog_dialog_logo_vertical_margin">16dp</dimen>
   <dimen name="privacy_sandbox_dialog_illustration_margin_vertical">16dp</dimen>
   <dimen name="privacy_sandbox_dialog_max_width">600dp</dimen>
+  <dimen name="privacy_sandbox_dialog_max_landscape_width">880dp</dimen>
   <dimen name="privacy_sandbox_consent_button_margin_between">8dp</dimen>
   <dimen name="privacy_sandbox_notice_dialog_dropdown_button_height">48dp</dimen>
   <dimen name="privacy_sandbox_notice_margin_bottom">32dp</dimen>
   <dimen name="privacy_sandbox_dialog_title_margin">20dp</dimen>
   <dimen name="privacy_sandbox_chrome_logo_width">40dp</dimen>
   <dimen name="privacy_sandbox_chrome_logo_height">40dp</dimen>
-  <dimen name="privacy_sandbox_eea_dialog_logo_width">72dp</dimen>
-  <dimen name="privacy_sandbox_eea_dialog_logo_height">72dp</dimen>
+  <dimen name="privacy_sandbox_dialog_logo_width">72dp</dimen>
+  <dimen name="privacy_sandbox_dialog_logo_height">72dp</dimen>
   <dimen name="privacy_sandbox_card_logo_width">24dp</dimen>
   <dimen name="privacy_sandbox_card_logo_height">24dp</dimen>
-  <dimen name="privacy_sandbox_consent_dropdown_button_height_v3">20dp</dimen>
+  <dimen name="privacy_sandbox_dropdown_button_height_v3">20dp</dimen>
   <dimen name="privacy_sandbox_margin_between_cards">8dp</dimen>
   <dimen name="privacy_sandbox_card_padding">16dp</dimen>
   <dimen name="privacy_sandbox_card_text_start_margin">8dp</dimen>
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogV3.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogV3.java
index e6343ad..d7c70bd 100644
--- a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogV3.java
+++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogV3.java
@@ -10,6 +10,7 @@
 import android.text.method.LinkMovementMethod;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.FrameLayout;
 import android.widget.LinearLayout;
 import android.widget.ScrollView;
@@ -98,6 +99,7 @@
 
     // TODO(crbug.com/392943234): Update the constructor to accept a layoutRes required for the
     // dialog.
+    // TODO(crbug.com/392943234): Write a java doc that defines the IDS this dialog expects.
     public PrivacySandboxDialogV3(
             Activity activity,
             Profile profile,
@@ -112,43 +114,67 @@
         mSurfaceType = surfaceType;
 
         fetchDialogContent(activity);
+        mScrollView = mContentView.findViewById(R.id.privacy_sandbox_dialog_scroll_view);
         mOnClickListener = getOnClickListener();
         registerDialogButtons();
         registerDropdownElements(activity);
         registerPrivacyPolicy(profile, activityWindowAndroid);
+        setOnShowListener(this);
+        setCancelable(false);
+    }
 
-        mScrollView = mContentView.findViewById(R.id.privacy_sandbox_dialog_scroll_view);
+    private void registerScrollViewListeners() {
+        mShouldShowActionButtons = false;
+        mScrollView.addOnLayoutChangeListener(
+                new View.OnLayoutChangeListener() {
+                    @Override
+                    public void onLayoutChange(
+                            View v,
+                            int left,
+                            int top,
+                            int right,
+                            int bottom,
+                            int oldLeft,
+                            int oldTop,
+                            int oldRight,
+                            int oldBottom) {
+                        // Only update button visibility if the main dialog is visible.
+                        if (mViewContainer.getVisibility() != View.VISIBLE) {
+                            return;
+                        }
+                        // Wait for the scroll view to fully load before updating button visibility.
+                        mScrollView.post(
+                                () -> {
+                                    updateButtonVisibility();
+                                });
+                    }
+                });
         mScrollView
                 .getViewTreeObserver()
                 .addOnScrollChangedListener(
                         () -> {
                             if (!canScrollVerticallyDown()) {
                                 setMoreButtonVisibility(View.GONE);
-                                mActionButtons.setVisibility(View.VISIBLE);
-                                // Set the flag to always show the action buttons if we re-render.
-                                mShouldShowActionButtons = true;
+                                setActionButtonsVisibility(View.VISIBLE);
                                 mScrollView.post(
                                         () -> {
+                                            // Ensure we're at the very bottom of the scroll view.
                                             mScrollView.pageScroll(ScrollView.FOCUS_DOWN);
                                         });
                             }
                         });
-
-        setOnShowListener(this);
-        setCancelable(false);
     }
 
     private void updateButtonVisibility() {
         // Display the action buttons if we've displayed it before or if we cannot scroll vertically
         // down (we've hit the end of the dialog).
         if (mShouldShowActionButtons || !canScrollVerticallyDown()) {
-            mShouldShowActionButtons = true;
             setMoreButtonVisibility(View.GONE);
-            mActionButtons.setVisibility(View.VISIBLE);
+            setActionButtonsVisibility(View.VISIBLE);
         } else {
             // Handle the case where we can still scroll down - display the `More` button.
             setMoreButtonVisibility(View.VISIBLE);
-            mActionButtons.setVisibility(View.GONE);
+            setActionButtonsVisibility(View.GONE);
         }
     }
 
@@ -158,6 +184,15 @@
         mBottomFade.setVisibility(visibility);
     }
 
+    private void setActionButtonsVisibility(int visibility) {
+        mActionButtons.setVisibility(visibility);
+        if (mActionButtons.getVisibility() == View.VISIBLE) {
+            mShouldShowActionButtons = true;
+            // Zero out the padding for the scroll view content if any was applied.
+            mScrollView.getChildAt(0).setPadding(0, 0, 0, 0);
+        }
+    }
+
     private void fetchDialogContent(Context context) {
         // TODO(crbug.com/392943234): Update function to accept the Layoutres and remove the switch
         // statement.
@@ -172,6 +207,8 @@
                 contentToInflate = R.layout.privacy_sandbox_notice_eea_v3;
                 break;
             case PrivacySandboxDialogType.ROW_NOTICE:
+                contentToInflate = R.layout.privacy_sandbox_notice_row_v3;
+                break;
             case PrivacySandboxDialogType.RESTRICTED_NOTICE:
             default:
                 // TODO(crbug.com/392943234): Don't default to the eea consent
@@ -326,6 +363,9 @@
     private void createPrivacyPolicyLink(
             Profile profile, ActivityWindowAndroid activityWindowAndroid) {
         mLearnMoreText = mContentView.findViewById(mLearnMoreTextIdRes);
+        if (mLearnMoreText == null) {
+            return;
+        }
         mLearnMoreText.setText(
                 SpanApplier.applySpans(
                         getContext().getString(mLearnMoreLinkString),
@@ -417,9 +457,53 @@
         }
     }
 
+    private void initButtonState() {
+        setMoreButtonVisibility(View.VISIBLE);
+        mActionButtons.setVisibility(View.GONE);
+        // Don't need to check for padding if content is already scrollable.
+        if (canScrollVerticallyDown()) {
+            registerScrollViewListeners();
+            return;
+        }
+        mActionButtons.setVisibility(View.INVISIBLE);
+        // Wait until the action buttons have been updated.
+        mActionButtons.post(
+                () -> {
+                    mScrollView.post(
+                            () -> {
+                                // If we can scroll down this indicates that showing the action
+                                // buttons will resize the scrollview to be scrollable.
+                                if (canScrollVerticallyDown()) {
+                                    View dialog =
+                                            mContentView.findViewById(R.id.privacy_sandbox_dialog);
+                                    ViewGroup scrollViewChild =
+                                            (ViewGroup) mScrollView.getChildAt(0);
+                                    View lastElementView =
+                                            scrollViewChild.getChildAt(
+                                                    scrollViewChild.getChildCount() - 1);
+                                    // The amount of pixels from the bottom of the last element in
+                                    // the dialog to the bottom of the dialog.
+                                    int pixelsPaddingToMakeScrollable =
+                                            dialog.getBottom() - lastElementView.getBottom();
+                                    // Add padding to make the scroll view scrollable.
+                                    mScrollView
+                                            .getChildAt(0)
+                                            .setPadding(
+                                                    /* left= */ 0,
+                                                    /* top= */ 0,
+                                                    /* right= */ 0,
+                                                    /* bottom= */ pixelsPaddingToMakeScrollable);
+                                }
+                                mActionButtons.setVisibility(View.GONE);
+                                // Start listening to render changes only after the initial render.
+                                registerScrollViewListeners();
+                            });
+                });
+    }
+
     @Override
     public void onShow(DialogInterface dialogInterface) {
-        updateButtonVisibility();
+        initButtonState();
     }
 
     @Override
diff --git a/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogV3Test.java b/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogV3Test.java
index 359fad16..af63f14a 100644
--- a/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogV3Test.java
+++ b/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogV3Test.java
@@ -75,8 +75,7 @@
     public ChromeRenderTestRule mRenderTestRule =
             ChromeRenderTestRule.Builder.withPublicCorpus()
                     .setBugComponent(ChromeRenderTestRule.Component.UI_BROWSER_PRIVACY_SANDBOX)
-                    .setRevision(2)
-                    .setDescription("Changed feature flag behavior for button equalization")
+                    .setRevision(0)
                     .build();
 
     @Rule public final MockitoRule mockito = MockitoJUnit.rule();
@@ -158,7 +157,7 @@
     @Feature({"RenderTest"})
     public void testRenderEeaConsent() throws IOException {
         launchDialog(PrivacySandboxDialogV3.PrivacySandboxDialogType.EEA_CONSENT);
-        renderViewWithId(R.id.privacy_sandbox_dialog, "privacy_sandbox_dialog_view");
+        renderViewWithId(R.id.privacy_sandbox_dialog, "privacy_sandbox_eea_consent");
     }
 
     @Test
@@ -166,7 +165,15 @@
     @Feature({"RenderTest"})
     public void testRenderEeaNotice() throws IOException {
         launchDialog(PrivacySandboxDialogV3.PrivacySandboxDialogType.EEA_NOTICE);
-        renderViewWithId(R.id.privacy_sandbox_dialog, "privacy_sandbox_dialog_view");
+        renderViewWithId(R.id.privacy_sandbox_dialog, "privacy_sandbox_eea_notice");
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"RenderTest"})
+    public void testRenderRowNotice() throws IOException {
+        launchDialog(PrivacySandboxDialogV3.PrivacySandboxDialogType.ROW_NOTICE);
+        renderViewWithId(R.id.privacy_sandbox_dialog, "privacy_sandbox_row_notice");
     }
 
     @Test
@@ -176,7 +183,8 @@
         // Expands the dropdown element.
         launchDialog(PrivacySandboxDialogV3.PrivacySandboxDialogType.EEA_CONSENT);
         onView(withId(R.id.dropdown_element)).inRoot(isDialog()).perform(scrollTo(), click());
-        renderViewWithId(R.id.privacy_sandbox_dialog, "dropdown_container");
+        renderViewWithId(
+                R.id.privacy_sandbox_dialog, "privacy_sandbox_eea_consent_dropdown_container");
     }
 
     @Test
@@ -186,7 +194,8 @@
         // Expands the dropdown element.
         launchDialog(PrivacySandboxDialogV3.PrivacySandboxDialogType.EEA_NOTICE);
         onView(withId(R.id.dropdown_element)).inRoot(isDialog()).perform(scrollTo(), click());
-        renderViewWithId(R.id.privacy_sandbox_dialog, "dropdown_container");
+        renderViewWithId(
+                R.id.privacy_sandbox_dialog, "privacy_sandbox_eea_notice_dropdown_container");
     }
 
     @Test
@@ -220,6 +229,8 @@
         onView(withId(R.id.ack_button)).check(matches(withEffectiveVisibility(VISIBLE)));
     }
 
+    // TODO(crbug.com/392943234): Add a test for the padding logic for the initial button state.
+
     @Test
     @SmallTest
     public void testEeaNoticeFullyShownHidesMoreButton() {
@@ -253,6 +264,37 @@
 
     @Test
     @SmallTest
+    public void testRowNoticeFullyShownHidesMoreButton() {
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> {
+                    if (mDialog != null) {
+                        mDialog.dismiss();
+                        mDialog = null;
+                    }
+                    mDialog =
+                            new PrivacySandboxDialogV3(
+                                    sActivityTestRule.getActivity(),
+                                    sActivityTestRule.getProfile(false),
+                                    sActivityTestRule.getActivity().getWindowAndroid(),
+                                    SurfaceType.BR_APP,
+                                    PrivacySandboxDialogV3.PrivacySandboxDialogType.ROW_NOTICE);
+                    // Resize the window such that we see the entire notice without scrolling.
+                    // Note that we're picking an arbitrary height value that should capture all the
+                    // content.
+                    mDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, 50000);
+                    mDialog.show();
+                });
+        onViewWaiting(withId(R.id.privacy_sandbox_dialog), true);
+        // Verify the more button and the fade are not shown.
+        onView(withId(R.id.more_button)).check(matches(withEffectiveVisibility(GONE)));
+        onView(withId(R.id.bottom_fade)).check(matches(withEffectiveVisibility(GONE)));
+        // Verify that the action buttons are shown.
+        onView(withId(R.id.settings_button)).check(matches(withEffectiveVisibility(VISIBLE)));
+        onView(withId(R.id.ack_button)).check(matches(withEffectiveVisibility(VISIBLE)));
+    }
+
+    @Test
+    @SmallTest
     public void testEeaConsentActionButtonsAreShown() {
         launchDialog(PrivacySandboxDialogV3.PrivacySandboxDialogType.EEA_CONSENT);
         clickMoreButtonAndScrollToBottomIfNeeded();
@@ -561,4 +603,60 @@
         onView(withId(R.id.privacy_sandbox_notice_title)).inRoot(isDialog()).perform(scrollTo());
         onView(withId(R.id.action_buttons)).inRoot(isDialog()).check(matches(isDisplayed()));
     }
+
+    @Test
+    @SmallTest
+    public void testRowNoticeActionButtonsAreShown() {
+        launchDialog(PrivacySandboxDialogV3.PrivacySandboxDialogType.ROW_NOTICE);
+        clickMoreButtonAndScrollToBottomIfNeeded();
+        // Verify action buttons are shown
+        onView(withId(R.id.settings_button)).check(matches(isDisplayed()));
+        onView(withId(R.id.ack_button)).check(matches(isDisplayed()));
+    }
+
+    @Test
+    @SmallTest
+    public void testRowNoticeAcceptButtonDismissesDialog() {
+        launchDialog(PrivacySandboxDialogV3.PrivacySandboxDialogType.ROW_NOTICE);
+        onView(withId(R.id.privacy_sandbox_notice_title)).check(matches(isDisplayed()));
+        clickMoreButtonAndScrollToBottomIfNeeded();
+        onViewWaiting(withId(R.id.ack_button), true);
+        onView(withId(R.id.ack_button)).inRoot(isDialog()).perform(click());
+        onView(withId(R.id.privacy_sandbox_notice_title)).check(doesNotExist());
+    }
+
+    @Test
+    @SmallTest
+    public void testRowNoticeSettingsButtonDismissesDialogAndOpensSettingsPage() {
+        launchDialog(PrivacySandboxDialogV3.PrivacySandboxDialogType.ROW_NOTICE);
+        onView(withId(R.id.privacy_sandbox_notice_title)).check(matches(isDisplayed()));
+        clickMoreButtonAndScrollToBottomIfNeeded();
+        onViewWaiting(withId(R.id.settings_button), true);
+        onView(withId(R.id.settings_button)).inRoot(isDialog()).perform(click());
+        onView(withId(R.id.privacy_sandbox_notice_title)).check(doesNotExist());
+        Mockito.verify(mSettingsNavigation)
+                .startSettings(
+                        any(Context.class),
+                        eq(PrivacySandboxSettingsFragment.class),
+                        any(Bundle.class));
+    }
+
+    @Test
+    @SmallTest
+    public void testRowNoticeActionButtonsAreSticky() {
+        launchDialog(PrivacySandboxDialogV3.PrivacySandboxDialogType.ROW_NOTICE);
+        clickMoreButtonAndScrollToBottomIfNeeded();
+        // Verify action buttons are shown
+        onView(withId(R.id.settings_button)).check(matches(isDisplayed()));
+        onView(withId(R.id.ack_button)).check(matches(isDisplayed()));
+        // Scroll back to the top (logo) since this contents of this dialog is short.
+        onView(withId(R.id.privacy_sandbox_notice_logo)).inRoot(isDialog()).perform(scrollTo());
+        onView(withId(R.id.privacy_sandbox_notice_logo)).check(matches(isDisplayed()));
+        // Verify the more button and fade are not displayed.
+        onView(withId(R.id.more_button)).check(matches(not(isDisplayed())));
+        onView(withId(R.id.bottom_fade)).check(matches(not(isDisplayed())));
+        // Verify action buttons are shown
+        onView(withId(R.id.settings_button)).check(matches(isDisplayed()));
+        onView(withId(R.id.ack_button)).check(matches(isDisplayed()));
+    }
 }
diff --git a/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h b/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h
index 911f958..8995e72 100644
--- a/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h
+++ b/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h
@@ -9,10 +9,13 @@
 
 #include "chrome/browser/privacy_sandbox/mock_queue_manager.h"
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_countries.h"
-#include "chrome/browser/privacy_sandbox/privacy_sandbox_queue_manager.h"
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_service.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
+#if !BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/privacy_sandbox/privacy_sandbox_queue_manager.h"
+#endif  // !BUILDFLAG(IS_ANDROID)
+
 namespace content {
 class BrowserContext;
 }
diff --git a/chrome/browser/privacy_sandbox/notice/OWNERS b/chrome/browser/privacy_sandbox/notice/OWNERS
new file mode 100644
index 0000000..08850f4
--- /dev/null
+++ b/chrome/browser/privacy_sandbox/notice/OWNERS
@@ -0,0 +1,2 @@
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chrome/browser/privacy_sandbox/notice/notice_model.cc b/chrome/browser/privacy_sandbox/notice/notice_model.cc
index 32c6bf1..92971fca 100644
--- a/chrome/browser/privacy_sandbox/notice/notice_model.cc
+++ b/chrome/browser/privacy_sandbox/notice/notice_model.cc
@@ -4,11 +4,8 @@
 
 #include "chrome/browser/privacy_sandbox/notice/notice_model.h"
 
-#include "base/containers/adapters.h"
 #include "components/privacy_sandbox/privacy_sandbox_notice_storage.h"
 
-class PrefService;
-
 namespace privacy_sandbox {
 
 using notice::mojom::PrivacySandboxNoticeEvent;
@@ -48,8 +45,7 @@
   }
 }
 
-bool NoticeApi::IsFulfilled(PrivacySandboxNoticeStorage* notice_storage,
-                            PrefService* pref_service) {
+bool NoticeApi::IsFulfilled() {
   EligibilityLevel eligibility = GetEligibilityLevel();
 
   for (Notice* notice : linked_notices_) {
@@ -57,7 +53,7 @@
         notice->GetNoticeType() == NoticeType::kNotice) {
       continue;
     }
-    return notice->WasFulfilled(notice_storage, pref_service);
+    return notice->WasFulfilled();
   }
   return false;
 }
@@ -102,21 +98,9 @@
   return feature_;
 }
 
-bool Notice::WasFulfilled(PrivacySandboxNoticeStorage* notice_storage,
-                          PrefService* pref_service) {
-  auto notice_data =
-      notice_storage->ReadNoticeData(pref_service, GetFeature()->name);
-  if (!notice_data.has_value()) {
-    return false;
-  }
-
-  const auto notice_events = notice_data->GetNoticeEvents();
-  for (const auto& notice_event : base::Reversed(notice_events)) {
-    if (IsFulfillmentEvent(notice_event.first)) {
-      return true;
-    }
-  }
-
+bool Notice::WasFulfilled() {
+  // TODO(crbug.com/392612108): Check if an action was taken on this notice, if
+  // it was check if it was one of the fulfillment actions.
   return false;
 }
 
diff --git a/chrome/browser/privacy_sandbox/notice/notice_model.h b/chrome/browser/privacy_sandbox/notice/notice_model.h
index a6d1076..6f587fa 100644
--- a/chrome/browser/privacy_sandbox/notice/notice_model.h
+++ b/chrome/browser/privacy_sandbox/notice/notice_model.h
@@ -11,10 +11,9 @@
 #include "components/privacy_sandbox/privacy_sandbox_notice.mojom.h"
 #include "components/privacy_sandbox/privacy_sandbox_notice_storage.h"
 
-class PrefService;
-
 namespace privacy_sandbox {
 class NoticeApi;
+
 // Types of notices that can be shown.
 enum class NoticeType {
   kNotice,   // This type of notice requires a user to have acknowledged it.
@@ -56,9 +55,7 @@
   Notice* SetPreReqApis(const std::vector<NoticeApi*>& apis);
   Notice* SetFeature(const base::Feature* feature);
 
-  // Return true if the notice had a fulfillment action taken on it.
-  bool WasFulfilled(PrivacySandboxNoticeStorage* notice_storage,
-                    PrefService* pref_service);
+  bool WasFulfilled();
 
   // Accessors.
   const std::vector<raw_ptr<NoticeApi>>& GetTargetApis();
@@ -132,8 +129,7 @@
   void CanBeFulfilledBy(Notice* notice);
 
   // Returns whether the api was fulfilled.
-  bool IsFulfilled(PrivacySandboxNoticeStorage* notice_storage,
-                   PrefService* pref_service);
+  bool IsFulfilled();
 
   // Callbacks.
   NoticeApi* SetEligibilityCallback(
diff --git a/chrome/browser/privacy_sandbox/notice/notice_model_unittest.cc b/chrome/browser/privacy_sandbox/notice/notice_model_unittest.cc
index 94190559..e26ff57 100644
--- a/chrome/browser/privacy_sandbox/notice/notice_model_unittest.cc
+++ b/chrome/browser/privacy_sandbox/notice/notice_model_unittest.cc
@@ -5,14 +5,8 @@
 #include "chrome/browser/privacy_sandbox/notice/notice_model.h"
 
 #include "base/test/mock_callback.h"
-#include "base/test/scoped_feature_list.h"
-#include "base/test/task_environment.h"
 #include "chrome/browser/privacy_sandbox/notice/notice_features.h"
-#include "chrome/browser/privacy_sandbox/notice/notice_model.h"
-#include "components/prefs/scoped_user_pref_update.h"
-#include "components/prefs/testing_pref_service.h"
 #include "components/privacy_sandbox/privacy_sandbox_notice.mojom.h"
-#include "components/privacy_sandbox/privacy_sandbox_notice_storage.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest-death-test.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -34,17 +28,7 @@
 
 class NoticeTest : public testing::Test {
  public:
-  NoticeTest()
-      : catalog_(std::make_unique<NoticeCatalog>()),
-        task_env_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
-    PrivacySandboxNoticeStorage::RegisterProfilePrefs(prefs()->registry());
-  }
-
-  TestingPrefServiceSimple* prefs() { return &prefs_; }
-
-  PrivacySandboxNoticeStorage* notice_storage() {
-    return notice_storage_.get();
-  }
+  NoticeTest() : catalog_(std::make_unique<NoticeCatalog>()) {}
 
   Notice* RegisterAndRetrieveNotice(PrivacySandboxNotice notice) {
     return catalog_->RegisterAndRetrieveNewNotice(
@@ -60,9 +44,6 @@
 
  private:
   std::unique_ptr<NoticeCatalog> catalog_;
-  TestingPrefServiceSimple prefs_;
-  base::test::TaskEnvironment task_env_;
-  std::unique_ptr<PrivacySandboxNoticeStorage> notice_storage_;
 };
 
 TEST_F(NoticeTest, NoticeIsFulfillmentEventCorrect) {
@@ -91,122 +72,17 @@
   EXPECT_EQ(api->GetEligibilityLevel(), EligibilityLevel::kNotEligible);
 }
 
-TEST_F(NoticeTest, VerifyWasFulfilledRetFalseNoPrefs) {
-  Notice* notice =
-      notice_catalog()
-          ->RegisterAndRetrieveNewNotice(
-              &Make<Notice>,
-              {PrivacySandboxNotice::kProtectedAudienceMeasurementNotice,
-               SurfaceType::kDesktopNewTab})
-          ->SetFeature(&kProtectedAudienceMeasurementNoticeModalFeature);
-
-  EXPECT_FALSE(notice->WasFulfilled(notice_storage(), prefs()));
-}
-
-TEST_F(NoticeTest, VerifyWasFulfilledRetFalseInvalidAction) {
-  Notice* notice =
-      notice_catalog()
-          ->RegisterAndRetrieveNewNotice(
-              &Make<Notice>,
-              {PrivacySandboxNotice::kProtectedAudienceMeasurementNotice,
-               SurfaceType::kDesktopNewTab})
-          ->SetFeature(&kProtectedAudienceMeasurementNoticeModalFeature);
-
-  notice_storage()->SetNoticeShown(
-      prefs(), notice->GetFeature()->name,
-      base::Time::FromMillisecondsSinceUnixEpoch(100));
-  notice_storage()->SetNoticeActionTaken(
-      prefs(), notice->GetFeature()->name, PrivacySandboxNoticeEvent::kOptIn,
-      base::Time::FromMillisecondsSinceUnixEpoch(200));
-
-  EXPECT_FALSE(notice->WasFulfilled(notice_storage(), prefs()));
-}
-
-TEST_F(NoticeTest, VerifyWasFulfilledRetTrue) {
-  Notice* notice =
-      notice_catalog()
-          ->RegisterAndRetrieveNewNotice(
-              &Make<Notice>,
-              {PrivacySandboxNotice::kProtectedAudienceMeasurementNotice,
-               SurfaceType::kDesktopNewTab})
-          ->SetFeature(&kProtectedAudienceMeasurementNoticeModalFeature);
-
-  notice_storage()->SetNoticeShown(
-      prefs(), notice->GetFeature()->name,
-      base::Time::FromMillisecondsSinceUnixEpoch(100));
-  notice_storage()->SetNoticeActionTaken(
-      prefs(), notice->GetFeature()->name, PrivacySandboxNoticeEvent::kAck,
-      base::Time::FromMillisecondsSinceUnixEpoch(200));
-
-  EXPECT_TRUE(notice->WasFulfilled(notice_storage(), prefs()));
-}
-
-TEST_F(NoticeTest, VerifyWasFulfilledRetTrueMultipleActions) {
-  Notice* notice =
-      notice_catalog()
-          ->RegisterAndRetrieveNewNotice(
-              &Make<Notice>,
-              {PrivacySandboxNotice::kProtectedAudienceMeasurementNotice,
-               SurfaceType::kDesktopNewTab})
-          ->SetFeature(&kProtectedAudienceMeasurementNoticeModalFeature);
-
-  notice_storage()->SetNoticeShown(
-      prefs(), notice->GetFeature()->name,
-      base::Time::FromMillisecondsSinceUnixEpoch(100));
-  notice_storage()->SetNoticeActionTaken(
-      prefs(), notice->GetFeature()->name, PrivacySandboxNoticeEvent::kAck,
-      base::Time::FromMillisecondsSinceUnixEpoch(200));
-  notice_storage()->SetNoticeShown(
-      prefs(), notice->GetFeature()->name,
-      base::Time::FromMillisecondsSinceUnixEpoch(250));
-  notice_storage()->SetNoticeActionTaken(
-      prefs(), notice->GetFeature()->name, PrivacySandboxNoticeEvent::kOptIn,
-      base::Time::FromMillisecondsSinceUnixEpoch(300));
-
-  EXPECT_TRUE(notice->WasFulfilled(notice_storage(), prefs()));
-}
-
-TEST_F(NoticeTest, VerifyWasFulfilledRetTrueEndsWithShown) {
-  Notice* notice =
-      notice_catalog()
-          ->RegisterAndRetrieveNewNotice(
-              &Make<Notice>,
-              {PrivacySandboxNotice::kProtectedAudienceMeasurementNotice,
-               SurfaceType::kDesktopNewTab})
-          ->SetFeature(&kProtectedAudienceMeasurementNoticeModalFeature);
-
-  notice_storage()->SetNoticeShown(
-      prefs(), notice->GetFeature()->name,
-      base::Time::FromMillisecondsSinceUnixEpoch(100));
-  notice_storage()->SetNoticeActionTaken(
-      prefs(), notice->GetFeature()->name, PrivacySandboxNoticeEvent::kAck,
-      base::Time::FromMillisecondsSinceUnixEpoch(200));
-  notice_storage()->SetNoticeShown(
-      prefs(), notice->GetFeature()->name,
-      base::Time::FromMillisecondsSinceUnixEpoch(250));
-
-  EXPECT_TRUE(notice->WasFulfilled(notice_storage(), prefs()));
-}
-
 TEST_F(NoticeTest, SetEligibilityCallbackReturnsNoticeEligibilitySuccessfully) {
   NoticeApi* api =
       notice_catalog()->RegisterAndRetrieveNewApi()->SetEligibilityCallback(
           base::BindRepeating([]() -> EligibilityLevel {
             return EligibilityLevel::kEligibleNotice;
           }));
-  Notice* notice =
-      RegisterAndRetrieveNotice(
-          PrivacySandboxNotice::kProtectedAudienceMeasurementNotice)
-          ->SetTargetApis({api})
-          ->SetFeature(&kProtectedAudienceMeasurementNoticeModalFeature);
-
-  notice_storage()->SetNoticeShown(
-      prefs(), notice->GetFeature()->name,
-      base::Time::FromMillisecondsSinceUnixEpoch(100));
-  notice_storage()->SetNoticeActionTaken(
-      prefs(), notice->GetFeature()->name, PrivacySandboxNoticeEvent::kAck,
-      base::Time::FromMillisecondsSinceUnixEpoch(200));
-  EXPECT_TRUE(api->IsFulfilled(notice_storage(), prefs()));
+  RegisterAndRetrieveNotice(PrivacySandboxNotice::kTopicsConsentNotice)
+      ->SetTargetApis({api});
+  // TODO(crbug.com/392612108): Once WasFulfilled is implemented, change this
+  // value.
+  EXPECT_FALSE(api->IsFulfilled());
 }
 
 TEST_F(NoticeTest,
@@ -216,19 +92,11 @@
           base::BindRepeating([]() -> EligibilityLevel {
             return EligibilityLevel::kEligibleConsent;
           }));
-  Notice* notice =
-      RegisterAndRetrieveConsent(PrivacySandboxNotice::kTopicsConsentNotice)
-          ->SetTargetApis({api})
-          ->SetFeature(&kProtectedAudienceMeasurementNoticeModalFeature);
-
-  notice_storage()->SetNoticeShown(
-      prefs(), notice->GetFeature()->name,
-      base::Time::FromMillisecondsSinceUnixEpoch(100));
-  notice_storage()->SetNoticeActionTaken(
-      prefs(), notice->GetFeature()->name, PrivacySandboxNoticeEvent::kOptIn,
-      base::Time::FromMillisecondsSinceUnixEpoch(200));
-
-  EXPECT_TRUE(api->IsFulfilled(notice_storage(), prefs()));
+  RegisterAndRetrieveConsent(PrivacySandboxNotice::kTopicsConsentNotice)
+      ->SetTargetApis({api});
+  // TODO(crbug.com/392612108): Once WasFulfilled is implemented, change this
+  // value.
+  EXPECT_FALSE(api->IsFulfilled());
 }
 
 TEST_F(NoticeTest, ConsentEligibilityWithNoticeTypeReturnsNotFulfilled) {
@@ -237,20 +105,11 @@
           base::BindRepeating([]() -> EligibilityLevel {
             return EligibilityLevel::kEligibleConsent;
           }));
-  Notice* notice =
-      RegisterAndRetrieveNotice(
-          PrivacySandboxNotice::kProtectedAudienceMeasurementNotice)
-          ->SetTargetApis({api})
-          ->SetFeature(&kProtectedAudienceMeasurementNoticeModalFeature);
-
-  notice_storage()->SetNoticeShown(
-      prefs(), notice->GetFeature()->name,
-      base::Time::FromMillisecondsSinceUnixEpoch(100));
-  notice_storage()->SetNoticeActionTaken(
-      prefs(), notice->GetFeature()->name, PrivacySandboxNoticeEvent::kOptIn,
-      base::Time::FromMillisecondsSinceUnixEpoch(200));
-
-  EXPECT_FALSE(api->IsFulfilled(notice_storage(), prefs()));
+  RegisterAndRetrieveNotice(PrivacySandboxNotice::kTopicsConsentNotice)
+      ->SetTargetApis({api});
+  // TODO(crbug.com/392612108): Once WasFulfilled is implemented, change this
+  // value.
+  EXPECT_FALSE(api->IsFulfilled());
 }
 
 class ResultCallbackTest
@@ -369,6 +228,7 @@
 
 TEST_F(NoticeCatalogNoticeTest,
        VerifyFeatureSetCorrectlyDuringNoticeGroupRegistration) {
+  NoticeCatalog catalog;
   NoticeApi* target_api = notice_catalog()->RegisterAndRetrieveNewApi();
 
   notice_catalog()->RegisterNoticeGroup(
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
index c6db1b92..e6b07c2 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
@@ -11,7 +11,6 @@
 #include "base/memory/raw_ptr.h"
 #include "chrome/browser/first_party_sets/first_party_sets_policy_service.h"
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_countries.h"
-#include "chrome/browser/privacy_sandbox/privacy_sandbox_queue_manager.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/prefs/pref_change_registrar.h"
@@ -23,6 +22,10 @@
 #include "content/public/browser/interest_group_manager.h"
 #include "net/base/schemeful_site.h"
 
+#if !BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/privacy_sandbox/privacy_sandbox_queue_manager.h"
+#endif  // !BUILDFLAG(IS_ANDROID)
+
 class Browser;
 
 namespace views {
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl.cc
index 2c418d3..18cf47b 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl.cc
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl.cc
@@ -24,7 +24,6 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_countries.h"
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_notice_confirmation.h"
-#include "chrome/browser/privacy_sandbox/privacy_sandbox_queue_manager.h"
 #include "chrome/browser/privacy_sandbox/profile_bucket_metrics.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
@@ -66,6 +65,7 @@
 #include "ui/base/l10n/l10n_util.h"
 
 #if !BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/privacy_sandbox/privacy_sandbox_queue_manager.h"
 #include "ui/views/widget/widget.h"
 #endif  // !BUILDFLAG(IS_ANDROID)
 
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl.h b/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl.h
index e0049e9..9b0689a 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl.h
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl.h
@@ -16,7 +16,6 @@
 #include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
 #include "chrome/browser/first_party_sets/first_party_sets_policy_service.h"
-#include "chrome/browser/privacy_sandbox/privacy_sandbox_queue_manager.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "components/privacy_sandbox/canonical_topic.h"
@@ -30,6 +29,10 @@
 #include "content/public/browser/interest_group_manager.h"
 #include "net/base/schemeful_site.h"
 
+#if !BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/privacy_sandbox/privacy_sandbox_queue_manager.h"
+#endif  // !BUILDFLAG(IS_ANDROID)
+
 class Browser;
 class PrefService;
 
diff --git a/chrome/browser/push_messaging/push_messaging_service_impl.cc b/chrome/browser/push_messaging/push_messaging_service_impl.cc
index fcd8990b..5dc0b3125 100644
--- a/chrome/browser/push_messaging/push_messaging_service_impl.cc
+++ b/chrome/browser/push_messaging/push_messaging_service_impl.cc
@@ -55,6 +55,7 @@
 #include "content/public/browser/child_process_host.h"
 #include "content/public/browser/devtools_background_services_context.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/permission_result.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
@@ -817,7 +818,10 @@
   profile_->GetPermissionController()->RequestPermissionFromCurrentDocument(
       render_frame_host,
       content::PermissionRequestDescription(
-          blink::PermissionType::NOTIFICATIONS, user_gesture),
+          content::PermissionDescriptorUtil::
+              CreatePermissionDescriptorForPermissionType(
+                  blink::PermissionType::NOTIFICATIONS),
+          user_gesture),
       base::BindOnce(&PushMessagingServiceImpl::DoSubscribe,
                      weak_factory_.GetWeakPtr(), std::move(app_identifier),
                      std::move(options), std::move(callback), render_process_id,
diff --git a/chrome/browser/quick_delete/android/junit/src/org/chromium/chrome/browser/quick_delete/QuickDeleteTabsFilterTest.java b/chrome/browser/quick_delete/android/junit/src/org/chromium/chrome/browser/quick_delete/QuickDeleteTabsFilterTest.java
index a4aca56..ac1a03b 100644
--- a/chrome/browser/quick_delete/android/junit/src/org/chromium/chrome/browser/quick_delete/QuickDeleteTabsFilterTest.java
+++ b/chrome/browser/quick_delete/android/junit/src/org/chromium/chrome/browser/quick_delete/QuickDeleteTabsFilterTest.java
@@ -91,6 +91,7 @@
         doReturn(mTabModelMock).when(mTabGroupModelFilterMock).getTabModel();
         when(mTabModelMock.getTabRemover()).thenReturn(mTabRemoverMock);
         when(mTabModelMock.getComprehensiveModel()).thenReturn(mComprehensiveModel);
+        when(mTabModelMock.getProfile()).thenReturn(mProfileMock);
         mQuickDeleteTabsFilter = new QuickDeleteTabsFilter(mTabGroupModelFilterMock);
     }
 
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index 6054374..6835cde 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -2281,6 +2281,11 @@
     return;
   }
 
+  // Disable for glic.
+  if (IsGlicWindow(this, browser_context_)) {
+    return;
+  }
+
   // Only show copy link to highlight for publicly accessible web pages.
   if (!params_.page_url.SchemeIsHTTPOrHTTPS()) {
     return;
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_kk.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_kk.xtb
index 2e456de..e08aee5 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_kk.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_kk.xtb
@@ -1122,7 +1122,7 @@
 <translation id="8428213095426709021">Параметрлер</translation>
 <translation id="8428603554127842284"><ph name="DEPTH" /> деңгейі</translation>
 <translation id="8430049249787218991">mnubr</translation>
-<translation id="8446884382197647889">Толығырақ</translation>
+<translation id="8446884382197647889">Толық ақпарат</translation>
 <translation id="8448196839635577295">Қазір ChromeVox фокусы жоқ. Элементтерді табу үшін "Шолу" түймесін түртіңіз.</translation>
 <translation id="8455868257606149352">Макс <ph name="X" /></translation>
 <translation id="84575901236241018">кіру пернесі бар, <ph name="KEY" /></translation>
diff --git a/chrome/browser/resources/glic/webview.ts b/chrome/browser/resources/glic/webview.ts
index 6db365b9..22b188d 100644
--- a/chrome/browser/resources/glic/webview.ts
+++ b/chrome/browser/resources/glic/webview.ts
@@ -162,6 +162,7 @@
   private onExit(e: any): void {
     if (e.reason !== 'normal') {
       this.destroyHost(WebClientState.ERROR);
+      chrome.metricsPrivate.recordUserAction('GlicSessionWebClientCrash');
       console.warn(`webview exit. reason: ${e.reason}`);
     }
   }
diff --git a/chrome/browser/resources/intro/OWNERS b/chrome/browser/resources/intro/OWNERS
index bc9d09f..c0741e9 100644
--- a/chrome/browser/resources/intro/OWNERS
+++ b/chrome/browser/resources/intro/OWNERS
@@ -1,3 +1 @@
 file://chrome/browser/profiles/OWNERS
-jyammine@google.com
-
diff --git a/chrome/browser/resources/intro/default_browser/OWNERS b/chrome/browser/resources/intro/default_browser/OWNERS
deleted file mode 100644
index f1561d5..0000000
--- a/chrome/browser/resources/intro/default_browser/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-gabolvr@google.com
diff --git a/chrome/browser/resources/management/management_browser_proxy.ts b/chrome/browser/resources/management/management_browser_proxy.ts
index 5760653..a8a6dfb9 100644
--- a/chrome/browser/resources/management/management_browser_proxy.ts
+++ b/chrome/browser/resources/management/management_browser_proxy.ts
@@ -45,6 +45,8 @@
   eolMessage: string;
   eolAdminMessage: string;
   showMonitoredNetworkPrivacyDisclosure: boolean;
+  showWindowsNoticeForDeskSync: boolean;
+  showCookiesNoticeForDeskSync: boolean;
 }
 
 interface ThreatProtectionPermission {
diff --git a/chrome/browser/resources/management/management_ui.html.ts b/chrome/browser/resources/management/management_ui.html.ts
index c48fa116..d7212750 100644
--- a/chrome/browser/resources/management/management_ui.html.ts
+++ b/chrome/browser/resources/management/management_ui.html.ts
@@ -96,6 +96,28 @@
            </div>
          </section>
       </div>
+      ${this.showDeskSyncSection_() ? html`
+        <section class="desk-sync">
+          <h2 class="cr-title-text">$i18n{deskSync}</h2>
+          <div class="subtitle">
+            $i18n{deskSyncDescription}
+          </div>
+          <ul>
+            <li ?hidden="${!this.showWindowsNoticeForDeskSync_}">
+              $i18n{windowSync}
+            </li>
+            <li ?hidden="${!this.showCookiesNoticeForDeskSync_}">
+              $i18n{cookieSync}
+            </li>
+          </ul>
+          <div class="subtitle"
+          .innerHTML="${this.i18nAdvanced('deskSyncOptOut')}">
+          </div>
+          <div class="subtitle"
+          .innerHTML="${this.i18nAdvanced('deskSyncLearnMore')}">
+          </div>
+        </section>
+      ` : ''}
       ${this.showDeviceReportingInfo_() ? html`
         <section>
           <h2 class="cr-title-text">$i18n{deviceReporting}</h2>
diff --git a/chrome/browser/resources/management/management_ui.ts b/chrome/browser/resources/management/management_ui.ts
index 90b3f90..9c06f872 100644
--- a/chrome/browser/resources/management/management_ui.ts
+++ b/chrome/browser/resources/management/management_ui.ts
@@ -111,6 +111,8 @@
       eolAdminMessage_: {type: String},
       eolMessage_: {type: String},
       showMonitoredNetworkPrivacyDisclosure_: {type: Boolean},
+      showWindowsNoticeForDeskSync_: {type: Boolean},
+      showCookiesNoticeForDeskSync_: {type: Boolean},
       // </if>
 
       subtitle_: {type: String},
@@ -142,6 +144,8 @@
   protected accessor eolAdminMessage_: string = '';
   protected accessor eolMessage_: string = '';
   protected accessor showMonitoredNetworkPrivacyDisclosure_: boolean = false;
+  protected accessor showWindowsNoticeForDeskSync_: boolean = false;
+  protected accessor showCookiesNoticeForDeskSync_: boolean = false;
   // </if>
 
   protected accessor subtitle_: string = '';
@@ -306,6 +310,14 @@
   }
 
   /**
+   * @return Whether Desk sync section should be shown.
+   */
+  protected showDeskSyncSection_(): boolean {
+    return this.showWindowsNoticeForDeskSync_ ||
+        this.showCookiesNoticeForDeskSync_;
+  }
+
+  /**
    * @return Whether there are device reporting info to show.
    */
   protected showDeviceReportingInfo_(): boolean {
@@ -474,6 +486,8 @@
       this.eolMessage_ = data.eolMessage;
       this.showMonitoredNetworkPrivacyDisclosure_ =
           data.showMonitoredNetworkPrivacyDisclosure;
+      this.showWindowsNoticeForDeskSync_ = data.showWindowsNoticeForDeskSync;
+      this.showCookiesNoticeForDeskSync_ = data.showCookiesNoticeForDeskSync;
       try {
         // Sanitizing the message could throw an error if it contains non
         // supported markup.
diff --git a/chrome/browser/resources/settings/autofill_page/iban_list_entry.html b/chrome/browser/resources/settings/autofill_page/iban_list_entry.html
index f56d911..084ddcb 100644
--- a/chrome/browser/resources/settings/autofill_page/iban_list_entry.html
+++ b/chrome/browser/resources/settings/autofill_page/iban_list_entry.html
@@ -39,9 +39,9 @@
 <if expr="_google_chrome">
         <picture id="paymentsIcon">
           <source
-              srcset="[[getScaledSrcSet_('chrome://theme/IDR_AUTOFILL_GOOGLE_PAY_DARK_SMALL')]]"
+              srcset="chrome://theme/IDR_AUTOFILL_GOOGLE_PAY_DARK_SMALL"
               media="(prefers-color-scheme: dark)">
-          <img alt="" srcset="[[getScaledSrcSet_('chrome://theme/IDR_AUTOFILL_GOOGLE_PAY_SMALL')]]">
+          <img alt="" src="chrome://theme/IDR_AUTOFILL_GOOGLE_PAY_SMALL">
         </picture>
 </if>
 <if expr="not _google_chrome">
diff --git a/chrome/browser/resources/settings_shared/BUILD.gn b/chrome/browser/resources/settings_shared/BUILD.gn
index 35d0437..9fca5d3d 100644
--- a/chrome/browser/resources/settings_shared/BUILD.gn
+++ b/chrome/browser/resources/settings_shared/BUILD.gn
@@ -38,7 +38,6 @@
   ]
 
   ts_composite = true
-  ts_tsconfig_base = "//tools/typescript/tsconfig_base_polymer_legacy.json"
   ts_definitions = [
     "//tools/typescript/definitions/chrome_event.d.ts",
     "//tools/typescript/definitions/chrome_send.d.ts",
diff --git a/chrome/browser/resources/settings_shared/controls/cr_policy_pref_indicator.ts b/chrome/browser/resources/settings_shared/controls/cr_policy_pref_indicator.ts
index 0c4491b..68541d76 100644
--- a/chrome/browser/resources/settings_shared/controls/cr_policy_pref_indicator.ts
+++ b/chrome/browser/resources/settings_shared/controls/cr_policy_pref_indicator.ts
@@ -72,13 +72,13 @@
     };
   }
 
-  iconAriaLabel: string;
-  indicatorIcon: string;
-  indicatorType: CrPolicyIndicatorType;
-  indicatorTooltip: string;
-  indicatorVisible: boolean;
-  pref?: chrome.settingsPrivate.PrefObject;
-  associatedValue?: any;
+  declare iconAriaLabel: string;
+  declare indicatorIcon: string;
+  declare indicatorType: CrPolicyIndicatorType;
+  declare indicatorTooltip: string;
+  declare indicatorVisible: boolean;
+  declare pref?: chrome.settingsPrivate.PrefObject;
+  declare associatedValue?: any;
 
   /**
    * @return True if the indicator should be shown.
diff --git a/chrome/browser/resources/settings_shared/controls/cr_policy_pref_mixin.ts b/chrome/browser/resources/settings_shared/controls/cr_policy_pref_mixin.ts
index 9879a6c..10fcca0 100644
--- a/chrome/browser/resources/settings_shared/controls/cr_policy_pref_mixin.ts
+++ b/chrome/browser/resources/settings_shared/controls/cr_policy_pref_mixin.ts
@@ -28,8 +28,8 @@
           };
         }
 
-        noExtensionIndicator: boolean;
-        pref: chrome.settingsPrivate.PrefObject;
+        declare noExtensionIndicator: boolean;
+        declare pref: chrome.settingsPrivate.PrefObject;
 
         /**
          * Is the |pref| controlled by something that prevents user control of
diff --git a/chrome/browser/resources/settings_shared/controls/extension_controlled_indicator.ts b/chrome/browser/resources/settings_shared/controls/extension_controlled_indicator.ts
index 2782d05..f1fb167 100644
--- a/chrome/browser/resources/settings_shared/controls/extension_controlled_indicator.ts
+++ b/chrome/browser/resources/settings_shared/controls/extension_controlled_indicator.ts
@@ -31,9 +31,9 @@
     };
   }
 
-  extensionCanBeDisabled: boolean;
-  extensionId: string;
-  extensionName: string;
+  declare extensionCanBeDisabled: boolean;
+  declare extensionId: string;
+  declare extensionName: string;
 
   private getLabel_(): string {
     return loadTimeData.getStringF('controlledByExtension', this.extensionName);
diff --git a/chrome/browser/resources/settings_shared/controls/pref_control_mixin.ts b/chrome/browser/resources/settings_shared/controls/pref_control_mixin.ts
index 5cdff61c..b4a653b 100644
--- a/chrome/browser/resources/settings_shared/controls/pref_control_mixin.ts
+++ b/chrome/browser/resources/settings_shared/controls/pref_control_mixin.ts
@@ -28,7 +28,7 @@
           };
         }
 
-        pref?: chrome.settingsPrivate.PrefObject;
+        declare pref?: chrome.settingsPrivate.PrefObject;
 
         override connectedCallback() {
           super.connectedCallback();
diff --git a/chrome/browser/resources/settings_shared/controls/settings_boolean_control_mixin.ts b/chrome/browser/resources/settings_shared/controls/settings_boolean_control_mixin.ts
index bdaaa33..a073e1c8 100644
--- a/chrome/browser/resources/settings_shared/controls/settings_boolean_control_mixin.ts
+++ b/chrome/browser/resources/settings_shared/controls/settings_boolean_control_mixin.ts
@@ -105,14 +105,14 @@
           return ['prefValueChanged_(pref.value)'];
         }
 
-        inverted: boolean;
-        checked: boolean;
-        disabled: boolean;
-        noSetPref: boolean;
-        label: string;
-        subLabel: string;
-        numericUncheckedValues: number[];
-        numericCheckedValue: number;
+        declare inverted: boolean;
+        declare checked: boolean;
+        declare disabled: boolean;
+        declare noSetPref: boolean;
+        declare label: string;
+        declare subLabel: string;
+        declare numericUncheckedValues: number[];
+        declare numericCheckedValue: number;
 
         notifyChangedByUserInteraction() {
           this.dispatchEvent(new CustomEvent(
diff --git a/chrome/browser/resources/settings_shared/prefs/prefs.ts b/chrome/browser/resources/settings_shared/prefs/prefs.ts
index 751d31bb..d943dee6 100644
--- a/chrome/browser/resources/settings_shared/prefs/prefs.ts
+++ b/chrome/browser/resources/settings_shared/prefs/prefs.ts
@@ -104,7 +104,7 @@
     ];
   }
 
-  prefs: {[key: string]: any}|undefined;
+  declare prefs: {[key: string]: any}|undefined;
 
   /**
    * Map of pref keys to values representing the state of the Chrome
diff --git a/chrome/browser/resources/settings_shared/prefs/prefs_mixin.ts b/chrome/browser/resources/settings_shared/prefs/prefs_mixin.ts
index e0462b79..289a978 100644
--- a/chrome/browser/resources/settings_shared/prefs/prefs_mixin.ts
+++ b/chrome/browser/resources/settings_shared/prefs/prefs_mixin.ts
@@ -28,7 +28,7 @@
           };
         }
 
-        prefs: any;
+        declare prefs: any;
 
         /**
          * Gets the pref at the given prefPath. Throws if the pref is not found.
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.html.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.html.ts
index fc5568b..1068840 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.html.ts
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.html.ts
@@ -7,48 +7,52 @@
 import type {PowerBookmarkRowElement} from './power_bookmark_row.ts';
 
 export function getHtml(this: PowerBookmarkRowElement) {
+  const { id, url, title, children } = this.bookmark || {};
   // clang-format off
   const urlListItem = html`
 <cr-url-list-item id="crUrlListItem"
     role="listitem"
     .size="${this.listItemSize}"
-    .url="${this.bookmark.url}"
-    .imageUrls="${this.getBookmarkImageUrls_()}"
-    .count="${this.bookmark.children?.length}"
-    .title="${this.bookmark.title}"
+    .url="${url}"
+    .imageUrls="${this.getBookmarkImageUrls_(this.bookmark)}"
+    .count="${children?.length}"
+    .title="${title}"
     .description="${this.getBookmarkDescription_(this.bookmark)}"
-    .descriptionMeta="${this.getBookmarkDescriptionMeta_()}"
-    .itemAriaLabel="${this.getBookmarkA11yLabel_()}"
-    .itemAriaDescription="${this.getBookmarkA11yDescription_()}"
+    .descriptionMeta="${this.getBookmarkDescriptionMeta_(this.bookmark)}"
+    .itemAriaLabel="${this.getBookmarkA11yLabel_(url,title)}"
+    .itemAriaDescription="${this.getBookmarkA11yDescription_(this.bookmark)}"
     @click="${this.onRowClicked_}"
     @auxclick="${this.onRowClicked_}"
     @contextmenu="${this.onContextMenu_}"
-    ?force-hover="${this.getBookmarkForceHover_()}">
+    .forceHover="${this.getBookmarkForceHover_(this.bookmark)}">
 
   ${this.hasCheckbox ? html`
     <cr-checkbox id="checkbox" slot="prefix"
         ?checked="${this.isCheckboxChecked_()}"
         @checked-changed="${this.onCheckboxChange_}"
-        ?disabled="${!this.canEdit_()}">
+        ?disabled="${!this.canEdit_(this.bookmark)}">
       $i18n{checkboxA11yLabel}
     </cr-checkbox>` : ''}
 
-  ${this.isRenamingItem_() ? html`
-    <cr-input slot="content" id="input" .value="${this.bookmark.title}"
+  ${this.renamingItem_(id) ? html`
+    <cr-input slot="content" id="input" .value="${title}"
         class="stroked"
         @change="${this.onInputChange_}" @blur="${this.onInputBlur_}"
         @keydown="${this.onInputKeyDown_}"
-        .ariaLabel="${this.getBookmarkA11yLabel_()}"
-        .ariaDescription="${this.getBookmarkA11yDescription_()}">
+        .ariaLabel="${this.getBookmarkA11yLabel_(url,title)}"
+        .ariaDescription="${this.getBookmarkA11yDescription_(this.bookmark)}">
     </cr-input>` : ''}
 
   ${this.showTrailingIcon_() ? html`
     ${this.isPriceTracked ? html`
     <sp-list-item-badge slot="badges"
-        ?was-updated="${this.showDiscountedPrice_()}">
+        ?was-updated="${this.showDiscountedPrice_(this.bookmark)}">
       <cr-icon icon="bookmarks:price-tracking"></cr-icon>
-      <div>${this.getCurrentPrice_(this.bookmark)}</div>
-      <div slot="previous-badge" ?hidden="${!this.showDiscountedPrice_()}">
+      <div>
+        ${this.getCurrentPrice_(this.bookmark)}
+      </div>
+      <div slot="previous-badge"
+          ?hidden="${!this.showDiscountedPrice_(this.bookmark)}">
         ${this.getPreviousPrice_(this.bookmark)}
       </div>
     </sp-list-item-badge>
@@ -56,7 +60,7 @@
     <cr-icon-button slot="suffix" iron-icon="cr:more-vert"
         @click="${this.onTrailingIconClicked_}"
         .title="${this.trailingIconTooltip}"
-        .ariaLabel="${this.getBookmarkMenuA11yLabel_()}">
+        .ariaLabel="${this.getBookmarkMenuA11yLabel_(url, title)}">
     </cr-icon-button>
   ` : ''}
 
@@ -65,14 +69,14 @@
         icon="bookmarks:bookmarks-bar"></cr-icon>
   ` :''}
 
-  ${this.isShoppingCollection_() ? html`
+  ${this.isShoppingCollection_(this.bookmark) ? html`
     <cr-icon slot="folder-icon" icon="bookmarks:shopping-collection">
     </cr-icon>
   ` : ''}
 </cr-url-list-item>`;
 
-  if (this.shouldExpand_()) {
-    return html`
+if (this.shouldExpand_()) {
+  return html`
 <cr-expand-button no-hover id="expandButton"
     collapse-icon="cr:expand-more"
     expand-icon="cr:chevron-right"
@@ -80,32 +84,33 @@
   ${urlListItem}
 </cr-expand-button>
   ${this.toggleExpand ? html`
-    ${this.bookmark.children!.map(item => html`
+    ${children!.map((item: chrome.bookmarks.BookmarkTreeNode)=> html`
       <power-bookmark-row
           id="bookmark-${item.id}"
           .bookmark="${item}"
-          ?compact="${this.compact}"
+          .compact="${this.compact}"
           .depth="${this.depth + 1}"
           trailingIconTooltip="$i18n{tooltipMore}"
-          ?has-checkbox="${this.hasCheckbox}"
+          .hasCheckbox="${this.hasCheckbox}"
           .selectedBookmarks="${this.selectedBookmarks}"
           .renamingId="${this.renamingId}"
           .imageUrls="${this.imageUrls}"
           .shoppingCollectionFolderId="${this.shoppingCollectionFolderId}"
           .bookmarksService="${this.bookmarksService}"
-          .draggable="${String(this.canDrag)}"
-          ?can-drag="${this.canDrag}"
+          .draggable="${this.canDrag}"
+          .can-drag="${this.canDrag}"
           .keyArrowNavigationService="${this.keyArrowNavigationService}"
           .contextMenuBookmark="${this.contextMenuBookmark}">
       </power-bookmark-row>
     `)}`: ''
   }`;
+} else {
+    return html`
+    ${this.compact && this.bookmarksTreeViewEnabled ? html`
+      <div id="bookmark">
+        ${urlListItem}
+      </div>` : urlListItem
+    }`;
   }
-
-  return html`
-    ${this.compact && this.bookmarksTreeViewEnabled ?
-        html`<div id="bookmark">${urlListItem}</div>` :
-        urlListItem
-  }`;
 }
 // clang-format off
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.ts
index 87b839b..deef389 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.ts
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.ts
@@ -74,12 +74,13 @@
     };
   }
 
-  bookmark: chrome.bookmarks.BookmarkTreeNode = {id: '', title: ''};
+  bookmark: chrome.bookmarks.BookmarkTreeNode;
   compact: boolean = false;
   contextMenuBookmark: chrome.bookmarks.BookmarkTreeNode|undefined;
   bookmarksTreeViewEnabled: boolean =
       loadTimeData.getBoolean('bookmarksTreeViewEnabled');
   depth: number = 0;
+  forceHover: boolean = false;
   hasCheckbox: boolean = false;
   selectedBookmarks: chrome.bookmarks.BookmarkTreeNode[];
   renamingId: string = '';
@@ -107,7 +108,7 @@
     this.onInputDisplayChange_();
     this.addEventListener('keydown', this.onKeydown_);
     this.addEventListener('focus', this.onFocus_);
-    this.isPriceTracked = this.isPriceTracked_();
+    this.isPriceTracked = this.isPriceTracked_(this.bookmark);
 
     const callbackRouter = this.priceTrackingProxy_.getCallbackRouter();
     this.shoppingListenerIds_.push(
@@ -237,8 +238,8 @@
     }));
   }
 
-  protected isRenamingItem_(): boolean {
-    return this.bookmark.id === this.renamingId;
+  protected renamingItem_(id: string) {
+    return id === this.renamingId;
   }
 
   protected isCheckboxChecked_(): boolean {
@@ -250,7 +251,7 @@
   }
 
   protected showTrailingIcon_(): boolean {
-    return !this.isRenamingItem_() && !this.hasCheckbox;
+    return !this.renamingItem_(this.bookmark?.id) && !this.hasCheckbox;
   }
 
   protected onExpandedChanged_(event: CustomEvent<{value: boolean}>) {
@@ -290,7 +291,8 @@
     // Ignore clicks on the row when it has an input, to ensure the row doesn't
     // eat input clicks. Also ignore clicks if the row has no associated
     // bookmark, or if the event is a right-click.
-    if (this.isRenamingItem_() || !this.bookmark || event.button === 2) {
+    if (this.renamingItem_(this.bookmark?.id) || !this.bookmark ||
+        event.button === 2) {
       return;
     }
     // In compact view, if the item is a folder, ignore row clicks to toggle
@@ -302,7 +304,7 @@
     }
     event.preventDefault();
     event.stopPropagation();
-    if (this.hasCheckbox && this.canEdit_()) {
+    if (this.hasCheckbox && this.canEdit_(this.bookmark)) {
       // Clicking the row should trigger a checkbox click rather than a
       // standard row click.
       const checkbox =
@@ -412,16 +414,18 @@
     this.dispatchEvent(this.createInputChangeEvent_(null));
   }
 
-  private isPriceTracked_(): boolean {
-    return !!this.bookmarksService?.getPriceTrackedInfo(this.bookmark);
+  private isPriceTracked_(bookmark: chrome.bookmarks.BookmarkTreeNode):
+      boolean {
+    return !!this.bookmarksService?.getPriceTrackedInfo(bookmark);
   }
 
   /**
    * Whether the given price-tracked bookmark should display as if discounted.
    */
-  protected showDiscountedPrice_(): boolean {
+  protected showDiscountedPrice_(bookmark: chrome.bookmarks.BookmarkTreeNode):
+      boolean {
     const bookmarkProductInfo =
-        this.bookmarksService?.getPriceTrackedInfo(this.bookmark);
+        this.bookmarksService?.getPriceTrackedInfo(bookmark);
     if (bookmarkProductInfo) {
       return bookmarkProductInfo.info.previousPrice.length > 0;
     }
@@ -450,8 +454,9 @@
     }
   }
 
-  protected getBookmarkForceHover_(): boolean {
-    return this.bookmark === this.contextMenuBookmark;
+  protected getBookmarkForceHover_(bookmark: chrome.bookmarks.BookmarkTreeNode):
+      boolean {
+    return bookmark === this.contextMenuBookmark;
   }
 
   protected shouldExpand_(): boolean|undefined {
@@ -459,14 +464,14 @@
         this.compact;
   }
 
-  protected canEdit_(): boolean {
-    return this.bookmark?.id !== loadTimeData.getString('bookmarksBarId') &&
-        this.bookmark?.id !==
-        loadTimeData.getString('managedBookmarksFolderId');
+  protected canEdit_(bookmark: chrome.bookmarks.BookmarkTreeNode): boolean {
+    return bookmark?.id !== loadTimeData.getString('bookmarksBarId') &&
+        bookmark?.id !== loadTimeData.getString('managedBookmarksFolderId');
   }
 
-  protected isShoppingCollection_(): boolean {
-    return this.bookmark?.id === this.shoppingCollectionFolderId;
+  protected isShoppingCollection_(bookmark: chrome.bookmarks.BookmarkTreeNode):
+      boolean {
+    return bookmark?.id === this.shoppingCollectionFolderId;
   }
 
   protected getBookmarkDescription_(
@@ -498,19 +503,20 @@
     }
   }
 
-  protected getBookmarkImageUrls_(): string[] {
+  protected getBookmarkImageUrls_(bookmark: chrome.bookmarks.BookmarkTreeNode):
+      string[] {
     const imageUrls: string[] = [];
-    if (this.bookmark?.url) {
+    if (bookmark?.url) {
       const imageUrl = Object.entries(this.imageUrls)
-                           .find(([key, _val]) => key === this.bookmark.id)
+                           .find(([key, _val]) => key === bookmark.id)
                            ?.[1];
       if (imageUrl) {
         imageUrls.push(imageUrl);
       }
     } else if (
-        this.canEdit_() && this.bookmark?.children &&
-        !this.isShoppingCollection_()) {
-      this.bookmark?.children.forEach(child => {
+        this.canEdit_(bookmark) && bookmark?.children &&
+        !this.isShoppingCollection_(bookmark)) {
+      bookmark?.children.forEach((child) => {
         const childImageUrl: string =
             Object.entries(this.imageUrls)
                 .find(([key, _val]) => key === child.id)
@@ -523,32 +529,38 @@
     return imageUrls;
   }
 
-  protected getBookmarkMenuA11yLabel_(): string {
-    return loadTimeData.getStringF(
-        this.bookmark.url ? 'bookmarkMenuLabel' : 'folderMenuLabel',
-        this.bookmark.title);
+  protected getBookmarkMenuA11yLabel_(url: string|undefined, title: string):
+      string {
+    if (url) {
+      return loadTimeData.getStringF('bookmarkMenuLabel', title);
+    } else {
+      return loadTimeData.getStringF('folderMenuLabel', title);
+    }
   }
 
-  protected getBookmarkA11yLabel_(): string {
+  protected getBookmarkA11yLabel_(url: string|undefined, title: string):
+      string {
     if (this.hasCheckbox) {
       if (this.isCheckboxChecked_()) {
-        return loadTimeData.getStringF(
-            this.bookmark.url ? 'deselectBookmarkLabel' : 'deselectFolderLabel',
-            this.bookmark.title);
+        if (url) {
+          return loadTimeData.getStringF('deselectBookmarkLabel', title);
+        }
+        return loadTimeData.getStringF('deselectFolderLabel', title);
+      } else {
+        if (url) {
+          return loadTimeData.getStringF('selectBookmarkLabel', title);
+        }
+        return loadTimeData.getStringF('selectFolderLabel', title);
       }
-
-      return loadTimeData.getStringF(
-          this.bookmark.url ? 'selectBookmarkLabel' : 'selectFolderLabel',
-          this.bookmark.title);
     }
-
-    return loadTimeData.getStringF(
-        this.bookmark.url ? 'openBookmarkLabel' : 'openFolderLabel',
-        this.bookmark.title);
+    if (url) {
+      return loadTimeData.getStringF('openBookmarkLabel', title);
+    }
+    return loadTimeData.getStringF('openFolderLabel', title);
   }
 
-  protected getBookmarkA11yDescription_(): string {
-    const bookmark = this.bookmark;
+  protected getBookmarkA11yDescription_(
+      bookmark: chrome.bookmarks.BookmarkTreeNode): string {
     let description = '';
     if (this.bookmarksService?.getPriceTrackedInfo(bookmark)) {
       description += loadTimeData.getStringF(
@@ -563,14 +575,15 @@
     return description;
   }
 
-  protected getBookmarkDescriptionMeta_() {
+  protected getBookmarkDescriptionMeta_(bookmark:
+                                            chrome.bookmarks.BookmarkTreeNode) {
     // If there is a price available for the product and it isn't being
     // tracked, return the current price which will be added to the description
     // meta section.
     const productInfo =
-        this.bookmarksService?.getAvailableProductInfo(this.bookmark);
+        this.bookmarksService?.getAvailableProductInfo(bookmark);
     if (productInfo && productInfo.info.currentPrice &&
-        !this.isPriceTracked_()) {
+        !this.isPriceTracked_(bookmark)) {
       return productInfo.info.currentPrice;
     }
 
diff --git a/chrome/browser/resources/signin/dice_web_signin_intercept/OWNERS b/chrome/browser/resources/signin/dice_web_signin_intercept/OWNERS
index 5fd4d46e..abcdb8d0 100644
--- a/chrome/browser/resources/signin/dice_web_signin_intercept/OWNERS
+++ b/chrome/browser/resources/signin/dice_web_signin_intercept/OWNERS
@@ -1,2 +1 @@
 file://components/signin/OWNERS
-gabolvr@google.com
diff --git a/chrome/browser/resources/signin/profile_customization/OWNERS b/chrome/browser/resources/signin/profile_customization/OWNERS
index 5fd4d46e..abcdb8d0 100644
--- a/chrome/browser/resources/signin/profile_customization/OWNERS
+++ b/chrome/browser/resources/signin/profile_customization/OWNERS
@@ -1,2 +1 @@
 file://components/signin/OWNERS
-gabolvr@google.com
diff --git a/chrome/browser/resources/signin/sync_confirmation/OWNERS b/chrome/browser/resources/signin/sync_confirmation/OWNERS
index a1d7004..abcdb8d0 100644
--- a/chrome/browser/resources/signin/sync_confirmation/OWNERS
+++ b/chrome/browser/resources/signin/sync_confirmation/OWNERS
@@ -1,3 +1 @@
 file://components/signin/OWNERS
-jyammine@google.com
-gabolvr@google.com
diff --git a/chrome/browser/screenshot_monitor/java/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotMonitor.java b/chrome/browser/screenshot_monitor/java/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotMonitor.java
index 1da6d090..69a0864 100644
--- a/chrome/browser/screenshot_monitor/java/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotMonitor.java
+++ b/chrome/browser/screenshot_monitor/java/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotMonitor.java
@@ -5,8 +5,10 @@
 package org.chromium.chrome.browser.screenshot_monitor;
 
 import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.NullMarked;
 
 /** Base class for detecting screenshots and notifying the {@code ScreenshotMonitorDelegate}. */
+@NullMarked
 public abstract class ScreenshotMonitor {
     private final ScreenshotMonitorDelegate mDelegate;
     private boolean mIsMonitoring;
diff --git a/chrome/browser/screenshot_monitor/java/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotMonitorDelegate.java b/chrome/browser/screenshot_monitor/java/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotMonitorDelegate.java
index 8d55039..94617fdd 100644
--- a/chrome/browser/screenshot_monitor/java/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotMonitorDelegate.java
+++ b/chrome/browser/screenshot_monitor/java/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotMonitorDelegate.java
@@ -4,7 +4,10 @@
 
 package org.chromium.chrome.browser.screenshot_monitor;
 
+import org.chromium.build.annotations.NullMarked;
+
 /** This class serves as a callback from ScreenshotMonitor. */
+@NullMarked
 public interface ScreenshotMonitorDelegate {
     void onScreenshotTaken();
 }
diff --git a/chrome/browser/screenshot_monitor/java/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotMonitorImpl.java b/chrome/browser/screenshot_monitor/java/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotMonitorImpl.java
index 8231591..c2dbd73 100644
--- a/chrome/browser/screenshot_monitor/java/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotMonitorImpl.java
+++ b/chrome/browser/screenshot_monitor/java/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotMonitorImpl.java
@@ -23,6 +23,8 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.ui.base.MimeTypeUtils;
 import org.chromium.ui.display.DisplayAndroid;
 
@@ -31,12 +33,13 @@
  * storages, and notifies the ScreenshotMonitorDelegate. The caller should use
  * @{link ScreenshotMonitor#create(ScreenshotMonitorDelegate)} to create an instance.
  */
+@NullMarked
 public class ScreenshotMonitorImpl extends ScreenshotMonitor {
     private static final String TAG = "ScreenshotMonitor";
     private final ScreenshotMonitorContentObserver mContentObserver;
 
-    private ContentResolver mContentResolverForTesting;
-    private DisplayAndroid mDisplayAndroidForTesting;
+    private @Nullable ContentResolver mContentResolverForTesting;
+    private @Nullable DisplayAndroid mDisplayAndroidForTesting;
 
     /** Observe content changes in the Media database looking for screenshots. */
     private class ScreenshotMonitorContentObserver extends ContentObserver {
@@ -50,11 +53,11 @@
 
         // ContentObsever implementation.
         @Override
-        public void onChange(boolean selfChange, Uri uri) {
+        public void onChange(boolean selfChange, @Nullable Uri uri) {
             checkAndNotify(uri);
         }
 
-        private void checkAndNotify(Uri uri) {
+        private void checkAndNotify(@Nullable Uri uri) {
             if (uri == null) return;
 
             Log.d(TAG, "Detected change to the media database " + uri);
diff --git a/chrome/browser/screenshot_monitor/java/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotTabObserver.java b/chrome/browser/screenshot_monitor/java/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotTabObserver.java
index 82ad9c3..b71fd1d 100644
--- a/chrome/browser/screenshot_monitor/java/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotTabObserver.java
+++ b/chrome/browser/screenshot_monitor/java/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotTabObserver.java
@@ -4,11 +4,13 @@
 
 package org.chromium.chrome.browser.screenshot_monitor;
 
-import androidx.annotation.Nullable;
+import static org.chromium.build.NullUtil.assumeNonNull;
 
 import org.chromium.base.UserData;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.metrics.RecordUserAction;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.components.ukm.UkmRecorder;
@@ -16,6 +18,7 @@
 import org.chromium.ui.base.WindowAndroid;
 
 /** A {@link TabObserver} that also handles screenshot related events. */
+@NullMarked
 public class ScreenshotTabObserver extends EmptyTabObserver implements UserData {
     // Enum for logging Screenshot UMA. These match the TabScreenshotAction enum in enums.xml, and
     // must not be changed.  New ones can be added if we also add them in enums.xml.
@@ -26,14 +29,14 @@
     public static final int SCREENSHOT_ACTION_COUNT = 3;
 
     private static final Class<ScreenshotTabObserver> USER_DATA_KEY = ScreenshotTabObserver.class;
-    private Runnable mOnReportCompleteForTesting;
+    private @Nullable Runnable mOnReportCompleteForTesting;
 
     /**
      * Gets the existing observer if it exists, otherwise creates one.
      * @param tab The Tab for which to create the observer.
      * @return ScreenshotTabObserver to use, or null if the tab was null.
      */
-    public static ScreenshotTabObserver from(Tab tab) {
+    public static @Nullable ScreenshotTabObserver from(Tab tab) {
         if (tab == null || !tab.isInitialized()) return null;
         // Get the current observer from the tab using UserData, if any.  If not, create a new
         // observer and put it into the UserData for the tab.
@@ -62,7 +65,7 @@
     /** Actions performed after a screenshot was taken. */
     private int mScreenshotAction;
 
-    private Tab mTab;
+    private @Nullable Tab mTab;
 
     public ScreenshotTabObserver(Tab tab) {
         mTab = tab;
@@ -72,6 +75,7 @@
 
     @Override
     public void destroy() {
+        assumeNonNull(mTab);
         mTab.removeObserver(this);
         mTab = null;
     }
diff --git a/chrome/browser/search_engine_choice/search_engine_choice_dialog_service_unittest.cc b/chrome/browser/search_engine_choice/search_engine_choice_dialog_service_unittest.cc
index 6156b91..a0bd5483 100644
--- a/chrome/browser/search_engine_choice/search_engine_choice_dialog_service_unittest.cc
+++ b/chrome/browser/search_engine_choice/search_engine_choice_dialog_service_unittest.cc
@@ -590,14 +590,14 @@
       search_engine_list_override.value() ==
           regional_capabilities::SearchEngineCountryListOverride::kEeaDefault) {
     expected_search_engine_list_size =
-        TemplateURLPrepopulateData::GetDefaultPrepopulatedEngines().size();
+        regional_capabilities::GetDefaultPrepopulatedEngines().size();
   }
 
   if (search_engine_list_override.has_value() &&
       search_engine_list_override.value() ==
           regional_capabilities::SearchEngineCountryListOverride::kEeaAll) {
     expected_search_engine_list_size =
-        TemplateURLPrepopulateData::GetAllEeaRegionPrepopulatedEngines().size();
+        regional_capabilities::GetAllEeaRegionPrepopulatedEngines().size();
   }
 
   EXPECT_EQ(search_engine_choice_service->GetSearchEngines().size(),
diff --git a/chrome/browser/selection/android/java/src/org/chromium/chrome/browser/selection/SelectionPopupBackPressHandler.java b/chrome/browser/selection/android/java/src/org/chromium/chrome/browser/selection/SelectionPopupBackPressHandler.java
index 807a5336..8ba1e12 100644
--- a/chrome/browser/selection/android/java/src/org/chromium/chrome/browser/selection/SelectionPopupBackPressHandler.java
+++ b/chrome/browser/selection/android/java/src/org/chromium/chrome/browser/selection/SelectionPopupBackPressHandler.java
@@ -8,6 +8,8 @@
 import org.chromium.base.lifetime.Destroyable;
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.ObservableSupplierImpl;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModelObserver;
@@ -20,14 +22,15 @@
  * model and notifies whether the current selection popup controller is going to intercept the
  * back press.
  */
+@NullMarked
 public class SelectionPopupBackPressHandler extends EmptyTabObserver
         implements BackPressHandler, TabModelObserver, Destroyable {
     private final ObservableSupplierImpl<Boolean> mBackPressChangedSupplier =
             new ObservableSupplierImpl<>();
     private final Callback<Boolean> mCallback = this::onActionBarShowingChanged;
 
-    private SelectionPopupController mPopupController;
-    private Tab mTab;
+    private @Nullable SelectionPopupController mPopupController;
+    private @Nullable Tab mTab;
 
     /**
      * @param tabModelSelector A {@link TabModelSelector} which can provide {@link
@@ -75,7 +78,7 @@
         mBackPressChangedSupplier.set(false);
     }
 
-    private void updatePopupControllerObserving(Tab tab) {
+    private void updatePopupControllerObserving(@Nullable Tab tab) {
         if (mPopupController != null) {
             mPopupController.isSelectActionBarShowingSupplier().removeObserver(mCallback);
             mPopupController = null;
@@ -94,7 +97,7 @@
         mBackPressChangedSupplier.set(isShowing);
     }
 
-    SelectionPopupController getPopupControllerForTesting() {
+    @Nullable SelectionPopupController getPopupControllerForTesting() {
         return mPopupController;
     }
 }
diff --git a/chrome/browser/sessions/session_restore_browsertest.cc b/chrome/browser/sessions/session_restore_browsertest.cc
index d3b1de7a..cf30307f 100644
--- a/chrome/browser/sessions/session_restore_browsertest.cc
+++ b/chrome/browser/sessions/session_restore_browsertest.cc
@@ -4326,15 +4326,10 @@
   EXPECT_TRUE(app_checked);
 }
 
-class SessionRestoreStaleSessionCookieDeletionTest
-    : public SessionRestoreTest,
-      public testing::WithParamInterface<bool> {
+class SessionRestoreStaleSessionCookieDeletionTest : public SessionRestoreTest {
  public:
   SessionRestoreStaleSessionCookieDeletionTest()
       : https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {
-    feature_list_.InitWithFeatureState(
-        features::kDeleteStaleSessionCookiesOnStartup,
-        ShouldDeleteStaleSessionCookiesOnStartup());
   }
 
   void SetUpOnMainThread() override {
@@ -4345,8 +4340,6 @@
     SessionRestoreTest::SetUpOnMainThread();
   }
 
-  bool ShouldDeleteStaleSessionCookiesOnStartup() { return GetParam(); }
-
   net::EmbeddedTestServer* https_server() { return &https_server_; }
 
   bool SetCookie(const std::string& name,
@@ -4391,16 +4384,10 @@
   }
 
  private:
-  base::test::ScopedFeatureList feature_list_;
   net::EmbeddedTestServer https_server_;
 };
 
-INSTANTIATE_TEST_SUITE_P(
-    /* no prefix */,
-    SessionRestoreStaleSessionCookieDeletionTest,
-    testing::Bool());
-
-IN_PROC_BROWSER_TEST_P(SessionRestoreStaleSessionCookieDeletionTest,
+IN_PROC_BROWSER_TEST_F(SessionRestoreStaleSessionCookieDeletionTest,
                        CookieStorage) {
   GURL open_page = https_server()->GetURL("a.test", "/empty.html");
   GURL other_page = https_server()->GetURL("b.test", "/empty.html");
@@ -4442,7 +4429,7 @@
   ASSERT_EQ(open_page,
             new_browser->tab_strip_model()->GetActiveWebContents()->GetURL());
   // No cookies should have been cleared except for the stale session cookie on
-  // a page that wasn't restored when kDeleteStaleSessionCookiesOnStartup is on.
+  // a page that wasn't restored.
   EXPECT_TRUE(HasCookie(new_browser, "open_page_persistent_cookie"));
   EXPECT_TRUE(HasCookie(new_browser, "open_page_persistent_stale_cookie"));
   EXPECT_TRUE(HasCookie(new_browser, "open_page_session_cookie"));
@@ -4450,8 +4437,7 @@
   EXPECT_TRUE(HasCookie(new_browser, "other_page_persistent_cookie"));
   EXPECT_TRUE(HasCookie(new_browser, "other_page_persistent_stale_cookie"));
   EXPECT_TRUE(HasCookie(new_browser, "other_page_session_cookie"));
-  EXPECT_EQ(HasCookie(new_browser, "other_page_session_stale_cookie"),
-            !ShouldDeleteStaleSessionCookiesOnStartup());
+  EXPECT_FALSE(HasCookie(new_browser, "other_page_session_stale_cookie"));
 }
 
 class SavedTabGroupSessionRestoreTest
diff --git a/chrome/browser/signin/dice_web_signin_interceptor_browsertest.cc b/chrome/browser/signin/dice_web_signin_interceptor_browsertest.cc
index 034135e..73ee628 100644
--- a/chrome/browser/signin/dice_web_signin_interceptor_browsertest.cc
+++ b/chrome/browser/signin/dice_web_signin_interceptor_browsertest.cc
@@ -1743,7 +1743,7 @@
   ProfileAttributesEntry* entry =
       storage.GetProfileAttributesWithPath(new_profile->GetPath());
   ASSERT_TRUE(entry);
-  EXPECT_EQ("Work", base::UTF16ToUTF8(entry->GetLocalProfileName()));
+  EXPECT_EQ("example.com", base::UTF16ToUTF8(entry->GetLocalProfileName()));
   // Check the profile color.
   EXPECT_TRUE(ThemeServiceFactory::GetForProfile(new_profile)
                   ->GetUserColor()
@@ -1988,7 +1988,7 @@
   ProfileAttributesEntry* entry =
       storage.GetProfileAttributesWithPath(new_profile->GetPath());
   ASSERT_TRUE(entry);
-  EXPECT_EQ("Work", base::UTF16ToUTF8(entry->GetLocalProfileName()));
+  EXPECT_EQ("example.com", base::UTF16ToUTF8(entry->GetLocalProfileName()));
   // Check the profile color.
   EXPECT_TRUE(ThemeServiceFactory::GetForProfile(new_profile)
                   ->GetUserColor()
diff --git a/chrome/browser/supervised_user/android/java/src/org/chromium/chrome/browser/supervised_user/SupervisedUserServicePlatformDelegate.java b/chrome/browser/supervised_user/android/java/src/org/chromium/chrome/browser/supervised_user/SupervisedUserServicePlatformDelegate.java
index eb51a3c..e8d5310 100644
--- a/chrome/browser/supervised_user/android/java/src/org/chromium/chrome/browser/supervised_user/SupervisedUserServicePlatformDelegate.java
+++ b/chrome/browser/supervised_user/android/java/src/org/chromium/chrome/browser/supervised_user/SupervisedUserServicePlatformDelegate.java
@@ -6,8 +6,10 @@
 
 import org.jni_zero.CalledByNative;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.tabmodel.IncognitoTabHostUtils;
 
+@NullMarked
 class SupervisedUserServicePlatformDelegate {
     /** Closes all open incognito tabs */
     @CalledByNative
diff --git a/chrome/browser/supervised_user/linux_mac_windows/parent_access_view.cc b/chrome/browser/supervised_user/linux_mac_windows/parent_access_view.cc
index 44752bc..e704b171 100644
--- a/chrome/browser/supervised_user/linux_mac_windows/parent_access_view.cc
+++ b/chrome/browser/supervised_user/linux_mac_windows/parent_access_view.cc
@@ -36,8 +36,7 @@
 #include "ui/views/controls/webview/webview.h"
 #include "ui/views/layout/box_layout.h"
 #include "ui/views/layout/box_layout_view.h"
-#include "ui/views/layout/flex_layout.h"
-#include "ui/views/layout/flex_layout_view.h"
+#include "ui/views/layout/fill_layout.h"
 #include "ui/views/layout/layout_types.h"
 #include "ui/views/style/typography.h"
 #include "ui/views/view.h"
@@ -50,7 +49,7 @@
 namespace {
 
 constexpr int kViewWidth = 448;
-constexpr int kViewHeight = 440;
+constexpr int kViewHeight = 390;
 constexpr int kMaxWebViewHeight = 540;
 constexpr gfx::Size kViewPreferredSize = gfx::Size(kViewWidth, kViewHeight);
 constexpr gfx::Size kErrorViewPreferredSize =
@@ -372,11 +371,9 @@
 }
 
 void ParentAccessView::Initialize(const GURL& pacp_url, int corner_radius) {
-  auto layout = std::make_unique<views::FlexLayout>();
-  layout->SetOrientation(views::LayoutOrientation::kHorizontal);
-  layout->SetMainAxisAlignment(views::LayoutAlignment::kCenter);
-  layout->SetCrossAxisAlignment(views::LayoutAlignment::kStretch);
-  SetLayoutManager(std::move(layout));
+  // A FillLayout is enough as the dialog only displays a child view at a time
+  // (web_view_ or error_view_).
+  SetLayoutManager(std::make_unique<views::FillLayout>());
 
   // Loads the PACP widget's url. This creates the new web_contents of the
   // dialog.
diff --git a/chrome/browser/sync/test/integration/single_client_common_sync_test.cc b/chrome/browser/sync/test/integration/single_client_common_sync_test.cc
index 82162ab..31712a6 100644
--- a/chrome/browser/sync/test/integration/single_client_common_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_common_sync_test.cc
@@ -245,12 +245,6 @@
 #endif  // !BUILDFLAG(IS_ANDROID)
   }
 
-  bool HasUnsyncedData(syncer::DataType type) {
-    base::test::TestFuture<syncer::DataTypeSet> future;
-    GetSyncService(0)->GetTypesWithUnsyncedData({type}, future.GetCallback());
-    return future.Get().Has(type);
-  }
-
  private:
   base::test::ScopedFeatureList feature_list_;
 };
@@ -267,7 +261,10 @@
       GetSyncService(0)->GetActiveDataTypes().HasAll({syncer::BOOKMARKS}));
 
   // BOOKMARKS has no unsynced data.
-  EXPECT_FALSE(HasUnsyncedData(syncer::BOOKMARKS));
+  EXPECT_FALSE(GetClient(0)
+                   ->GetTypesWithUnsyncedData({syncer::BOOKMARKS})
+                   .Get()
+                   .Has(syncer::BOOKMARKS));
 
   ASSERT_TRUE(bookmarks_helper::BookmarkModelMatchesFakeServerChecker(
                   /*profile=*/0, GetSyncService(0), GetFakeServer())
@@ -280,7 +277,10 @@
                            GURL("https://example.com"));
 
   // BOOKMARKS now has local changes not yet synced with the server.
-  EXPECT_TRUE(HasUnsyncedData(syncer::BOOKMARKS));
+  EXPECT_TRUE(GetClient(0)
+                  ->GetTypesWithUnsyncedData({syncer::BOOKMARKS})
+                  .Get()
+                  .Has(syncer::BOOKMARKS));
 
   // Clear the error and wait for the local changes to be committed.
   GetFakeServer()->ClearHttpError();
@@ -290,7 +290,10 @@
                   .Wait());
 
   // BOOKMARKS has no unsynced data.
-  EXPECT_FALSE(HasUnsyncedData(syncer::BOOKMARKS));
+  EXPECT_FALSE(GetClient(0)
+                   ->GetTypesWithUnsyncedData({syncer::BOOKMARKS})
+                   .Get()
+                   .Has(syncer::BOOKMARKS));
 }
 #endif  // BUILDFLAG(IS_ANDROID)
 
@@ -303,7 +306,10 @@
   ASSERT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::THEMES));
 
   // THEMES has no unsynced data.
-  ASSERT_FALSE(HasUnsyncedData(syncer::THEMES));
+  ASSERT_FALSE(GetClient(0)
+                   ->GetTypesWithUnsyncedData({syncer::THEMES})
+                   .Get()
+                   .Has(syncer::THEMES));
 
   // Force theme saved to the account to be unsynced.
   GetFakeServer()->SetHttpError(net::HTTP_BAD_REQUEST);
@@ -313,14 +319,20 @@
   ASSERT_TRUE(CustomThemeChecker(GetProfile(0)).Wait());
 
   // THEMES now has local changes not yet synced with the server.
-  EXPECT_TRUE(HasUnsyncedData(syncer::THEMES));
+  EXPECT_TRUE(GetClient(0)
+                  ->GetTypesWithUnsyncedData({syncer::THEMES})
+                  .Get()
+                  .Has(syncer::THEMES));
 
   // Clear the error and wait for the local changes to be committed.
   GetFakeServer()->ClearHttpError();
   ASSERT_TRUE(CommittedAllNudgedChangesChecker(GetSyncService(0)).Wait());
 
   // THEMES has no unsynced data.
-  EXPECT_FALSE(HasUnsyncedData(syncer::THEMES));
+  EXPECT_FALSE(GetClient(0)
+                   ->GetTypesWithUnsyncedData({syncer::THEMES})
+                   .Get()
+                   .Has(syncer::THEMES));
 }
 
 IN_PROC_BROWSER_TEST_F(SingleClientGetUnsyncedTypesTest, SignInPendingState) {
@@ -332,7 +344,10 @@
   ASSERT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::THEMES));
 
   // THEMES has no unsynced data.
-  ASSERT_FALSE(HasUnsyncedData(syncer::THEMES));
+  ASSERT_FALSE(GetClient(0)
+                   ->GetTypesWithUnsyncedData({syncer::THEMES})
+                   .Get()
+                   .Has(syncer::THEMES));
 
   // Enter sign-in pending state.
   ASSERT_TRUE(GetClient(0)->EnterSignInPendingStateForPrimaryAccount());
@@ -342,14 +357,20 @@
   ASSERT_TRUE(CustomThemeChecker(GetProfile(0)).Wait());
 
   // THEMES now has local changes not yet synced with the server.
-  EXPECT_TRUE(HasUnsyncedData(syncer::THEMES));
+  EXPECT_TRUE(GetClient(0)
+                  ->GetTypesWithUnsyncedData({syncer::THEMES})
+                  .Get()
+                  .Has(syncer::THEMES));
 
   // Clear the error and wait for the local changes to be committed.
   ASSERT_TRUE(GetClient(0)->ExitSignInPendingStateForPrimaryAccount());
   ASSERT_TRUE(CommittedAllNudgedChangesChecker(GetSyncService(0)).Wait());
 
   // THEMES has no unsynced data.
-  EXPECT_FALSE(HasUnsyncedData(syncer::THEMES));
+  EXPECT_FALSE(GetClient(0)
+                   ->GetTypesWithUnsyncedData({syncer::THEMES})
+                   .Get()
+                   .Has(syncer::THEMES));
 }
 
 #endif  // !BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/sync/test/integration/single_client_themes_sync_test.cc b/chrome/browser/sync/test/integration/single_client_themes_sync_test.cc
index f5c274d..573897d 100644
--- a/chrome/browser/sync/test/integration/single_client_themes_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_themes_sync_test.cc
@@ -2,8 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/test/run_until.h"
 #include "base/test/scoped_feature_list.h"
+#include "base/test/test_future.h"
 #include "build/build_config.h"
+#include "chrome/browser/signin/identity_manager_factory.h"
+#include "chrome/browser/sync/test/integration/committed_all_nudged_changes_checker.h"
 #include "chrome/browser/sync/test/integration/fake_server_match_status_checker.h"
 #include "chrome/browser/sync/test/integration/preferences_helper.h"
 #include "chrome/browser/sync/test/integration/sync_service_impl_harness.h"
@@ -16,6 +20,8 @@
 #include "chrome/browser/themes/theme_syncable_service.h"
 #include "chrome/common/pref_names.h"
 #include "components/prefs/pref_service.h"
+#include "components/signin/public/base/signin_switches.h"
+#include "components/signin/public/identity_manager/identity_test_utils.h"
 #include "components/sync/base/data_type.h"
 #include "components/sync/base/features.h"
 #include "components/sync/engine/loopback_server/persistent_unique_client_entity.h"
@@ -65,6 +71,10 @@
   return arg.has_user_color_theme() && arg.user_color_theme().color() == color;
 }
 
+MATCHER(HasGrayscaleTheme, "") {
+  return arg.has_grayscale_theme_enabled();
+}
+
 std::unique_ptr<syncer::LoopbackServerEntity> CreateDefaultThemeEntity() {
   sync_pb::EntitySpecifics specifics;
   // Clients always write `browser_color_scheme` field.
@@ -683,4 +693,147 @@
   EXPECT_FALSE(UsingGrayscaleTheme(GetProfile(0)));
 }
 
+// Signing out is not supported on ChromeOS, thus excluded from this test suite.
+#if !BUILDFLAG(IS_CHROMEOS)
+class SingleClientThemesSyncTestWithAccountThemesSeparationInSigninPendingState
+    : public SingleClientThemesSyncTestWithAccountThemesSeparation {
+ public:
+  bool HasUnsyncedThemeData() {
+    return GetClient(0)
+        ->GetTypesWithUnsyncedData({syncer::THEMES})
+        .Get()
+        .Has(syncer::THEMES);
+  }
+
+ private:
+  // `kEnablePreferencesAccountStorage` is used to enable themes in transport
+  // mode alongside some other data types.
+  base::test::ScopedFeatureList feature_list_{
+      switches::kEnablePreferencesAccountStorage};
+};
+
+IN_PROC_BROWSER_TEST_F(
+    SingleClientThemesSyncTestWithAccountThemesSeparationInSigninPendingState,
+    ShouldMarkThemeChangeWhileSigninPendingUnsynced) {
+  ASSERT_TRUE(SetupClients());
+  ASSERT_TRUE(UsingDefaultTheme(GetProfile(0)));
+
+  ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount());
+  ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive());
+
+  themes_helper::UseGrayscaleTheme(GetProfile(0));
+  ASSERT_TRUE(CommittedAllNudgedChangesChecker(GetSyncService(0)).Wait());
+  ASSERT_TRUE(UsingGrayscaleTheme(GetProfile(0)));
+
+  // Enter sign-in pending state.
+  ASSERT_TRUE(GetClient(0)->EnterSignInPendingStateForPrimaryAccount());
+  ASSERT_FALSE(HasUnsyncedThemeData());
+
+  // Set up a custom theme.
+  UseCustomTheme(GetProfile(0), 0);
+  ASSERT_TRUE(CustomThemeChecker(GetProfile(0)).Wait());
+
+  // Themes should be checked for unsynced data when sign-out is attempted.
+  ASSERT_TRUE(
+      syncer::TypesRequiringUnsyncedDataCheckOnSignout().Has(syncer::THEMES));
+
+  // Themes has unsynced data.
+  EXPECT_TRUE(HasUnsyncedThemeData());
+
+  // Sign out.
+  GetClient(0)->SignOutPrimaryAccount();
+  EXPECT_TRUE(DefaultThemeChecker(GetProfile(0)).Wait());
+}
+
+IN_PROC_BROWSER_TEST_F(
+    SingleClientThemesSyncTestWithAccountThemesSeparationInSigninPendingState,
+    ShouldCommitUnsyncedThemeChangeUponResolve) {
+  ASSERT_TRUE(SetupClients());
+  ASSERT_TRUE(UsingDefaultTheme(GetProfile(0)));
+
+  ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount());
+  ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive());
+
+  themes_helper::UseGrayscaleTheme(GetProfile(0));
+  ASSERT_TRUE(CommittedAllNudgedChangesChecker(GetSyncService(0)).Wait());
+  ASSERT_TRUE(UsingGrayscaleTheme(GetProfile(0)));
+
+  // Enter sign-in pending state.
+  ASSERT_TRUE(GetClient(0)->EnterSignInPendingStateForPrimaryAccount());
+  ASSERT_FALSE(HasUnsyncedThemeData());
+
+  // Set up a custom theme.
+  UseCustomTheme(GetProfile(0), 0);
+  ASSERT_TRUE(CustomThemeChecker(GetProfile(0)).Wait());
+
+  // Themes should be checked for unsynced data when sign-out is attempted.
+  ASSERT_TRUE(
+      syncer::TypesRequiringUnsyncedDataCheckOnSignout().Has(syncer::THEMES));
+
+  // Themes has unsynced data.
+  EXPECT_TRUE(HasUnsyncedThemeData());
+  // Server still has the old theme.
+  ASSERT_TRUE(ServerThemeMatchChecker(HasGrayscaleTheme()).Wait());
+
+  // Resolve sign-in pending state.
+  ASSERT_TRUE(GetClient(0)->ExitSignInPendingStateForPrimaryAccount());
+  ASSERT_TRUE(UsingCustomTheme(GetProfile(0)));
+  ASSERT_TRUE(
+      ServerThemeMatchChecker(HasCustomThemeWithId(GetCustomTheme(0))).Wait());
+}
+
+IN_PROC_BROWSER_TEST_F(
+    SingleClientThemesSyncTestWithAccountThemesSeparationInSigninPendingState,
+    PRE_ShouldPersistUnsyncedThemeChangeAcrossRestart) {
+  ASSERT_TRUE(SetupClients());
+  ASSERT_TRUE(UsingDefaultTheme(GetProfile(0)));
+
+  ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount());
+  ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive());
+
+  themes_helper::UseGrayscaleTheme(GetProfile(0));
+  ASSERT_TRUE(CommittedAllNudgedChangesChecker(GetSyncService(0)).Wait());
+  ASSERT_TRUE(UsingGrayscaleTheme(GetProfile(0)));
+
+  // Enter sign-in pending state.
+  ASSERT_TRUE(GetClient(0)->EnterSignInPendingStateForPrimaryAccount());
+  ASSERT_FALSE(HasUnsyncedThemeData());
+
+  // Set up a custom theme.
+  UseCustomTheme(GetProfile(0), 0);
+  ASSERT_TRUE(CustomThemeChecker(GetProfile(0)).Wait());
+  ASSERT_TRUE(HasUnsyncedThemeData());
+}
+
+IN_PROC_BROWSER_TEST_F(
+    SingleClientThemesSyncTestWithAccountThemesSeparationInSigninPendingState,
+    ShouldPersistUnsyncedThemeChangeAcrossRestart) {
+  ASSERT_TRUE(SetupClients());
+  ASSERT_TRUE(UsingCustomTheme(GetProfile(0)));
+  ASSERT_TRUE(GetClient(0)->AwaitSyncTransportPaused());
+  // Hacky wait for entity tracker to be loaded.
+  ASSERT_TRUE(base::test::RunUntil([&]() {
+    return ThemeServiceFactory::GetForProfile(GetProfile(0))
+        ->GetThemeSyncableService()
+        ->GetThemeSyncStartState()
+        .has_value();
+  }));
+
+  // Themes has unsynced data.
+  EXPECT_TRUE(HasUnsyncedThemeData());
+  // Server still has the old theme.
+  ASSERT_TRUE(ServerThemeMatchChecker(HasGrayscaleTheme()).Wait());
+
+  // Resolve sign-in pending state.
+  ASSERT_TRUE(GetClient(0)->ExitSignInPendingStateForPrimaryAccount());
+  ASSERT_TRUE(UsingCustomTheme(GetProfile(0)));
+  ASSERT_TRUE(
+      ServerThemeMatchChecker(HasCustomThemeWithId(GetCustomTheme(0))).Wait());
+
+  // Sign out.
+  GetClient(0)->SignOutPrimaryAccount();
+  ASSERT_TRUE(DefaultThemeChecker(GetProfile(0)).Wait());
+}
+#endif  // !BUILDFLAG(IS_CHROMEOS)
+
 }  // namespace
diff --git a/chrome/browser/sync/test/integration/sync_service_impl_harness.cc b/chrome/browser/sync/test/integration/sync_service_impl_harness.cc
index 8a91182e..2713cd0 100644
--- a/chrome/browser/sync/test/integration/sync_service_impl_harness.cc
+++ b/chrome/browser/sync/test/integration/sync_service_impl_harness.cc
@@ -613,6 +613,14 @@
   return SyncCycleSnapshot();
 }
 
+base::test::TestFuture<syncer::DataTypeSet>
+SyncServiceImplHarness::GetTypesWithUnsyncedData(
+    syncer::DataTypeSet requested_types) const {
+  base::test::TestFuture<syncer::DataTypeSet> future;
+  service()->GetTypesWithUnsyncedData(requested_types, future.GetCallback());
+  return future;
+}
+
 std::string SyncServiceImplHarness::GetServiceStatus() {
   // This method is only used in test code for debugging purposes, so it's fine
   // to include sensitive data in ConstructAboutInformation().
diff --git a/chrome/browser/sync/test/integration/sync_service_impl_harness.h b/chrome/browser/sync/test/integration/sync_service_impl_harness.h
index 41a9234a..a9a7cca 100644
--- a/chrome/browser/sync/test/integration/sync_service_impl_harness.h
+++ b/chrome/browser/sync/test/integration/sync_service_impl_harness.h
@@ -12,6 +12,7 @@
 
 #include "base/functional/callback_forward.h"
 #include "base/memory/raw_ptr.h"
+#include "base/test/test_future.h"
 #include "build/build_config.h"
 #include "components/sync/base/user_selectable_type.h"
 #include "components/sync/engine/cycle/sync_cycle_snapshot.h"
@@ -186,6 +187,11 @@
   // Returns a snapshot of the current sync session.
   syncer::SyncCycleSnapshot GetLastCycleSnapshot() const;
 
+  // Returns a TestFuture that will be resolved with the set of data types that
+  // have unsynced data.
+  base::test::TestFuture<syncer::DataTypeSet> GetTypesWithUnsyncedData(
+      syncer::DataTypeSet requested_types) const;
+
  private:
   SyncServiceImplHarness(Profile* profile,
                          const std::string& username,
diff --git a/chrome/browser/sync/test/integration/themes_helper.cc b/chrome/browser/sync/test/integration/themes_helper.cc
index bccc867..d7bd6990 100644
--- a/chrome/browser/sync/test/integration/themes_helper.cc
+++ b/chrome/browser/sync/test/integration/themes_helper.cc
@@ -85,6 +85,10 @@
       profile, MakeName(index), extensions::Manifest::TYPE_THEME);
 }
 
+void UseGrayscaleTheme(Profile* profile) {
+  GetThemeService(profile)->SetIsGrayscale(true);
+}
+
 void UseDefaultTheme(Profile* profile) {
   GetThemeService(profile)->UseDefaultTheme();
 }
diff --git a/chrome/browser/sync/test/integration/themes_helper.h b/chrome/browser/sync/test/integration/themes_helper.h
index d4bcc13..a326f31 100644
--- a/chrome/browser/sync/test/integration/themes_helper.h
+++ b/chrome/browser/sync/test/integration/themes_helper.h
@@ -47,6 +47,9 @@
 // Sets |profile| to use the custom theme with the given index.
 void UseCustomTheme(Profile* profile, int index);
 
+// Sets `profile` to use the grayscale theme.
+void UseGrayscaleTheme(Profile* profile);
+
 // Sets |profile| to use the default theme.
 void UseDefaultTheme(Profile* profile);
 
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/LocalTabGroupMutationHelper.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/LocalTabGroupMutationHelper.java
index f7412f8..47ab5f88 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/LocalTabGroupMutationHelper.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/LocalTabGroupMutationHelper.java
@@ -4,10 +4,14 @@
 
 package org.chromium.chrome.browser.tab_group_sync;
 
+import static org.chromium.build.NullUtil.assertNonNull;
+
 import android.text.TextUtils;
 
 import org.chromium.base.Token;
 import org.chromium.base.metrics.RecordUserAction;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab_group_sync.TabGroupSyncControllerImpl.TabCreationDelegate;
 import org.chromium.chrome.browser.tabmodel.TabClosureParams;
@@ -33,6 +37,7 @@
  * Helper class to create, modify, overwrite local tab groups in response to sync updates and
  * startup.
  */
+@NullMarked
 public class LocalTabGroupMutationHelper {
     private static final String TAG = "TG.LocalMutation";
     private final TabGroupModelFilter mTabGroupModelFilter;
@@ -68,11 +73,13 @@
         int position = getTabModel().getCount();
         List<Tab> tabs = new ArrayList<>();
         for (SavedTabGroupTab savedTab : tabGroup.savedTabs) {
+            String title = savedTab.title == null ? "" : savedTab.title;
             Tab newTab =
                     mTabCreationDelegate.createBackgroundTab(
-                            savedTab.url, savedTab.title, /* parent= */ null, position++);
+                            assertNonNull(savedTab.url), title, /* parent= */ null, position++);
+            assert newTab != null;
             tabs.add(newTab);
-            tabIdMappings.put(savedTab.syncId, newTab.getId());
+            tabIdMappings.put(assertNonNull(savedTab.syncId), newTab.getId());
             RecordUserAction.record("TabGroups.Sync.CreatedNewTab");
         }
 
@@ -94,7 +101,7 @@
                 TabGroupSyncUtils.getLocalTabGroupId(mTabGroupModelFilter, rootId);
         assert localTabGroupId != null : "Local tab group ID is null after creating a group!";
         mTabGroupSyncService.updateLocalTabGroupMapping(
-                tabGroup.syncId, localTabGroupId, openingSource);
+                assertNonNull(tabGroup.syncId), localTabGroupId, openingSource);
         for (String syncTabId : tabIdMappings.keySet()) {
             mTabGroupSyncService.updateLocalTabId(
                     localTabGroupId, syncTabId, tabIdMappings.get(syncTabId));
@@ -174,14 +181,19 @@
             }
 
             // If the tab exists, navigate to the desired URL. Otherwise, create a new tab.
+            String title = savedTab.title == null ? "" : savedTab.title;
             if (localTab != null) {
-                maybeNavigateToUrl(localTab, savedTab.url, savedTab.title);
+                maybeNavigateToUrl(localTab, assertNonNull(savedTab.url), title);
             } else {
                 localTab =
                         createTabAndAddToGroup(
-                                savedTab.url, savedTab.title, desiredTabModelIndex, parent, rootId);
+                                assertNonNull(savedTab.url),
+                                title,
+                                desiredTabModelIndex,
+                                parent,
+                                rootId);
                 mTabGroupSyncService.updateLocalTabId(
-                        tabGroup.localId, savedTab.syncId, localTab.getId());
+                        tabGroup.localId, assertNonNull(savedTab.syncId), localTab.getId());
             }
 
             // Move tab if required.
@@ -206,12 +218,13 @@
         Tab newTab =
                 mTabCreationDelegate.createBackgroundTab(
                         url, title, parentTab, desiredTabModelIndex);
+        assert newTab != null;
         RecordUserAction.record("TabGroups.Sync.CreatedNewTab");
 
         List<Tab> tabsToMerge = new ArrayList<>();
         tabsToMerge.add(newTab);
         mTabGroupModelFilter.mergeListOfTabsToGroup(
-                tabsToMerge, getTabModel().getTabById(rootId), /* notify= */ false);
+                tabsToMerge, getTabModel().getTabByIdChecked(rootId), /* notify= */ false);
         return newTab;
     }
 
@@ -293,7 +306,7 @@
         mTabCreationDelegate.navigateToUrl(tab, syncUrl, title, isCurrentTab);
     }
 
-    private Tab getLocalTabInGroup(Integer tabId, int rootId) {
+    private @Nullable Tab getLocalTabInGroup(@Nullable Integer tabId, int rootId) {
         Tab tab = tabId == null ? null : getTabModel().getTabById(tabId);
         // Check if the tab is still attached to the same root ID. If not, it belongs to another
         // group. Don't touch it and rather create a new one in subsequent step.
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/LogUtils.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/LogUtils.java
index f8f3cdb..8519c3e 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/LogUtils.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/LogUtils.java
@@ -6,8 +6,10 @@
 
 import org.chromium.base.Log;
 import org.chromium.build.BuildConfig;
+import org.chromium.build.annotations.NullMarked;
 
 /** Utility methods for logging. All logs should be removed before launch. */
+@NullMarked
 public final class LogUtils {
     /**
      * Called to log a message.
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/NavigationObserver.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/NavigationObserver.java
index 1088bb5..54e042e 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/NavigationObserver.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/NavigationObserver.java
@@ -6,9 +6,11 @@
 
 import android.util.Pair;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver;
+import org.chromium.components.tab_group_sync.LocalTabGroupId;
 import org.chromium.components.tab_group_sync.TabGroupSyncService;
 import org.chromium.content_public.browser.NavigationHandle;
 import org.chromium.url.GURL;
@@ -17,6 +19,7 @@
  * Observes navigations on every tab in the given tab model. Filters to navigations for tabs in tab
  * groups and notifies sync of them.
  */
+@NullMarked
 public class NavigationObserver extends TabModelSelectorTabObserver {
     private static final String TAG = "TG.NavObserver";
     private final TabGroupSyncService mTabGroupSyncService;
@@ -53,7 +56,8 @@
     @Override
     public void onDidFinishNavigationInPrimaryMainFrame(
             Tab tab, NavigationHandle navigationHandle) {
-        if (tab.isIncognito() || tab.getTabGroupId() == null) {
+        LocalTabGroupId localTabGroupId = TabGroupSyncUtils.getLocalTabGroupId(tab);
+        if (tab.isIncognito() || localTabGroupId == null) {
             return;
         }
 
@@ -81,7 +85,7 @@
         Pair<GURL, String> urlAndTitle =
                 TabGroupSyncUtils.getFilteredUrlAndTitle(tab.getUrl(), tab.getTitle());
         mTabGroupSyncService.updateTab(
-                TabGroupSyncUtils.getLocalTabGroupId(tab),
+                localTabGroupId,
                 tab.getId(),
                 urlAndTitle.second,
                 urlAndTitle.first,
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/NavigationTracker.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/NavigationTracker.java
index c00d305..273d21f 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/NavigationTracker.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/NavigationTracker.java
@@ -8,6 +8,7 @@
 
 import org.chromium.base.UserData;
 import org.chromium.base.UserDataHost;
+import org.chromium.build.annotations.NullMarked;
 
 import java.util.Set;
 
@@ -15,6 +16,7 @@
  * Tracks navigations on that were started from sync. These navigations will be ignored to prevent
  * looping notifications back to sync.
  */
+@NullMarked
 public class NavigationTracker {
     /** A counter to generate unique IDs to track navigations within a chrome session. */
     private int mRequestIdCounter;
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/RemoteTabGroupMutationHelper.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/RemoteTabGroupMutationHelper.java
index ab99f7ce..7262635 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/RemoteTabGroupMutationHelper.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/RemoteTabGroupMutationHelper.java
@@ -4,15 +4,18 @@
 
 package org.chromium.chrome.browser.tab_group_sync;
 
-import android.util.Pair;
+import static org.chromium.build.NullUtil.assertNonNull;
+import static org.chromium.build.NullUtil.assumeNonNull;
 
-import androidx.annotation.Nullable;
+import android.util.Pair;
 
 import org.chromium.base.Token;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.supplier.LazyOneshotSupplier;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabGroupColorUtils;
 import org.chromium.chrome.browser.tabmodel.TabGroupModelFilter;
@@ -35,6 +38,7 @@
  * Helper class to create a {@link SavedTabGroup} based on a local tab group. It's a wrapper around
  * {@link TabGroupSyncService} to help with invoking mutation methods.
  */
+@NullMarked
 public class RemoteTabGroupMutationHelper {
     private static final String TAG = "TG.RemoteMutation";
 
@@ -244,7 +248,7 @@
         for (int i = 0; i < group.savedTabs.size() && i < tabs.size(); i++) {
             SavedTabGroupTab savedTab = group.savedTabs.get(i);
             mTabGroupSyncService.updateLocalTabId(
-                    localGroupId, savedTab.syncId, tabs.get(i).getId());
+                    localGroupId, assertNonNull(savedTab.syncId), tabs.get(i).getId());
         }
     }
 
@@ -266,7 +270,7 @@
             LogUtils.log(TAG, "handleWillCloseTabGroup: deleted group");
 
             mTabGroupSyncService.removeLocalTabGroupMapping(groupId, ClosingSource.DELETED_BY_USER);
-            mTabGroupSyncService.removeGroup(savedTabGroup.syncId);
+            mTabGroupSyncService.removeGroup(assertNonNull(savedTabGroup.syncId));
             RecordUserAction.record("TabGroups.Sync.LocalDeleted");
         }
     }
@@ -281,25 +285,23 @@
                 mTabGroupModelFilter.getLazyAllTabGroupIds(
                         tabs, /* includePendingClosures= */ false);
         for (Tab tab : tabs) {
-            Token tabGroupId = tab.getTabGroupId();
-            if (tabGroupId == null) {
-                continue;
-            }
+            LocalTabGroupId localTabGroupId = TabGroupSyncUtils.getLocalTabGroupId(tab);
+            if (localTabGroupId == null) continue;
 
             // If a tab group is being completely hidden we don't want to remove its tabs from sync.
             // This handles that case since isTabGroupHiding will be true. However, to prevent cases
             // where isTabGroupHiding might be set incorrectly we also check that the tab model does
             // not still contain any tabs for the tab group as that would indicate only a subset of
             // the group is being closed.
-            if (mTabGroupModelFilter.isTabGroupHiding(tabGroupId)
-                    && !tabGroupIds.get().contains(tabGroupId)) {
+            if (mTabGroupModelFilter.isTabGroupHiding(localTabGroupId.tabGroupId)
+                    && !assumeNonNull(tabGroupIds.get()).contains(localTabGroupId.tabGroupId)) {
                 continue;
             }
 
             // Remaining tabs will be in a tab group, but the closure event is either:
             // 1. Only a subset of tabs in the group.
             // 2. The group is to be deleted from sync so removing the tabs from sync is ok.
-            mTabGroupSyncService.removeTab(TabGroupSyncUtils.getLocalTabGroupId(tab), tab.getId());
+            mTabGroupSyncService.removeTab(localTabGroupId, tab.getId());
         }
     }
 
@@ -326,8 +328,8 @@
      * @param tab The tab that was restored.
      */
     public void handleTabClosureUndone(Tab tab) {
-        @Nullable Token tabGroupId = tab.getTabGroupId();
-        if (tabGroupId == null) return;
+        LocalTabGroupId localTabGroupId = TabGroupSyncUtils.getLocalTabGroupId(tab);
+        if (localTabGroupId == null) return;
 
         if (!tryUpdatePendingGroupClosure(tab, /* isUndone= */ true)) {
             // Case: subset of tabs in group closed, action undone.
@@ -335,8 +337,7 @@
             // to its synced group.
 
             LogUtils.log(TAG, "handleTabClosureUndone: addBackToGroup");
-            LocalTabGroupId localTabGroupId = TabGroupSyncUtils.getLocalTabGroupId(tab);
-            List<Tab> groupTabs = mTabGroupModelFilter.getTabsInGroup(tab.getTabGroupId());
+            List<Tab> groupTabs = mTabGroupModelFilter.getTabsInGroup(localTabGroupId.tabGroupId);
             int position = groupTabs.indexOf(tab);
             addTab(localTabGroupId, tab, position);
         }
@@ -352,9 +353,9 @@
     }
 
     private boolean tryUpdatePendingGroupClosure(Tab tab, boolean isUndone) {
-        if (tab.getTabGroupId() == null) return false;
-
         LocalTabGroupId localTabGroupId = TabGroupSyncUtils.getLocalTabGroupId(tab);
+        if (localTabGroupId == null) return false;
+
         @Nullable
         PendingTabGroupClosure pendingClosure = mPendingTabGroupClosures.get(localTabGroupId);
 
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelper.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelper.java
index da3073f..3c359ee 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelper.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelper.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.tab_group_sync;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabGroupModelFilter;
@@ -24,6 +25,7 @@
  * been initialized. Primarily reconciles remote group updates / deletions with the local model and
  * local group additions to remote. Also initializes tab ID mappings for the session.
  */
+@NullMarked
 public class StartupHelper {
     private static final String TAG = "TG.StartupHelper";
     private final TabGroupModelFilter mTabGroupModelFilter;
@@ -155,9 +157,10 @@
     private Set<LocalTabGroupId> getLocalTabGroupIds() {
         Set<LocalTabGroupId> localTabGroups = new HashSet<>();
         for (int i = 0; i < getTabModel().getCount(); i++) {
-            Tab tab = getTabModel().getTabAt(i);
-            if (tab.getTabGroupId() == null) continue;
-            localTabGroups.add(TabGroupSyncUtils.getLocalTabGroupId(tab));
+            Tab tab = getTabModel().getTabAtChecked(i);
+            LocalTabGroupId localTabGroupId = TabGroupSyncUtils.getLocalTabGroupId(tab);
+            if (localTabGroupId == null) continue;
+            localTabGroups.add(localTabGroupId);
         }
         return localTabGroups;
     }
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabCreationDelegateImpl.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabCreationDelegateImpl.java
index 0cb8d9d..aa80b4f8 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabCreationDelegateImpl.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabCreationDelegateImpl.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.tab_group_sync;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabLaunchType;
 import org.chromium.chrome.browser.tab_group_sync.TabGroupSyncControllerImpl.TabCreationDelegate;
@@ -15,6 +17,7 @@
  * Utility class for creating and navigation a tab. Designed to handle creating tabs in background
  * and deferring navigation until the user switches back to the tab.
  */
+@NullMarked
 public class TabCreationDelegateImpl implements TabCreationDelegate {
     private static final String TAG = "TG.TabCreationDelegate";
 
@@ -33,7 +36,8 @@
     }
 
     @Override
-    public Tab createBackgroundTab(GURL url, String title, Tab parent, int position) {
+    public @Nullable Tab createBackgroundTab(
+            GURL url, String title, @Nullable Tab parent, int position) {
         LogUtils.log(TAG, "createBackgroundTab " + url);
         LoadUrlParams loadUrlParams = new LoadUrlParams(url);
         mNavigationTracker.setNavigationWasFromSync(loadUrlParams.getNavigationHandleUserData());
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncControllerImpl.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncControllerImpl.java
index 8be79f5..4148b3a 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncControllerImpl.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncControllerImpl.java
@@ -4,10 +4,13 @@
 
 package org.chromium.chrome.browser.tab_group_sync;
 
-import androidx.annotation.Nullable;
+import static org.chromium.build.NullUtil.assertNonNull;
 
 import org.chromium.base.CallbackController;
 import org.chromium.base.supplier.Supplier;
+import org.chromium.build.annotations.MonotonicNonNull;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabGroupModelFilter;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
@@ -26,6 +29,7 @@
  * changes to remote. This is a per-activity object and hence responsible for handling updates for
  * current window only.
  */
+@NullMarked
 public final class TabGroupSyncControllerImpl
         implements TabGroupSyncController, TabGroupUiActionHandler {
     /**
@@ -45,9 +49,10 @@
          * @param title The title of the tab to be shown.
          * @param parent The parent of the tab.
          * @param position The position of the tab in the tab model.
-         * @return The tab created.
+         * @return The tab created or null if the creation failed.
          */
-        Tab createBackgroundTab(GURL url, String title, Tab parent, int position);
+        @Nullable Tab createBackgroundTab(
+                GURL url, String title, @Nullable Tab parent, int position);
 
         /**
          * Called to navigate a tab to a given URL and set its title. If the tab is in foreground,
@@ -61,6 +66,7 @@
         void navigateToUrl(Tab tab, GURL url, String title, boolean isForegroundTab);
     }
 
+    private final CallbackController mCallbackController = new CallbackController();
     private final TabModelSelector mTabModelSelector;
     private final TabGroupSyncService mTabGroupSyncService;
     private final PrefService mPrefService;
@@ -70,11 +76,10 @@
     private final TabCreationDelegate mTabCreationDelegate;
     private final LocalTabGroupMutationHelper mLocalMutationHelper;
     private final RemoteTabGroupMutationHelper mRemoteMutationHelper;
-    private TabGroupSyncLocalObserver mLocalObserver;
-    private TabGroupSyncRemoteObserver mRemoteObserver;
-    private StartupHelper mStartupHelper;
+    private @MonotonicNonNull TabGroupSyncLocalObserver mLocalObserver;
+    private @MonotonicNonNull TabGroupSyncRemoteObserver mRemoteObserver;
+    private @MonotonicNonNull StartupHelper mStartupHelper;
     private boolean mSyncBackendInitialized;
-    private CallbackController mCallbackController = new CallbackController();
 
     private final TabGroupSyncService.Observer mSyncInitObserver =
             new TabGroupSyncService.Observer() {
@@ -116,13 +121,14 @@
 
         mNavigationTracker = new NavigationTracker();
         mTabGroupModelFilter =
-                tabModelSelector
-                        .getTabGroupModelFilterProvider()
-                        .getTabGroupModelFilter(/* isIncognito= */ false);
+                assertNonNull(
+                        tabModelSelector
+                                .getTabGroupModelFilterProvider()
+                                .getTabGroupModelFilter(/* isIncognito= */ false));
+
         mTabCreationDelegate =
                 new TabCreationDelegateImpl(
                         mTabGroupModelFilter.getTabModel().getTabCreator(), mNavigationTracker);
-
         mLocalMutationHelper =
                 new LocalTabGroupMutationHelper(
                         mTabGroupModelFilter, mTabGroupSyncService, mTabCreationDelegate);
@@ -152,6 +158,8 @@
         SavedTabGroup savedTabGroup = mTabGroupSyncService.getGroup(syncId);
         if (savedTabGroup == null || savedTabGroup.localId != null) return;
 
+        assert mLocalObserver != null;
+
         mLocalObserver.enableObservers(false);
         mLocalMutationHelper.createNewTabGroup(savedTabGroup, OpeningSource.OPENED_FROM_REVISIT_UI);
         mLocalObserver.enableObservers(true);
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncIntegrationTestHelper.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncIntegrationTestHelper.java
index 9dc1faaa..e4e58d1 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncIntegrationTestHelper.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncIntegrationTestHelper.java
@@ -8,10 +8,14 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import static org.chromium.build.NullUtil.assertNonNull;
 import static org.chromium.chrome.browser.tab_group_sync.TabGroupSyncUtils.NEW_TAB_TITLE;
 
 import com.google.protobuf.InvalidProtocolBufferException;
 
+import org.chromium.build.annotations.EnsuresNonNull;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.sync.SyncTestRule;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabGroupModelFilter;
@@ -35,6 +39,7 @@
 import java.util.Set;
 
 /** Helper class for integration tests. */
+@NullMarked
 public class TabGroupSyncIntegrationTestHelper {
     public static final String TAB_GROUP_SYNC_DATA_TYPE = "Saved Tab Group";
 
@@ -76,7 +81,7 @@
         public long position;
 
         // Required for connecting with tabs. We don't use it for validation.
-        public String syncId;
+        public @Nullable String syncId;
 
         /**
          * @param title The title of the tab.
@@ -97,7 +102,7 @@
         public List<TabInfo> tabs = new ArrayList<>();
 
         // Required for connecting with tabs. We don't use it for validation.
-        public String syncId;
+        public @Nullable String syncId;
 
         /**
          * @param title The title of the tab group.
@@ -131,6 +136,7 @@
     }
 
     /** Resets the GUID iterator for creating groups. */
+    @EnsuresNonNull("mGuidIterator")
     public void resetGuidIterator() {
         mGuidIterator = sGuids.iterator();
     }
@@ -209,7 +215,7 @@
                             specifics.getTab().getTitle(),
                             specifics.getTab().getUrl(),
                             specifics.getTab().getPosition());
-            groupInfos.get(groupGuid).addTab(tabInfo);
+            assertNonNull(groupInfos.get(groupGuid)).addTab(tabInfo);
         }
 
         return new ArrayList<>(groupInfos.values());
@@ -273,15 +279,16 @@
 
     /** Returns the regular tab model filter. */
     public TabGroupModelFilter getTabGroupFilter() {
-        return mSyncTestRule
-                .getActivity()
-                .getTabModelSelector()
-                .getTabGroupModelFilterProvider()
-                .getTabGroupModelFilter(false);
+        return assertNonNull(
+                mSyncTestRule
+                        .getActivity()
+                        .getTabModelSelector()
+                        .getTabGroupModelFilterProvider()
+                        .getTabGroupModelFilter(false));
     }
 
     /** Gets the {@link SyncEntity} for a particular sync GUID. */
-    public SyncEntity getSyncEntityWithUuid(String guid) {
+    public @Nullable SyncEntity getSyncEntityWithUuid(String guid) {
         List<SyncEntity> entities = getSyncEntities();
         for (SyncEntity entity : entities) {
             if (entity.getSpecifics().getSavedTabGroup().getGuid().equals(guid)) {
@@ -406,7 +413,7 @@
         Set<Integer> rootIds = new HashSet<>();
         TabModel tabModel = getTabModel();
         for (int i = 0; i < tabModel.getCount(); i++) {
-            Tab tab = tabModel.getTabAt(i);
+            Tab tab = tabModel.getTabAtChecked(i);
             if (tab.getTabGroupId() == null) continue;
             rootIds.add(tab.getRootId());
         }
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncLocalObserver.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncLocalObserver.java
index 0e6b1d29..6654769 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncLocalObserver.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncLocalObserver.java
@@ -4,11 +4,13 @@
 
 package org.chromium.chrome.browser.tab_group_sync;
 
-import androidx.annotation.Nullable;
+import static org.chromium.build.NullUtil.assertNonNull;
 
 import org.chromium.base.Log;
 import org.chromium.base.Token;
 import org.chromium.base.metrics.RecordUserAction;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabSelectionType;
 import org.chromium.chrome.browser.tabmodel.TabGroupModelFilter;
@@ -32,6 +34,7 @@
  * startup completion signals from both local tab model and {@link TabGroupSyncService} and 2.
  * Modifies local tab model to ensure that both local and sync version of tab groups are equivalent.
  */
+@NullMarked
 public final class TabGroupSyncLocalObserver {
     private static final String TAG = "TG.LocalObserver";
     private final TabGroupModelFilter mTabGroupModelFilter;
@@ -100,13 +103,12 @@
             @Override
             public void didAddTab(
                     Tab tab, int type, int creationState, boolean markedForSelection) {
-                if (!mIsObserving || tab.getTabGroupId() == null) return;
+                LocalTabGroupId localTabGroupId = TabGroupSyncUtils.getLocalTabGroupId(tab);
+                if (!mIsObserving || localTabGroupId == null) return;
                 LogUtils.log(TAG, "didAddTab");
 
                 mRemoteTabGroupMutationHelper.addTab(
-                        TabGroupSyncUtils.getLocalTabGroupId(tab),
-                        tab,
-                        mTabGroupModelFilter.getIndexOfTabInGroup(tab));
+                        localTabGroupId, tab, mTabGroupModelFilter.getIndexOfTabInGroup(tab));
             }
 
             @Override
@@ -154,10 +156,7 @@
             @Override
             public void didSelectTab(Tab tab, @TabSelectionType int type, int lastId) {
                 // Intentionally observing all tab selections regardless of their origin.
-                LocalTabGroupId localTabGroupId =
-                        mTabGroupModelFilter.isTabInTabGroup(tab)
-                                ? TabGroupSyncUtils.getLocalTabGroupId(tab)
-                                : null;
+                LocalTabGroupId localTabGroupId = TabGroupSyncUtils.getLocalTabGroupId(tab);
 
                 // We notify TabGroupSyncService of the currently selected tab regardless of
                 // whether it's part of a tab group or not. The accurate tracking of currently
@@ -169,17 +168,20 @@
                 SavedTabGroup savedGroup = mTabGroupSyncService.getGroup(localTabGroupId);
                 if (savedGroup == null) return;
 
-                if (mTabGroupSyncService.isRemoteDevice(savedGroup.creatorCacheGuid)) {
+                String creatorCacheGuid = savedGroup.creatorCacheGuid;
+                if (creatorCacheGuid != null
+                        && mTabGroupSyncService.isRemoteDevice(creatorCacheGuid)) {
                     RecordUserAction.record("TabGroups.Sync.SelectedTabInRemotelyCreatedGroup");
                 } else {
                     RecordUserAction.record("TabGroups.Sync.SelectedTabInLocallyCreatedGroup");
                 }
 
                 SavedTabGroupTab savedTab = getSavedTab(savedGroup, tab.getId());
+                String lastUpdaterCacheGuid =
+                        savedTab != null ? savedTab.lastUpdaterCacheGuid : null;
                 boolean tabWasLastUsedRemotely =
-                        savedTab != null
-                                && mTabGroupSyncService.isRemoteDevice(
-                                        savedGroup.lastUpdaterCacheGuid);
+                        lastUpdaterCacheGuid != null
+                                && mTabGroupSyncService.isRemoteDevice(lastUpdaterCacheGuid);
                 if (tabWasLastUsedRemotely) {
                     int tabId = tab.getId();
                     boolean wasAdded = mTabIdsSelectedInSession.add(tabId);
@@ -204,7 +206,7 @@
             }
 
             @Override
-            public void didChangeTabGroupTitle(int rootId, String newTitle) {
+            public void didChangeTabGroupTitle(int rootId, @Nullable String newTitle) {
                 if (!mIsObserving) return;
                 LogUtils.log(TAG, "didChangeTabGroupTitle, rootId = " + rootId);
                 updateVisualData(
@@ -218,7 +220,8 @@
                 LogUtils.log(TAG, "didMergeTabToGroup, rootId = " + rootId);
 
                 LocalTabGroupId tabGroupRootId =
-                        TabGroupSyncUtils.getLocalTabGroupId(mTabGroupModelFilter, rootId);
+                        assertNonNull(
+                                TabGroupSyncUtils.getLocalTabGroupId(mTabGroupModelFilter, rootId));
                 if (groupExistsInSync(tabGroupRootId)) {
                     int positionInGroup = mTabGroupModelFilter.getIndexOfTabInGroup(movedTab);
                     mRemoteTabGroupMutationHelper.addTab(tabGroupRootId, movedTab, positionInGroup);
@@ -231,6 +234,7 @@
             public void didMoveWithinGroup(
                     Tab movedTab, int tabModelOldIndex, int tabModelNewIndex) {
                 if (!mIsObserving) return;
+
                 LogUtils.log(
                         TAG,
                         "didMoveWithinGroup, tabModelOldIndex = "
@@ -241,8 +245,9 @@
                 // The tab position was changed. Update sync.
                 int positionInGroup = mTabGroupModelFilter.getIndexOfTabInGroup(movedTab);
                 int rootId = movedTab.getRootId();
-                LocalTabGroupId tabGroupId =
-                        TabGroupSyncUtils.getLocalTabGroupId(mTabGroupModelFilter, rootId);
+                LocalTabGroupId localTabGroupId =
+                        assertNonNull(
+                                TabGroupSyncUtils.getLocalTabGroupId(mTabGroupModelFilter, rootId));
                 Log.w(
                         TAG,
                         String.format(
@@ -250,9 +255,9 @@
                                 "movedTab positionInGroup %d out of %d",
                                 positionInGroup,
                                 mTabGroupModelFilter.getTabCountForGroup(
-                                        movedTab.getTabGroupId())));
+                                        localTabGroupId.tabGroupId)));
                 mRemoteTabGroupMutationHelper.moveTab(
-                        tabGroupId, movedTab.getId(), positionInGroup);
+                        localTabGroupId, movedTab.getId(), positionInGroup);
             }
 
             @Override
@@ -275,8 +280,9 @@
                 if (!mIsObserving) return;
                 LogUtils.log(TAG, "didCreateNewGroup");
                 LocalTabGroupId localTabGroupId =
-                        TabGroupSyncUtils.getLocalTabGroupId(
-                                mTabGroupModelFilter, destinationTab.getRootId());
+                        assertNonNull(
+                                TabGroupSyncUtils.getLocalTabGroupId(
+                                        mTabGroupModelFilter, destinationTab.getRootId()));
                 if (groupExistsInSync(localTabGroupId)) return;
 
                 mRemoteTabGroupMutationHelper.createRemoteTabGroup(localTabGroupId);
@@ -314,18 +320,18 @@
         };
     }
 
-    private void updateVisualData(LocalTabGroupId tabGroupId) {
+    private void updateVisualData(@Nullable LocalTabGroupId tabGroupId) {
         // During group creation from sync, we set the title and color before the group is actually
         // created. Hence, tab group ID could be null.
         if (tabGroupId == null) return;
         mRemoteTabGroupMutationHelper.updateVisualData(tabGroupId);
     }
 
-    private boolean groupExistsInSync(LocalTabGroupId rootId) {
-        return mTabGroupSyncService.getGroup(rootId) != null;
+    private boolean groupExistsInSync(LocalTabGroupId localTabGroupId) {
+        return mTabGroupSyncService.getGroup(localTabGroupId) != null;
     }
 
-    private SavedTabGroupTab getSavedTab(SavedTabGroup savedGroup, int tabId) {
+    private @Nullable SavedTabGroupTab getSavedTab(SavedTabGroup savedGroup, int tabId) {
         for (SavedTabGroupTab savedTab : savedGroup.savedTabs) {
             if (savedTab.localId != null && savedTab.localId == tabId) return savedTab;
         }
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncLocalObserverUnitTest.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncLocalObserverUnitTest.java
index 8f37fbf..d38e25f 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncLocalObserverUnitTest.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncLocalObserverUnitTest.java
@@ -168,6 +168,7 @@
         savedTab2.localId = TAB_ID_2;
         savedGroup.savedTabs.add(savedTab1);
         savedGroup.savedTabs.add(savedTab2);
+        savedTab2.lastUpdaterCacheGuid = remoteGuid;
         when(mTabGroupSyncService.getGroup(LOCAL_TAB_GROUP_ID_1)).thenReturn(savedGroup);
         when(mTabGroupSyncService.isRemoteDevice(remoteGuid)).thenReturn(true);
 
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserver.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserver.java
index f304139..61fc727 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserver.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserver.java
@@ -6,10 +6,10 @@
 
 import android.text.TextUtils;
 
-import androidx.annotation.Nullable;
-
 import org.chromium.base.Callback;
 import org.chromium.base.supplier.Supplier;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.tabmodel.TabGroupModelFilter;
@@ -27,6 +27,7 @@
  * to the tab model. Additionally manages disabling and enabling local observers to avoid looping
  * updates back to sync. Updates for other windows are ignored.
  */
+@NullMarked
 public final class TabGroupSyncRemoteObserver implements TabGroupSyncService.Observer {
     private static final String TAG = "TG.RemoteObserver";
     private final TabGroupModelFilter mTabGroupModelFilter;
@@ -77,6 +78,7 @@
     public void onTabGroupAdded(SavedTabGroup tabGroup, @TriggerSource int source) {
         if (source != TriggerSource.REMOTE) return;
         if (!mIsActiveWindowSupplier.get()) return;
+        if (tabGroup.syncId == null) return;
         if (mTabGroupSyncService.wasTabGroupClosedLocally(tabGroup.syncId)) return;
 
         LogUtils.log(TAG, "onTabGroupAdded, tabGroup = " + tabGroup);
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncServiceFactory.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncServiceFactory.java
index 90f46d7..40b5dc09 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncServiceFactory.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncServiceFactory.java
@@ -26,12 +26,12 @@
      * @return The {@link TabGroupSyncService} for the given profile.
      */
     public static @Nullable TabGroupSyncService getForProfile(Profile profile) {
+        // Assert this before returning test value so that incorrect usage can be caught in tests.
+        assert !profile.isOffTheRecord();
         if (sTabGroupSyncServiceForTesting != null) {
             return sTabGroupSyncServiceForTesting;
         }
 
-        assert !profile.isOffTheRecord();
-
         if (!ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_GROUP_SYNC_ANDROID)) {
             return null;
         }
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncTestUtils.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncTestUtils.java
index 99121069..81e00a0 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncTestUtils.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncTestUtils.java
@@ -4,11 +4,13 @@
 
 package org.chromium.chrome.browser.tab_group_sync;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.tab_group_sync.SavedTabGroup;
 import org.chromium.components.tab_group_sync.SavedTabGroupTab;
 import org.chromium.url.GURL;
 
 /** Test utils for tab group sync. */
+@NullMarked
 public class TabGroupSyncTestUtils {
     /** Create a test saved tab group. */
     public static SavedTabGroup createSavedTabGroup() {
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncUtils.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncUtils.java
index 129d0e58..8084a543 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncUtils.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncUtils.java
@@ -7,14 +7,14 @@
 import android.text.TextUtils;
 import android.util.Pair;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.jni_zero.JniType;
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.Token;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabGroupModelFilter;
@@ -34,6 +34,7 @@
 import java.util.List;
 
 /** Utility methods for tab group sync. */
+@NullMarked
 public final class TabGroupSyncUtils {
     // The URL written to sync when the local URL isn't in a syncable format, i.e. HTTP or HTTPS.
     public static final GURL UNSAVEABLE_URL_OVERRIDE = new GURL(UrlConstants.NTP_NON_NATIVE_URL);
@@ -55,7 +56,8 @@
     }
 
     /** Conversion method to get a {@link LocalTabGroupId} from a root ID. */
-    public static LocalTabGroupId getLocalTabGroupId(TabGroupModelFilter filter, int rootId) {
+    public static @Nullable LocalTabGroupId getLocalTabGroupId(
+            TabGroupModelFilter filter, int rootId) {
         Token tabGroupId = filter.getTabGroupIdFromRootId(rootId);
         return tabGroupId == null ? null : new LocalTabGroupId(tabGroupId);
     }
@@ -67,8 +69,9 @@
     }
 
     /** Util method to get a {@link LocalTabGroupId} from a tab. */
-    public static LocalTabGroupId getLocalTabGroupId(Tab tab) {
-        return new LocalTabGroupId(tab.getTabGroupId());
+    public static @Nullable LocalTabGroupId getLocalTabGroupId(Tab tab) {
+        Token tabGroupId = tab.getTabGroupId();
+        return tabGroupId == null ? null : new LocalTabGroupId(tabGroupId);
     }
 
     /** Utility method to filter out URLs not suitable for tab group sync. */
@@ -110,7 +113,7 @@
         for (String syncGroupId : tabGroupSyncService.getAllGroupIds()) {
             SavedTabGroup savedTabGroup = tabGroupSyncService.getGroup(syncGroupId);
             // If there is no local ID the group is already hidden so this is a no-op.
-            if (savedTabGroup.localId == null) continue;
+            if (savedTabGroup == null || savedTabGroup.localId == null) continue;
 
             if (!isInCurrentWindow(filter, savedTabGroup.localId)) {
                 tabGroupSyncService.removeLocalTabGroupMapping(
@@ -145,10 +148,8 @@
      * @param tabGroupSyncService The sync service to get tab group data form.
      * @return The group data object.
      */
-    public static SavedTabGroup getSavedTabGroupFromTabId(
-            int tabId,
-            @NonNull TabModel tabModel,
-            @NonNull TabGroupSyncService tabGroupSyncService) {
+    public static @Nullable SavedTabGroup getSavedTabGroupFromTabId(
+            int tabId, TabModel tabModel, TabGroupSyncService tabGroupSyncService) {
         @Nullable Tab tab = tabModel.getTabById(tabId);
         if (tab == null || tab.getTabGroupId() == null) return null;
         LocalTabGroupId localTabGroupId = new LocalTabGroupId(tab.getTabGroupId());
@@ -181,11 +182,12 @@
      * @param navigationHandle Navigation handle to retrieve the redirect chain from.
      */
     public static void onDidFinishNavigation(Tab tab, NavigationHandle navigationHandle) {
-        if (tab.getTabGroupId() == null) return;
+        LocalTabGroupId localTabGroupId = getLocalTabGroupId(tab);
+        if (localTabGroupId == null) return;
         TabGroupSyncUtilsJni.get()
                 .onDidFinishNavigation(
                         tab.getProfile(),
-                        getLocalTabGroupId(tab),
+                        localTabGroupId,
                         tab.getId(),
                         navigationHandle.nativeNavigationHandlePtr());
     }
@@ -197,11 +199,12 @@
      * @param navigationHandle Navigation handle to retrieve the redirect chain from.
      */
     public static void updateTabRedirectChain(Tab tab, NavigationHandle navigationHandle) {
-        if (tab.getTabGroupId() == null) return;
+        LocalTabGroupId localTabGroupId = getLocalTabGroupId(tab);
+        if (localTabGroupId == null) return;
         TabGroupSyncUtilsJni.get()
                 .updateTabRedirectChain(
                         tab.getProfile(),
-                        getLocalTabGroupId(tab),
+                        localTabGroupId,
                         tab.getId(),
                         navigationHandle.nativeNavigationHandlePtr());
     }
@@ -214,10 +217,10 @@
      * @return true if the URL belongs to the tab's redirect chain, or false otherwise.
      */
     public static boolean isUrlInTabRedirectChain(Tab tab, GURL url) {
-        if (tab.getTabGroupId() == null) return false;
+        LocalTabGroupId localTabGroupId = getLocalTabGroupId(tab);
+        if (localTabGroupId == null) return false;
         return TabGroupSyncUtilsJni.get()
-                .isUrlInTabRedirectChain(
-                        tab.getProfile(), getLocalTabGroupId(tab), tab.getId(), url);
+                .isUrlInTabRedirectChain(tab.getProfile(), localTabGroupId, tab.getId(), url);
     }
 
     @NativeMethods
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TestTabGroupSyncService.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TestTabGroupSyncService.java
index 1b32d7c..efbd13d 100644
--- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TestTabGroupSyncService.java
+++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TestTabGroupSyncService.java
@@ -6,9 +6,9 @@
 
 import android.text.TextUtils;
 
-import androidx.annotation.NonNull;
-
 import org.chromium.base.Callback;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.tab_group_sync.ClosingSource;
 import org.chromium.components.tab_group_sync.EventDetails;
 import org.chromium.components.tab_group_sync.LocalTabGroupId;
@@ -21,6 +21,7 @@
 import java.util.List;
 
 /** Test implementation of {@link TabGroupSyncService} that can be used for unit tests. */
+@NullMarked
 class TestTabGroupSyncService implements TabGroupSyncService {
     public static final String SYNC_ID_1 = "SYNC_ID_1";
     public static final String LOCAL_DEVICE_CACHE_GUID = "LocalDevice";
@@ -45,7 +46,7 @@
     public void removeGroup(String syncTabGroupId) {}
 
     @Override
-    public void updateVisualData(LocalTabGroupId tabGroupId, @NonNull String title, int color) {}
+    public void updateVisualData(LocalTabGroupId tabGroupId, String title, int color) {}
 
     @Override
     public void addTab(
@@ -62,13 +63,14 @@
     public void moveTab(LocalTabGroupId tabGroupId, int tabId, int newIndexInGroup) {}
 
     @Override
-    public void onTabSelected(LocalTabGroupId tabGroupId, int tabId, String tabTitle) {}
+    public void onTabSelected(@Nullable LocalTabGroupId tabGroupId, int tabId, String tabTitle) {}
 
     @Override
-    public void makeTabGroupShared(LocalTabGroupId tabGroupId, @NonNull String collaborationId) {}
+    public void makeTabGroupShared(LocalTabGroupId tabGroupId, String collaborationId) {}
 
     @Override
-    public void aboutToUnShareTabGroup(LocalTabGroupId tabGroupId, Callback<Boolean> callback) {}
+    public void aboutToUnShareTabGroup(
+            LocalTabGroupId tabGroupId, @Nullable Callback<Boolean> callback) {}
 
     @Override
     public void onTabGroupUnShareComplete(LocalTabGroupId tabGroupId, boolean success) {}
@@ -79,7 +81,7 @@
     }
 
     @Override
-    public SavedTabGroup getGroup(String syncGroupId) {
+    public @Nullable SavedTabGroup getGroup(String syncGroupId) {
         for (SavedTabGroup group : mTabGroups) {
             if (syncGroupId.equals(group.syncId)) return group;
         }
@@ -87,7 +89,7 @@
     }
 
     @Override
-    public SavedTabGroup getGroup(LocalTabGroupId localGroupId) {
+    public @Nullable SavedTabGroup getGroup(LocalTabGroupId localGroupId) {
         for (SavedTabGroup group : mTabGroups) {
             if (localGroupId.equals(group.localId)) return group;
         }
@@ -133,4 +135,7 @@
 
     @Override
     public void recordTabGroupEvent(EventDetails eventDetails) {}
+
+    @Override
+    public void updateArchivalStatus(String syncTabGroupId, boolean archivalStatus) {}
 }
diff --git a/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetBridge.java b/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetBridge.java
index 55b1f5bc..42e42863 100644
--- a/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetBridge.java
+++ b/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetBridge.java
@@ -11,6 +11,7 @@
 import org.jni_zero.CalledByNative;
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetControllerProvider;
 import org.chromium.ui.base.WindowAndroid;
@@ -18,6 +19,7 @@
 import java.lang.ref.WeakReference;
 
 /** JNI wrapper for C++ NoPasskeysBottomSheetBridge. Delegates calls from native to Java. */
+@NullMarked
 class NoPasskeysBottomSheetBridge implements NoPasskeysBottomSheetCoordinator.NativeDelegate {
     private final NoPasskeysBottomSheetCoordinator mNoPasskeysSheet;
     private long mNativeBridge;
diff --git a/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetContent.java b/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetContent.java
index c56ed0b25..8ef74cac 100644
--- a/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetContent.java
+++ b/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetContent.java
@@ -15,20 +15,21 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.password_manager.PasswordManagerResourceProviderFactory;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
 import org.chromium.ui.base.LocalizationUtils;
 
 /** Implements the content for the no passkeys bottom sheet. */
+@NullMarked
 class NoPasskeysBottomSheetContent implements BottomSheetContent {
     private final Delegate mDelegate;
     private final Context mContext;
     private final String mOrigin;
-    private View mContentView;
+    private @Nullable View mContentView;
 
     /** User actions delegated by this bottom sheet. */
     interface Delegate {
@@ -105,9 +106,8 @@
         return false;
     }
 
-    @Nullable
     @Override
-    public View getToolbarView() {
+    public @Nullable View getToolbarView() {
         return null;
     }
 
@@ -152,7 +152,7 @@
     }
 
     @Override
-    public @NonNull String getSheetContentDescription(Context context) {
+    public String getSheetContentDescription(Context context) {
         return context.getString(R.string.no_passkeys_sheet_content_description);
     }
 
diff --git a/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetCoordinator.java b/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetCoordinator.java
index fc5a953..670f3d3 100644
--- a/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetCoordinator.java
+++ b/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetCoordinator.java
@@ -6,6 +6,7 @@
 
 import android.content.Context;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 
 import java.lang.ref.WeakReference;
@@ -15,6 +16,7 @@
  *
  * <p>This component shows a bottom sheet to inform the user that no passkeys are available.
  */
+@NullMarked
 public class NoPasskeysBottomSheetCoordinator {
     interface NativeDelegate {
         /** Notifies the native side when the user selects "Use another device" option. */
diff --git a/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetMediator.java b/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetMediator.java
index 5b6a0c7..dc82804 100644
--- a/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetMediator.java
+++ b/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetMediator.java
@@ -4,19 +4,22 @@
 
 package org.chromium.chrome.browser.touch_to_fill.no_passkeys;
 
-import androidx.annotation.Nullable;
+import static org.chromium.build.NullUtil.assumeNonNull;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 
 import java.lang.ref.WeakReference;
 
 /** Mediator class for the no passkeys bottom sheet. */
+@NullMarked
 class NoPasskeysBottomSheetMediator implements NoPasskeysBottomSheetContent.Delegate {
     private final WeakReference<BottomSheetController> mBottomSheetController;
 
     private @Nullable BottomSheetContent mBottomSheetContent;
-    private @Nullable NoPasskeysBottomSheetCoordinator.NativeDelegate mNativeDelegate;
+    private NoPasskeysBottomSheetCoordinator.@Nullable NativeDelegate mNativeDelegate;
 
     /**
      * Creates the mediator.
@@ -40,11 +43,12 @@
      */
     boolean show(@Nullable BottomSheetContent bottomSheetContent) {
         assert bottomSheetContent != null;
-        if (mBottomSheetController.get() == null) {
+        BottomSheetController bottomSheetController = mBottomSheetController.get();
+        if (bottomSheetController == null) {
             return false;
         }
         mBottomSheetContent = bottomSheetContent;
-        return mBottomSheetController.get().requestShowContent(mBottomSheetContent, true);
+        return bottomSheetController.requestShowContent(mBottomSheetContent, true);
     }
 
     /**
@@ -82,6 +86,9 @@
         }
         mNativeDelegate.onDismissed();
         mNativeDelegate = null; // Don't call the callback repeatedly!
-        mBottomSheetController.get().hideContent(mBottomSheetContent, true);
+        BottomSheetController bottomSheetController = mBottomSheetController.get();
+        assumeNonNull(bottomSheetController);
+        assert mBottomSheetContent != null;
+        bottomSheetController.hideContent(mBottomSheetContent, true);
     }
 }
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java
index 41ea594..0d64c30c 100644
--- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java
+++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.ui.appmenu;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.animation.Animator;
 import android.animation.AnimatorSet;
 import android.content.Context;
@@ -34,7 +36,6 @@
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.IdRes;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.content.res.AppCompatResources;
 
@@ -43,6 +44,12 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
+import org.chromium.build.annotations.EnsuresNonNullIf;
+import org.chromium.build.annotations.Initializer;
+import org.chromium.build.annotations.MonotonicNonNull;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+import org.chromium.build.annotations.RequiresNonNull;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider.ControlsPosition;
 import org.chromium.chrome.browser.ui.appmenu.internal.R;
 import org.chromium.components.browser_ui.styles.ChromeColors;
@@ -65,11 +72,12 @@
  *   - Only visible MenuItems are shown.
  *   - Disabled items are grayed out.
  */
+@NullMarked
 class AppMenu implements OnItemClickListener, OnKeyListener, AppMenuClickHandler {
     private static final float LAST_ITEM_SHOW_FRACTION = 0.5f;
 
     /** A means of reporting an exception/stack without crashing. */
-    private static Callback<Throwable> sExceptionReporter;
+    private static @MonotonicNonNull Callback<Throwable> sExceptionReporter;
 
     private final int mItemRowHeight;
     private final int mVerticalFadeDistance;
@@ -77,14 +85,14 @@
     private final int mChipHighlightExtension;
     private final int[] mTempLocation;
 
-    private PopupWindow mPopup;
-    private ListView mListView;
-    private ModelListAdapter mAdapter;
+    private @Nullable PopupWindow mPopup;
+    private @Nullable ListView mListView;
+    private @Nullable ModelListAdapter mAdapter;
     private AppMenuHandlerImpl mHandler;
-    private View mFooterView;
+    private @Nullable View mFooterView;
     private int mCurrentScreenRotation = -1;
     private boolean mIsByPermanentButton;
-    private AnimatorSet mMenuItemEnterAnimator;
+    private @Nullable AnimatorSet mMenuItemEnterAnimator;
     private long mMenuShownTimeMs;
     private boolean mSelectedItemBeforeDismiss;
     private ModelList mModelList;
@@ -119,7 +127,7 @@
      */
     public void menuItemContentChanged(int menuRowId) {
         // Make sure we have all the valid state objects we need.
-        if (mAdapter == null || mModelList == null || mPopup == null || mListView == null) {
+        if (mAdapter == null || mPopup == null || mListView == null) {
             return;
         }
 
@@ -179,7 +187,7 @@
             @IdRes int footerResourceId,
             @IdRes int headerResourceId,
             @IdRes int groupDividerResourceId,
-            Integer highlightedItemId,
+            @Nullable Integer highlightedItemId,
             @Nullable List<CustomViewBinder> customViewBinders,
             boolean isMenuIconAtStart,
             @ControlsPosition int controlsPosition) {
@@ -300,6 +308,7 @@
 
         // Set the adapter after the header is added to avoid crashes on JellyBean.
         // See crbug.com/761726.
+        assert mAdapter != null;
         mListView.setAdapter(mAdapter);
 
         anchorView.getLocationOnScreen(mTempLocation);
@@ -377,6 +386,7 @@
                                 int oldTop,
                                 int oldRight,
                                 int oldBottom) {
+                            assumeNonNull(mListView);
                             mListView.removeOnLayoutChangeListener(this);
                             runMenuItemEnterAnimations();
                         }
@@ -500,6 +510,7 @@
      * @param newModelList The new menu item list will be displayed.
      * @param adapter The adapter for visible items in the Menu.
      */
+    @Initializer
     void updateMenu(ModelList newModelList, ModelListAdapter adapter) {
         mModelList = newModelList;
         mAdapter = adapter;
@@ -515,6 +526,7 @@
     /**
      * @return Whether the app menu is currently showing.
      */
+    @EnsuresNonNullIf("mPopup")
     boolean isShowing() {
         if (mPopup == null) {
             return false;
@@ -525,14 +537,14 @@
     /**
      * @return {@link PopupWindow} that displays all the menu options and optional footer.
      */
-    PopupWindow getPopup() {
+    @Nullable PopupWindow getPopup() {
         return mPopup;
     }
 
     /**
      * @return {@link ListView} that contains all of the menu options.
      */
-    ListView getListView() {
+    @Nullable ListView getListView() {
         return mListView;
     }
 
@@ -549,7 +561,7 @@
      * @param itemId The id of the menu item to find.
      * @return The {@link PropertyModel} has the given id. null if not found.
      */
-    PropertyModel getMenuItemPropertyModel(int itemId) {
+    @Nullable PropertyModel getMenuItemPropertyModel(int itemId) {
         for (int i = 0; i < mModelList.size(); i++) {
             PropertyModel model = mModelList.get(i).model;
             if (model.get(AppMenuItemProperties.MENU_ITEM_ID) == itemId) {
@@ -572,6 +584,7 @@
         if (mAdapter != null) mAdapter.notifyDataSetChanged();
     }
 
+    @RequiresNonNull("mPopup")
     private void setMenuHeight(
             List<Integer> menuItemIds,
             List<Integer> heightList,
@@ -613,7 +626,7 @@
                             + headerHeight;
             PostTask.postTask(
                     TaskTraits.BEST_EFFORT_MAY_BLOCK,
-                    () -> sExceptionReporter.onResult(new Throwable(logMessage)));
+                    () -> assumeNonNull(sExceptionReporter).onResult(new Throwable(logMessage)));
         }
 
         int menuHeight =
@@ -675,6 +688,7 @@
         return menuHeight;
     }
 
+    @RequiresNonNull("mListView")
     private void runMenuItemEnterAnimations() {
         mMenuItemEnterAnimator = new AnimatorSet();
         AnimatorSet.Builder builder = null;
@@ -714,6 +728,7 @@
         return mFooterView.getMeasuredHeight();
     }
 
+    @RequiresNonNull("mListView")
     private int inflateHeader(int headerResourceId, View contentView, int menuWidth) {
         if (headerResourceId == 0) return 0;
 
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuButtonHelperImpl.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuButtonHelperImpl.java
index 65202571..e68145d8 100644
--- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuButtonHelperImpl.java
+++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuButtonHelperImpl.java
@@ -16,6 +16,8 @@
 import androidx.annotation.IdRes;
 
 import org.chromium.base.metrics.RecordUserAction;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 
 /**
  * A helper class for a menu button to decide when to show the app menu and forward touch
@@ -24,11 +26,12 @@
  * Simply construct this class and pass the class instance to a menu button as TouchListener.
  * Then this class will handle everything regarding showing app menu for you.
  */
+@NullMarked
 class AppMenuButtonHelperImpl extends AccessibilityDelegate implements AppMenuButtonHelper {
     private final AppMenuHandlerImpl mMenuHandler;
-    private Runnable mOnAppMenuShownListener;
+    private @Nullable Runnable mOnAppMenuShownListener;
     private boolean mIsTouchEventsBeingProcessed;
-    private Runnable mOnClickRunnable;
+    private @Nullable Runnable mOnClickRunnable;
 
     /**
      * @param menuHandler MenuHandler implementation that can show and get the app menu.
@@ -105,7 +108,7 @@
     // AccessibilityDelegate overrides
 
     @Override
-    public boolean performAccessibilityAction(View host, int action, Bundle args) {
+    public boolean performAccessibilityAction(View host, int action, @Nullable Bundle args) {
         if (action == AccessibilityNodeInfo.ACTION_CLICK) {
             if (!mMenuHandler.isAppMenuShowing()) {
                 showAppMenu(host, false);
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuCoordinatorFactory.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuCoordinatorFactory.java
index ab01c6b..261f1217 100644
--- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuCoordinatorFactory.java
+++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuCoordinatorFactory.java
@@ -10,11 +10,13 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.supplier.Supplier;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.ui.base.WindowAndroid;
 
 /** A factory for creating an {@link AppMenuCoordinator}. */
+@NullMarked
 public class AppMenuCoordinatorFactory {
     private AppMenuCoordinatorFactory() {}
 
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuCoordinatorImpl.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuCoordinatorImpl.java
index be87ac3..3c5faab 100644
--- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuCoordinatorImpl.java
+++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuCoordinatorImpl.java
@@ -14,13 +14,16 @@
 import org.chromium.base.Callback;
 import org.chromium.base.ResettersForTesting;
 import org.chromium.base.supplier.Supplier;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.ui.base.WindowAndroid;
 
 /** A UI coordinator the app menu. */
+@NullMarked
 class AppMenuCoordinatorImpl implements AppMenuCoordinator {
-    private static Boolean sHasPermanentMenuKeyForTesting;
+    private static @Nullable Boolean sHasPermanentMenuKeyForTesting;
 
     /** Factory which creates the AppMenuHandlerImpl. */
     @VisibleForTesting
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuDragHelper.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuDragHelper.java
index b0d5105..c27b5f1 100644
--- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuDragHelper.java
+++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuDragHelper.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.ui.appmenu;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.animation.TimeAnimator;
 import android.annotation.SuppressLint;
 import android.content.Context;
@@ -18,10 +20,11 @@
 import android.widget.PopupWindow;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.metrics.RecordUserAction;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.ui.appmenu.internal.R;
 
 import java.lang.annotation.Retention;
@@ -35,6 +38,7 @@
  * hidden in API 16.
  */
 @SuppressLint("NewApi")
+@NullMarked
 class AppMenuDragHelper {
     private final Context mContext;
     private final AppMenu mAppMenu;
@@ -210,6 +214,7 @@
             mAppMenu.dismiss();
         } else if (eventActionMasked == MotionEvent.ACTION_MOVE) {
             // Auto scrolling on the top or the bottom of the listView.
+            assumeNonNull(listView);
             if (listView.getHeight() > 0) {
                 float autoScrollAreaRatio =
                         Math.min(
@@ -254,6 +259,7 @@
         if (!isReadyForMenuItemAction()) return false;
 
         ListView listView = mAppMenu.getListView();
+        assumeNonNull(listView);
 
         ArrayList<View> itemViews = new ArrayList<View>();
         for (int i = 0; i < listView.getChildCount(); ++i) {
@@ -313,6 +319,7 @@
     @VisibleForTesting
     boolean isReadyForMenuItemAction() {
         ListView listView = mAppMenu.getListView();
+        assumeNonNull(listView);
 
         // Starting M, we have a popup menu animation that slides down. If we process dragging
         // events while it's sliding, it will touch many views that are passing by user's finger,
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java
index b4fa2f11..3e3c4e3 100644
--- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java
+++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.ui.appmenu;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.res.Configuration;
@@ -14,12 +16,15 @@
 import android.view.Display;
 import android.view.View;
 
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.Callback;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.supplier.Supplier;
+import org.chromium.build.annotations.MonotonicNonNull;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+import org.chromium.build.annotations.RequiresNonNull;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.lifecycle.ConfigurationChangedObserver;
@@ -45,10 +50,11 @@
  * Object responsible for handling the creation, showing, hiding of the AppMenu and notifying the
  * AppMenuObservers about these actions.
  */
+@NullMarked
 class AppMenuHandlerImpl
         implements AppMenuHandler, StartStopWithNativeObserver, ConfigurationChangedObserver {
-    private AppMenu mAppMenu;
-    private AppMenuDragHelper mAppMenuDragHelper;
+    private @Nullable AppMenu mAppMenu;
+    private @Nullable AppMenuDragHelper mAppMenuDragHelper;
     private final List<AppMenuBlocker> mBlockers;
     private final List<AppMenuObserver> mObservers;
     private final View mHardwareButtonMenuAnchor;
@@ -61,16 +67,17 @@
     private final Supplier<Rect> mAppRect;
     private final WindowAndroid mWindowAndroid;
     private final BrowserControlsStateProvider mBrowserControlsStateProvider;
-    private ModelList mModelList;
+    private @Nullable ModelList mModelList;
     private ListObserver<Void> mListObserver;
-    private Callback<Integer> mTestOptionsItemSelectedListener;
-    private KeyboardVisibilityDelegate.KeyboardVisibilityListener mKeyboardVisibilityListener;
+    private @Nullable Callback<Integer> mTestOptionsItemSelectedListener;
+    private @MonotonicNonNull KeyboardVisibilityDelegate.KeyboardVisibilityListener
+            mKeyboardVisibilityListener;
 
     /**
      * The resource id of the menu item to highlight when the menu next opens. A value of {@code
      * null} means no item will be highlighted. This value will be cleared after the menu is opened.
      */
-    private Integer mHighlightMenuId;
+    private @Nullable Integer mHighlightMenuId;
 
     /**
      * Constructs an AppMenuHandlerImpl object.
@@ -131,7 +138,7 @@
 
                     @Override
                     public void onItemRangeRemoved(ListObservable source, int index, int count) {
-                        assert mModelList != null;
+                        assert mModelList != null && mAppMenu != null;
                         updateModelForHighlightAndClick(
                                 mModelList,
                                 mHighlightMenuId,
@@ -145,9 +152,11 @@
     /** Called when the containing activity is being destroyed. */
     void destroy() {
         // Prevent the menu window from leaking.
-        mWindowAndroid
-                .getKeyboardDelegate()
-                .removeKeyboardVisibilityListener(mKeyboardVisibilityListener);
+        if (mKeyboardVisibilityListener != null) {
+            mWindowAndroid
+                    .getKeyboardDelegate()
+                    .removeKeyboardVisibilityListener(mKeyboardVisibilityListener);
+        }
         hideAppMenu();
 
         mActivityLifecycleDispatcher.unregister(this);
@@ -164,13 +173,14 @@
     }
 
     @Override
-    public void setMenuHighlight(Integer highlightItemId) {
+    public void setMenuHighlight(@Nullable Integer highlightItemId) {
         boolean highlighting = highlightItemId != null;
         setMenuHighlight(highlightItemId, highlighting);
     }
 
     @Override
-    public void setMenuHighlight(Integer highlightItemId, boolean shouldHighlightMenuButton) {
+    public void setMenuHighlight(
+            @Nullable Integer highlightItemId, boolean shouldHighlightMenuButton) {
         if (mHighlightMenuId == null && highlightItemId == null) return;
         if (mHighlightMenuId != null && mHighlightMenuId.equals(highlightItemId)) return;
         mHighlightMenuId = highlightItemId;
@@ -193,7 +203,7 @@
      */
     // TODO(crbug.com/40479664): Fix this properly.
     @SuppressLint("ResourceType")
-    boolean showAppMenu(View anchorView, boolean startDragging) {
+    boolean showAppMenu(@Nullable View anchorView, boolean startDragging) {
         if (!shouldShowAppMenu() || isAppMenuShowing()) return false;
 
         TextBubble.dismissBubbles();
@@ -270,6 +280,7 @@
             mKeyboardVisibilityListener =
                     isShowing -> {
                         if (!isShowing) {
+                            assert mAppMenu != null;
                             setDisplayAndShowAppMenu(
                                     wrapper,
                                     finalAnchorView,
@@ -278,8 +289,10 @@
                                     mAppRect.get(),
                                     customViewBinders,
                                     startDragging);
-                            keyboardVisibilityDelegate
-                                    .removeKeyboardVisibilityListener(mKeyboardVisibilityListener);
+                            // https://github.com/uber/NullAway/issues/1190
+                            assumeNonNull(mKeyboardVisibilityListener);
+                            keyboardVisibilityDelegate.removeKeyboardVisibilityListener(
+                                    mKeyboardVisibilityListener);
                         }
                     };
             keyboardVisibilityDelegate.addKeyboardVisibilityListener(mKeyboardVisibilityListener);
@@ -298,6 +311,7 @@
     }
 
     void appMenuDismissed() {
+        assumeNonNull(mAppMenuDragHelper);
         mAppMenuDragHelper.finishDragging();
         mDelegate.onMenuDismissed();
     }
@@ -310,11 +324,11 @@
     /**
      * @return The App Menu that the menu handler is interacting with.
      */
-    public AppMenu getAppMenu() {
+    public @Nullable AppMenu getAppMenu() {
         return mAppMenu;
     }
 
-    AppMenuDragHelper getAppMenuDragHelper() {
+    @Nullable AppMenuDragHelper getAppMenuDragHelper() {
         return mAppMenuDragHelper;
     }
 
@@ -477,7 +491,9 @@
     }
 
     void setupModelForHighlightAndClick(
-            ModelList modelList, Integer highlightedId, AppMenuClickHandler appMenuClickHandler) {
+            ModelList modelList,
+            @Nullable Integer highlightedId,
+            AppMenuClickHandler appMenuClickHandler) {
         updateModelForHighlightAndClick(
                 modelList,
                 highlightedId,
@@ -488,7 +504,7 @@
 
     private void updateModelForHighlightAndClick(
             ModelList modelList,
-            Integer highlightedId,
+            @Nullable Integer highlightedId,
             AppMenuClickHandler appMenuClickHandler,
             int startIndex,
             boolean withAssertions) {
@@ -541,7 +557,7 @@
 
     private int getCustomItemViewType(
             int id,
-            List<CustomViewBinder> customViewBinders,
+            @Nullable List<CustomViewBinder> customViewBinders,
             Map<CustomViewBinder, Integer> customViewTypeOffsetMap) {
         if (customViewBinders == null || customViewTypeOffsetMap == null) {
             return CustomViewBinder.NOT_HANDLED;
@@ -551,7 +567,7 @@
             CustomViewBinder binder = customViewBinders.get(i);
             int binderViewType = binder.getItemViewType(id);
             if (binderViewType != CustomViewBinder.NOT_HANDLED) {
-                return binderViewType + customViewTypeOffsetMap.get(binder);
+                return binderViewType + assumeNonNull(customViewTypeOffsetMap.get(binder));
             }
         }
         return CustomViewBinder.NOT_HANDLED;
@@ -562,8 +578,7 @@
         AppMenu.setExceptionReporter(reporter);
     }
 
-    @Nullable
-    ModelList getModelListForTesting() {
+    @Nullable ModelList getModelListForTesting() {
         return mModelList;
     }
 
@@ -571,13 +586,14 @@
         return mDecorView;
     }
 
+    @RequiresNonNull("mAppMenu")
     private void setDisplayAndShowAppMenu(
             ContextThemeWrapper wrapper,
             View anchorView,
             boolean isByPermanentButton,
             Integer rotation,
             Rect appRect,
-            List<CustomViewBinder> customViewBinders,
+            @Nullable List<CustomViewBinder> customViewBinders,
             boolean startDragging) {
         // Use full size of window for abnormal appRect.
         if (appRect.left < 0 && appRect.top < 0) {
@@ -608,6 +624,7 @@
                 customViewBinders,
                 mDelegate.isMenuIconAtStart(),
                 mBrowserControlsStateProvider.getControlsPosition());
+        assumeNonNull(mAppMenuDragHelper);
         mAppMenuDragHelper.onShow(startDragging);
         clearMenuHighlight();
         RecordUserAction.record("MobileMenuShow");
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemIcon.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemIcon.java
index bed8a80..3752875b3 100644
--- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemIcon.java
+++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemIcon.java
@@ -8,9 +8,11 @@
 import android.util.AttributeSet;
 import android.widget.Checkable;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.ui.widget.ChromeImageView;
 
 /** An AppCompatImageView that supports the checkable state. */
+@NullMarked
 class AppMenuItemIcon extends ChromeImageView implements Checkable {
     private static final int[] CHECKED_STATE_SET = new int[] {android.R.attr.state_checked};
     private boolean mCheckedState;
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemViewBinder.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemViewBinder.java
index f550276..ae307d3 100644
--- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemViewBinder.java
+++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemViewBinder.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.ui.appmenu;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.res.ColorStateList;
 import android.graphics.drawable.Drawable;
 import android.text.TextUtils;
@@ -17,6 +19,7 @@
 import androidx.core.graphics.drawable.DrawableCompat;
 import androidx.core.widget.ImageViewCompat;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.ui.appmenu.internal.R;
 import org.chromium.components.browser_ui.widget.highlight.ViewHighlighter;
 import org.chromium.components.browser_ui.widget.highlight.ViewHighlighter.HighlightParams;
@@ -30,6 +33,7 @@
 import org.chromium.ui.widget.ChromeImageView;
 
 /** The binder to bind the app menu {@link PropertyModel} with the view. */
+@NullMarked
 class AppMenuItemViewBinder {
     /** IDs of all of the buttons in icon_row_menu_item.xml. */
     private static final int[] BUTTON_IDS = {
@@ -141,6 +145,7 @@
             }
 
             if (checkable) {
+                assumeNonNull(buttonModel);
                 // Display a checkbox for the MenuItem.
                 button.setVisibility(View.GONE);
                 checkbox.setVisibility(View.VISIBLE);
@@ -151,6 +156,7 @@
                                 checkbox.getContext(), R.color.selection_control_button_tint_list));
                 setupMenuButton(checkbox, buttonModel, appMenuClickHandler);
             } else if (subIcon != null) {
+                assumeNonNull(buttonModel);
                 // Display an icon alongside the MenuItem.
                 checkbox.setVisibility(View.GONE);
                 button.setVisibility(View.VISIBLE);
diff --git a/chrome/browser/ui/android/hats/internal/java/src/org/chromium/chrome/browser/ui/hats/SurveyController.java b/chrome/browser/ui/android/hats/internal/java/src/org/chromium/chrome/browser/ui/hats/SurveyController.java
index cc4499a..3848891 100644
--- a/chrome/browser/ui/android/hats/internal/java/src/org/chromium/chrome/browser/ui/hats/SurveyController.java
+++ b/chrome/browser/ui/android/hats/internal/java/src/org/chromium/chrome/browser/ui/hats/SurveyController.java
@@ -7,8 +7,8 @@
 import android.app.Activity;
 import android.content.Context;
 
-import androidx.annotation.Nullable;
-
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 
 import java.util.Map;
@@ -18,6 +18,7 @@
  * register a runnable to run when the survey is available. After downloading the survey, call
  * {@link showSurveyIfAvailable()} to display the survey.
  */
+@NullMarked
 public interface SurveyController {
     /**
      * Asynchronously downloads the survey using the provided parameters.
diff --git a/chrome/browser/ui/android/hats/internal/java/src/org/chromium/chrome/browser/ui/hats/SurveyControllerFactory.java b/chrome/browser/ui/android/hats/internal/java/src/org/chromium/chrome/browser/ui/hats/SurveyControllerFactory.java
index 40944a7..19bd062d 100644
--- a/chrome/browser/ui/android/hats/internal/java/src/org/chromium/chrome/browser/ui/hats/SurveyControllerFactory.java
+++ b/chrome/browser/ui/android/hats/internal/java/src/org/chromium/chrome/browser/ui/hats/SurveyControllerFactory.java
@@ -4,9 +4,11 @@
 
 package org.chromium.chrome.browser.ui.hats;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.profiles.Profile;
 
 /** Creates a {@link SurveyController}. */
+@NullMarked
 public interface SurveyControllerFactory {
     /** Return a SurveyController associated with the given profile. */
     SurveyController create(Profile profile);
diff --git a/chrome/browser/ui/android/hats/java/src/org/chromium/chrome/browser/ui/hats/MessageSurveyUiDelegate.java b/chrome/browser/ui/android/hats/java/src/org/chromium/chrome/browser/ui/hats/MessageSurveyUiDelegate.java
index 1612105..e308e4f6 100644
--- a/chrome/browser/ui/android/hats/java/src/org/chromium/chrome/browser/ui/hats/MessageSurveyUiDelegate.java
+++ b/chrome/browser/ui/android/hats/java/src/org/chromium/chrome/browser/ui/hats/MessageSurveyUiDelegate.java
@@ -4,15 +4,17 @@
 
 package org.chromium.chrome.browser.ui.hats;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.content.res.Resources;
 import android.text.TextUtils;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 
 import org.chromium.base.Callback;
 import org.chromium.base.supplier.Supplier;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabHidingType;
@@ -56,6 +58,7 @@
  * </ul>
  *</p>
  */
+@NullMarked
 public class MessageSurveyUiDelegate implements SurveyUiDelegate {
     /**
      * Internal state about the survey message state. Mostly used for debugging / troubleshooting.
@@ -136,9 +139,9 @@
      *         current tab is fully loaded and not in incognito.
      */
     public MessageSurveyUiDelegate(
-            @NonNull PropertyModel customModel,
-            @NonNull MessageDispatcher messageDispatcher,
-            @NonNull TabModelSelector modelSelector,
+            PropertyModel customModel,
+            MessageDispatcher messageDispatcher,
+            TabModelSelector modelSelector,
             Supplier<Boolean> crashUploadPermissionSupplier) {
         mMessageModel = customModel;
         mTabModelSelector = modelSelector;
@@ -157,7 +160,7 @@
      * @return The model with title / icon / primary button text to be used.
      */
     public static PropertyModel populateDefaultValuesForSurveyMessage(
-            Resources resources, @NonNull PropertyModel model) {
+            Resources resources, PropertyModel model) {
         if (model.get(MessageBannerProperties.ICON_RESOURCE_ID) == 0) {
             model.set(MessageBannerProperties.ICON_RESOURCE_ID, R.drawable.fre_product_logo);
             model.set(MessageBannerProperties.ICON_TINT_COLOR, MessageBannerProperties.TINT_NONE);
@@ -307,7 +310,7 @@
         mState = State.ENQUEUED;
     }
 
-    private boolean waitUntilTabReadyForSurvey(@NonNull Tab loadingTab) {
+    private boolean waitUntilTabReadyForSurvey(Tab loadingTab) {
         assert mLoadingTab == null;
         mLoadingTab = loadingTab;
 
@@ -319,6 +322,7 @@
                 new EmptyTabObserver() {
                     @Override
                     public void onInteractabilityChanged(Tab tab, boolean isInteractable) {
+                        assumeNonNull(mLoadingTab);
                         if (!isTabReadyForSurvey(mLoadingTab) || !isInteractable) return;
                         removeLoadingTabReferences();
                         showSurveyIfReady();
@@ -326,6 +330,7 @@
 
                     @Override
                     public void onLoadStopped(Tab tab, boolean toDifferentDocument) {
+                        assumeNonNull(mLoadingTab);
                         if (!isTabReadyForSurvey(mLoadingTab)) return;
                         removeLoadingTabReferences();
                         showSurveyIfReady();
@@ -350,6 +355,7 @@
     private void removeLoadingTabReferences() {
         if (mLoadingTab == null) return;
 
+        assert mLoadingTabObserver != null;
         mLoadingTab.removeObserver(mLoadingTabObserver);
         mLoadingTab = null;
         mLoadingTabObserver = null;
@@ -375,7 +381,7 @@
         mOnSurveyPresentationFailed = null;
     }
 
-    private void runIfNotNull(Runnable runnable) {
+    private void runIfNotNull(@Nullable Runnable runnable) {
         if (runnable != null) runnable.run();
     }
 
diff --git a/chrome/browser/ui/android/management/java/res/layout/enterprise_management.xml b/chrome/browser/ui/android/management/java/res/layout/enterprise_management.xml
index d69d7e1..a6d68e64 100644
--- a/chrome/browser/ui/android/management/java/res/layout/enterprise_management.xml
+++ b/chrome/browser/ui/android/management/java/res/layout/enterprise_management.xml
@@ -52,7 +52,7 @@
             android:layout_height="wrap_content"
             android:layout_marginTop="@dimen/cm_browser_margin_top"
             android:text="@string/management_browser_reporting"
-            android:textAppearance="@style/TextAppearance.TextLarge.Primary" />
+            android:textAppearance="@style/TextAppearance.Headline2" />
 
         <TextView
             android:id="@+id/browser_reporting_explanation"
@@ -111,13 +111,12 @@
             android:layout_height="wrap_content"
             android:layout_marginTop="@dimen/cm_title_margin_top"
             android:text="@string/management_threat_protection"
-            android:textAppearance="@style/TextAppearance.Headline.Primary" />
+            android:textAppearance="@style/TextAppearance.Headline2" />
 
         <TextView
             android:id="@+id/threat_protection_description"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginTop="@dimen/cm_description_margin_top"
             android:text="@string/management_threat_protection_description"
             android:textAppearance="@style/TextAppearance.TextMedium.Secondary" />
 
@@ -127,7 +126,7 @@
             android:layout_height="wrap_content"
             android:layout_marginTop="@dimen/cm_browser_margin_top"
             android:text="@string/management_threat_protection_more"
-            android:textAppearance="@style/TextAppearance.TextLarge.Primary" />
+            android:textAppearance="@style/TextAppearance.TextMedium.Primary" />
 
         <TextView
             android:id="@+id/threat_protection_security_event"
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
index b201915..391b3ee 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
@@ -131,6 +131,8 @@
     // Suggestions are refreshed several times per keystroke.
     private @Nullable Long mFirstSuggestionListModelCreatedTime;
 
+    private @Nullable Boolean mOmniboxInZeroPrefixState;
+
     private @RefineActionUsage int mRefineActionUsage = RefineActionUsage.NOT_USED;
 
     // The timestamp (using SystemClock.elapsedRealtime()) at the point when the user started
@@ -437,6 +439,7 @@
             mNumPrefetchesStartedInOmniboxSession = 0;
             mLastPrefetchStartedSuggestion = Optional.empty();
 
+            mOmniboxInZeroPrefixState = null;
             mNewOmniboxEditSessionTimestamp = -1;
             // Prevent any upcoming omnibox suggestions from showing once a URL is loaded (and as
             // a consequence the omnibox is unfocused).
@@ -840,14 +843,24 @@
         mListPropertyModel.set(SuggestionListProperties.LIST_IS_FINAL, false);
 
         mAutocompleteInput.setUserText(textWithoutAutocomplete);
+        boolean isInZeroPrefixContext = mAutocompleteInput.isInZeroPrefixContext();
         mIgnoreOmniboxItemSelection = true;
         cancelAutocompleteRequests();
 
-        mAutocomplete.ifPresent(a -> a.resetSession());
-        mNewOmniboxEditSessionTimestamp = SystemClock.elapsedRealtime();
+        // The user recently focused the Omnibox, began typing, or cleared the Omnibox.
+        if (mOmniboxInZeroPrefixState == null
+                || mOmniboxInZeroPrefixState != isInZeroPrefixContext) {
+            mOmniboxInZeroPrefixState = isInZeroPrefixContext;
+            if (!isInZeroPrefixContext) {
+                // User started typing.
+                mAutocomplete.ifPresent(a -> a.resetSession());
+                mNewOmniboxEditSessionTimestamp = SystemClock.elapsedRealtime();
+            }
+        }
+
         stopAutocomplete(false);
 
-        if (mAutocompleteInput.isInZeroPrefixContext() || isOnFocusContext) {
+        if (isInZeroPrefixContext || isOnFocusContext) {
             clearSuggestions();
             startCachedZeroSuggest();
         } else {
diff --git a/chrome/browser/ui/android/preloading/java/src/org/chromium/chrome/browser/preloading/AndroidPrerenderManager.java b/chrome/browser/ui/android/preloading/java/src/org/chromium/chrome/browser/preloading/AndroidPrerenderManager.java
index 5037911..447cb2d 100644
--- a/chrome/browser/ui/android/preloading/java/src/org/chromium/chrome/browser/preloading/AndroidPrerenderManager.java
+++ b/chrome/browser/ui/android/preloading/java/src/org/chromium/chrome/browser/preloading/AndroidPrerenderManager.java
@@ -8,6 +8,8 @@
 import org.jni_zero.NativeMethods;
 
 import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabObserver;
@@ -20,10 +22,11 @@
  *
  * <p>AndroidPrerenderManager provides interface to start or stop prerendering to the (native).
  */
+@NullMarked
 public class AndroidPrerenderManager {
     private long mNativeAndroidPrerenderManager;
-    private WebContents mWebContents;
-    private static AndroidPrerenderManager sAndroidPrerenderManager;
+    private @Nullable WebContents mWebContents;
+    private static @Nullable AndroidPrerenderManager sAndroidPrerenderManager;
 
     private final TabObserver mTabObserver =
             new EmptyTabObserver() {
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/history_sync/HistorySyncView.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/history_sync/HistorySyncView.java
index d384237..deb522f 100644
--- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/history_sync/HistorySyncView.java
+++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/history_sync/HistorySyncView.java
@@ -36,7 +36,9 @@
     protected void onFinishInflate() {
         super.onFinishInflate();
 
-        // TODO(crbug.com/41493766): Set up scrollView.
+        // ScrollView sets focusable to true during construction. So setting focusable to false in
+        // xml file doesn't work. It has to be set after the construction of ScrollView.
+        findViewById(R.id.sync_consent_scroll_view).setFocusable(false);
         mAccountImage = findViewById(R.id.history_sync_account_image);
         mTitle = findViewById(R.id.history_sync_title);
         mSubtitle = findViewById(R.id.history_sync_subtitle);
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
index 7df1765..ec20064a 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">እስከ 60% ውሂብ ይቆጥቡ፣ የዛሬ ዜና ያንብቡ</translation>
 <translation id="1303339473099049190">ይህንን ይለፍ ቃል ማግኘት አይቻልም። የፊደል አጻጻፍዎን ይፈትሹና እንደገና ይሞክሩ።</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> - ከ<ph name="DEVICE_NAME" /> የተላከ</translation>
+<translation id="1318262688555255786">አገናኝን ወደ ድረ-ገጽ <ph name="PAGE_TITLE" /> ያጋሩ። ምንጭ፦ <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">የዕልባት ማስቀመጥ ፍሰት አቃፊዎች በሙሉ ቁመት ላይ ተከፍተዋል</translation>
 <translation id="1327257854815634930">የዳሰሳ ታሪክ ተከፍቷል</translation>
 <translation id="1331212799747679585">Chrome መዘመን አይችልም። ተጨማሪ አማራጮች</translation>
@@ -515,6 +516,7 @@
 <translation id="3435465986463792564">ብዙ መስኮቶች አሉዎት? ከዚህ ሆነው እነሱን ማስተዳደር ይችላሉ።</translation>
 <translation id="3435575784518354875">የይለፍ ቃላትዎን መዳረሻ ለማቆየት አሁን ወደ ውጪ ይላኳቸው፣Google  Play አገልግሎቶችን ያዘምኑ ከዚያም ወደ Google የይለፍ ቃል አስተዳዳሪ ያስመጧቸው። <ph name="BEGIN_LINK" />ሙሉ መመሪያዎችን አሳይ<ph name="END_LINK" />።</translation>
 <translation id="3435738964857648380">የደህንነት ጥበቃ</translation>
+<translation id="3435914367318771664">ትር ወደ አዲስ ቡድን ያክሉ</translation>
 <translation id="3439276997620616816">የእርስዎን የቅርብ ጊዜ ትሮች እዚህ ያገኛሉ</translation>
 <translation id="3443221991560634068">የአሁኑን ገፅ ዳግም ጫን</translation>
 <translation id="3444179773590444986">ለጣቢያዎች ጠቆር ያለ ገጽታ ላይ ግብረመልስ ይጋራ?</translation>
@@ -781,6 +783,7 @@
 <translation id="4684427112815847243">ሁሉንም ያመሳስሉ</translation>
 <translation id="4685741273709472646">ከተቆልቋይ ዝርዝሩ ይምረጡ</translation>
 <translation id="4687718960473379118">በጣቢያ የተጠቆሙ ማስታወቂያዎች</translation>
+<translation id="468924408576231679">አገናኝን ወደ ድረ-ገጽ <ph name="PAGE_TITLE" /> ቅዳ። ምንጭ፦ <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">የተሻለ ይዘት ያግኙ</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 እና <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> ተጨማሪ}one{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 እና <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> ተጨማሪ}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 እና <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> ተጨማሪ}}</translation>
 <translation id="4698061626562952596">የቦዘኑ ትሮችዎን እዚህ ይገምግሙ</translation>
@@ -1123,6 +1126,7 @@
 <translation id="6205314730813004066">የማስታወቂያ ግላዊነት</translation>
 <translation id="6210748933810148297"><ph name="EMAIL" /> አይደለም?</translation>
 <translation id="6211386937064921208">ይህን ገፅ በቅድመ-ዕይታ በማሳየት ላይ</translation>
+<translation id="6212567362666004597">ትርን ወደ ቡድን ያክሉ</translation>
 <translation id="6221633008163990886">የይለፍ ቃላትዎን ወደ ውጭ ለመላክ ይክፈቱ</translation>
 <translation id="6225572914528673855">የአድራሻ አሞሌ</translation>
 <translation id="6232535412751077445">«አትከታተል»ን ማንቃት ማለት አንድ ጥያቄ በአሰሳ ትራፊክዎ ላይ ይካተታል ማለት ነው። ማንኛውም ውጤት አንድ ድር ጣቢያ ለጥያቄው ምላሽ ከሰጠና ጥያቄውን በሚተረጎምበት መንገድ ላይ የሚወሰን ነው።
@@ -1150,6 +1154,7 @@
 <translation id="6324916366299863871">አቋራጭን ያርትዑ</translation>
 <translation id="6324977638108296054">ወደ ድምቀቱ የሚወስድ አገናኝን መፍጠር አልተቻለም</translation>
 <translation id="6333140779060797560">በ<ph name="APPLICATION" /> በኩል ያጋሩ</translation>
+<translation id="6335454563754888572">በሚከለተው ላይ ወደ ገጽ የሚጠቁም ዩአርኤልን ያርትዑ፦ <ph name="PAGE_URL" /></translation>
 <translation id="6337234675334993532">ምስጠራ</translation>
 <translation id="6340526405444716530">ግላዊነት ማላበስ</translation>
 <translation id="6341580099087024258">ፋይሎች የት እንደሚቀመጡ ይጠይቁ</translation>
@@ -1193,6 +1198,7 @@
 <translation id="6486420406192123355">ይህ PDF ፋይል ደህንነቱ ያልተጠበቀ ግንኙነት ከሚጠቀም ጣቢያ የመጣ ነው</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{ፋይል ወርዷል}one{# ውርዶች ተጠናቅቀዋል}other{# ውርዶች ተጠናቅቀዋል}}</translation>
 <translation id="6508722015517270189">Chromeን ዳግም ያስጀምሩት</translation>
+<translation id="6513924416597632811">የፍለጋ ውጤቶች ገጽ አገናኝን ለሚከተለው ይቅዱ፦ <ph name="SEARCH_QUERY" />። ምንጭ፦ <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">አረጋግጥ</translation>
 <translation id="6527303717912515753">አጋራ</translation>
 <translation id="652948702951888897">የChrome ታሪክ</translation>
@@ -1604,6 +1610,7 @@
 <translation id="8221401890884589479">የማይፈልጓቸውን ጣቢያዎች ማገድ ይችላሉ። እንዲሁም Chrome ከ30 ቀናት በላይ የሆናቸው ጣቢያዎችን ከዝርዝሩ በራስ-ሰር ይሰርዛል። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">የአሰሳ ውሂብን ይሰርዙ</translation>
 <translation id="8223642481677794647">የምግብ ካርድ ምናሌ</translation>
+<translation id="82296173028782770">የፍለጋ መጠይቅን ያርትዑ፦ <ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">አሁን የቀኝ ማንሸራተት ከዚህ ቀደም የጎበኟቸውን ገፆች ለማየት ወደኋላ ይወስድዎታል እና የግራ ማንሸራተት ወደፊት ይወስድዎታል</translation>
 <translation id="8236097722223016103">ወደ እልባቶች አክል</translation>
 <translation id="8243077599929149377">የእርስዎን የተጠቃሚ ስም ያክሉ</translation>
@@ -1752,6 +1759,7 @@
 <translation id="8890668505403261809">ማንነት የማያሳውቅ ትሮችዎን ይፈልጉ</translation>
 <translation id="8898822736010347272">አዲስ ስጋቶችን ለማግኘት እንዲያግዝ እና በድር ላይ ያለ ሁሉንም ሰው ለመጠበቅ የጎበኟቸው የአንዳንድ ገጾች ዩአርኤሎችን፣ የተወሰነ የስርዓት መረጃን እና አንዳንድ የገጽ ይዘትን ወደ Google ይልካል።</translation>
 <translation id="8909135823018751308">አጋራ…</translation>
+<translation id="8918299437379122615">የፍለጋ ውጤቶች ገጽ አገናኝን ለሚከተለው ያጋሩ፦ <ph name="SEARCH_QUERY" />። ምንጭ፦ <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">ገጾችን ከመስመር ውጭ ለመጠቀም ከተጨማሪ አማራጮች አዝራሩ ላይ ያውርዱ</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation>
 <translation id="892496902842311796"><ph name="LANG" /> ዝግጁ ነው</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
index ac9b63e..00140eb 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
@@ -458,6 +458,7 @@
 <translation id="3072980200212375806">‏سيتم فتح تطبيق "<ph name="APP_NAME" />" في Chrome. تعني المتابعة موافقتك على <ph name="BEGIN_LINK1" />بنود خدمة Google<ph name="END_LINK1" /> و<ph name="BEGIN_LINK2" />بنود الخدمة الإضافية لكل من متصفّح Google Chrome ونظام التشغيل Chrome<ph name="END_LINK2" />، علمًا بأنّ <ph name="BEGIN_LINK3" />سياسة الخصوصية<ph name="END_LINK3" /> تسري أيضًا.</translation>
 <translation id="3080525922482950719">يمكنك حفظ صفحات لقراءتها لاحقًا أو بلا إنترنت</translation>
 <translation id="3087734570205094154">أسفل</translation>
+<translation id="3088687687599869821">التنقل في الصفحة</translation>
 <translation id="3091010850649238832">عرض محتوى الحافظة</translation>
 <translation id="3098745985164956033">‏يتم إرسال بعض الصور إلى Google لتحسين أوصاف الصور.</translation>
 <translation id="3114507951000454849">الاطّلاع على أخبار اليوم <ph name="NEWS_ICON" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
index 2ae9ac5d..49877e93 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -456,7 +456,7 @@
 <translation id="3072980200212375806"><ph name="APP_NAME" /> će se otvoriti u Chromeu. Ako nastavite, pristajete na <ph name="BEGIN_LINK1" />Googleove Uslove korištenja usluge<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />dodatne Uslove korištenja usluge za Google Chrome i ChromeOS<ph name="END_LINK2" />. Također se primjenjuju <ph name="BEGIN_LINK3" />Pravila privatnosti<ph name="END_LINK3" />.</translation>
 <translation id="3080525922482950719">Možete sačuvati stranice da ih čitate kasnije ili van mreže</translation>
 <translation id="3087734570205094154">Dolje</translation>
-<translation id="3088687687599869821">NAVIGACIJA PO STRANICI</translation>
+<translation id="3088687687599869821">KRETANJE PO STRANICI</translation>
 <translation id="3091010850649238832">Prikažite sadržaj međumemorije</translation>
 <translation id="3098745985164956033">Neke slike se šalju Googleu radi poboljšanja opisa</translation>
 <translation id="3114507951000454849">Pročitajte današnje vijesti <ph name="NEWS_ICON" /></translation>
@@ -477,6 +477,7 @@
 <translation id="3208584281581115441">Provjeri sada</translation>
 <translation id="3211426585530211793">Izbrisano: <ph name="ITEM_TITLE" /></translation>
 <translation id="3220943972464248773">Da sinhronizirate lozinke, potvrdite identitet</translation>
+<translation id="323213525320714789">RAZVOJNI PROGRAMER</translation>
 <translation id="3232293466644486101">Izbrišite podatke pregledanja…</translation>
 <translation id="3232754137068452469">Web aplikacija</translation>
 <translation id="3236059992281584593">Još 1 min</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb
index dec5aa2..14e6643 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">Arbedwch hyd at 60% o ddata, darllenwch newyddion heddiw</translation>
 <translation id="1303339473099049190">Methu â dod o hyd i'r cyfrinair hwnnw. Gwiriwch eich sillafu a rhowch gynnig arall arni.</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> - Anfonwyd o <ph name="DEVICE_NAME" /></translation>
+<translation id="1318262688555255786">Rhannu dolen i'r dudalen we <ph name="PAGE_TITLE" />. Ffynhonnell: <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">Llif cadw nodau tudalen wedi'i hagor ar uchder llawn</translation>
 <translation id="1327257854815634930">Agorir hanes llywio</translation>
 <translation id="1331212799747679585">Ni all Chrome ddiweddaru. Rhagor o ddewisiadau</translation>
@@ -455,6 +456,7 @@
 <translation id="3072980200212375806">Bydd <ph name="APP_NAME" /> yn agor yn Chrome. Drwy barhau, rydych yn cytuno i <ph name="BEGIN_LINK1" />Delerau Gwasanaeth Google<ph name="END_LINK1" />, a <ph name="BEGIN_LINK2" />Thelerau Gwasanaeth Ychwanegol Google Chrome a ChromeOS<ph name="END_LINK2" />. Mae'r <ph name="BEGIN_LINK3" />Polisi Preifatrwydd<ph name="END_LINK3" /> hefyd yn berthnasol.</translation>
 <translation id="3080525922482950719">Gallwch gadw tudalennau i'w darllen yn nes ymlaen neu'n all-lein</translation>
 <translation id="3087734570205094154">Gwaelod</translation>
+<translation id="3088687687599869821">LLYWIO TUDALEN</translation>
 <translation id="3091010850649238832">Dangos cynnwys y clipfwrdd</translation>
 <translation id="3098745985164956033">Anfonir rhai lluniau at Google i wella disgrifiadau i chi.</translation>
 <translation id="3114507951000454849">Darllen y newyddion heddiw <ph name="NEWS_ICON" /></translation>
@@ -515,6 +517,7 @@
 <translation id="3435465986463792564">Oes gennych chi lawer o ffenestri? Gallwch eu rheoli o'r fan hon</translation>
 <translation id="3435575784518354875">Er mwyn cadw mynediad at eich cyfrineiriau, allforiwch nhw nawr, diweddarwch Google Play Services, ac yna eu mewnforio yn ôl i Reolwr Cyfrineiriau Google. <ph name="BEGIN_LINK" />Gweld y cyfarwyddiadau llawn<ph name="END_LINK" />.</translation>
 <translation id="3435738964857648380">Diogelwch</translation>
+<translation id="3435914367318771664">Ychwanegu'r tab at grŵp newydd</translation>
 <translation id="3439276997620616816">Byddwch yn gweld eich tabiau diweddar yma</translation>
 <translation id="3443221991560634068">Ail-lwytho'r dudalen bresennol</translation>
 <translation id="3444179773590444986">Rhannu adborth am y thema dywyll ar gyfer gwefannau?</translation>
@@ -780,6 +783,7 @@
 <translation id="4684427112815847243">Cysoni popeth</translation>
 <translation id="4685741273709472646">Dewiswch o'r gwymplen</translation>
 <translation id="4687718960473379118">Hysbysebion a awgrymir gan wefan</translation>
+<translation id="468924408576231679">Copïo dolen i dudalen we <ph name="PAGE_TITLE" />. Ffynhonnell: <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">Cael gwell cynnwys</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 ac <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> arall}zero{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 a <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> arall}two{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 a <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> arall}few{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 a <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> arall}many{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 a <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> arall}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 a <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> arall}}</translation>
 <translation id="4698061626562952596">Adolygwch eich tabiau anweithredol yma</translation>
@@ -1122,6 +1126,7 @@
 <translation id="6205314730813004066">Preifatrwydd hysbyseb</translation>
 <translation id="6210748933810148297">Nid <ph name="EMAIL" /> ydych chi?</translation>
 <translation id="6211386937064921208">Wrthi'n dangos rhagolwg o'r dudalen hon</translation>
+<translation id="6212567362666004597">Ychwanegu tab at grŵp</translation>
 <translation id="6221633008163990886">Datglowch i allforio'ch cyfrineiriau</translation>
 <translation id="6225572914528673855">Bar cyfeiriad</translation>
 <translation id="6232535412751077445">Mae galluogi “Do Not Track” yn golygu y bydd cais yn cael ei gynnwys gyda'ch traffig pori. Mae unrhyw effaith yn dibynnu a yw gwefan yn ymateb i'r cais, a sut mae'r cais yn cael ei ddehongli.
@@ -1149,6 +1154,7 @@
 <translation id="6324916366299863871">Golygu'r llwybr byr</translation>
 <translation id="6324977638108296054">Ni ellir creu dolen i'r testun a amlygir</translation>
 <translation id="6333140779060797560">Rhannu drwy <ph name="APPLICATION" /></translation>
+<translation id="6335454563754888572">Golygu URL sy'n pwyntio at y dudalen ar: <ph name="PAGE_URL" /></translation>
 <translation id="6337234675334993532">Amgryptio</translation>
 <translation id="6340526405444716530">Personoleiddio</translation>
 <translation id="6341580099087024258">Gofyn ble i gadw ffeiliau</translation>
@@ -1192,6 +1198,7 @@
 <translation id="6486420406192123355">Daw'r ffeil PDF hon o wefan sy'n defnyddio cysylltiad anniogel</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{Wedi lawrlwytho ffeil}zero{Mae # lawrlwythiad wedi'u cwblhau}two{Mae # lawrlwythiad wedi'u cwblhau}few{Mae # lawrlwythiad wedi'u cwblhau}many{Mae # lawrlwythiad wedi'u cwblhau}other{Mae # lawrlwythiad wedi'u cwblhau}}</translation>
 <translation id="6508722015517270189">Ailgychwyn Chrome</translation>
+<translation id="6513924416597632811">Copïo dolen i dudalen canlyniadau chwilio ar gyfer: <ph name="SEARCH_QUERY" />. Ffynhonnell: <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">Dilysu</translation>
 <translation id="6527303717912515753">Rhannu</translation>
 <translation id="652948702951888897">Hanes Chrome</translation>
@@ -1603,6 +1610,7 @@
 <translation id="8221401890884589479">Gallwch rwystro gwefannau nad ydych eu heisiau. Mae Chrome hefyd yn dileu gwefannau yn awtomatig o'r rhestr sy'n hŷn na 30 diwrnod. <ph name="BEGIN_LINK" />Dysgu rhagor<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">Wrthi'n dileu data pori</translation>
 <translation id="8223642481677794647">Dewislen cerdyn y ffrwd</translation>
+<translation id="82296173028782770">Golygu ymholiad chwilio: <ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">Nawr, mae sweipio i'r dde yn mynd â chi yn ôl i weld tudalennau blaenorol rydych chi wedi ymweld â nhw ac mae sweipio i'r chwith yn eich symud ymlaen</translation>
 <translation id="8236097722223016103">Ychwanegu at nodau tudalen</translation>
 <translation id="8243077599929149377">Ychwanegwch eich enw defnyddiwr</translation>
@@ -1751,6 +1759,7 @@
 <translation id="8890668505403261809">Chwilio eich tabiau Anhysbys</translation>
 <translation id="8898822736010347272">Yn anfon cyfeiriadau URL o rai tudalennau rydych yn ymweld â nhw, gwybodaeth system gyfyngedig, a rhywfaint o gynnwys tudalen at Google, i helpu i ddarganfod bygythiadau newydd ac i amddiffyn pawb ar y we.</translation>
 <translation id="8909135823018751308">Rhannu…</translation>
+<translation id="8918299437379122615">Rhannu dolen i dudalen canlyniadau chwilio ar gyfer: <ph name="SEARCH_QUERY" />. Ffynhonnell: <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">Lawrlwythwch dudalennau o'r botwm Rhagor o ddewisiadau i'w defnyddio all-lein</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Dysgu Rhagor<ph name="END_LINK" /></translation>
 <translation id="892496902842311796">Mae <ph name="LANG" /> yn barod</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
index 178db97..14edd6f 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">Spar op til 60 % data, og læs dagens nyheder</translation>
 <translation id="1303339473099049190">Adgangskoden blev ikke fundet. Tjek stavningen, og prøv igen.</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> – sendt fra <ph name="DEVICE_NAME" /></translation>
+<translation id="1318262688555255786">Del linket til websiden <ph name="PAGE_TITLE" />. Kilde: <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">Mapper i flow til lagring af bogmærker er åbnet i fuld højde</translation>
 <translation id="1327257854815634930">Navigationsoversigt er åbnet</translation>
 <translation id="1331212799747679585">Chrome kan ikke opdateres. Flere valgmuligheder</translation>
@@ -515,6 +516,7 @@
 <translation id="3435465986463792564">Har du mange åbne vinduer? Du kan administrere dem herfra</translation>
 <translation id="3435575784518354875">Hvis du fortsat vil have adgang til dine adgangskoder, skal du eksportere dem nu, opdatere Google Play-tjenester og derefter importere dem til Google Adgangskodeadministrator igen. <ph name="BEGIN_LINK" />Se hele vejledningen<ph name="END_LINK" />.</translation>
 <translation id="3435738964857648380">Sikkerhed</translation>
+<translation id="3435914367318771664">Føj fane til ny gruppe</translation>
 <translation id="3439276997620616816">Her finder du dine seneste faner</translation>
 <translation id="3443221991560634068">Genindlæs den aktuelle side</translation>
 <translation id="3444179773590444986">Vil du dele feedback om Mørkt tema på websites?</translation>
@@ -781,6 +783,7 @@
 <translation id="4684427112815847243">Synkroniser alt</translation>
 <translation id="4685741273709472646">Vælg fra rullelisten</translation>
 <translation id="4687718960473379118">Foreslåede annoncer fra websites</translation>
+<translation id="468924408576231679">Kopiér linket til websiden <ph name="PAGE_TITLE" />. Kilde: <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">Få bedre indhold</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 og <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> mere}one{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 og <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> mere}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 og <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> mere}}</translation>
 <translation id="4698061626562952596">Se dine inaktive faner her</translation>
@@ -1123,6 +1126,7 @@
 <translation id="6205314730813004066">Privatliv vedrørende annoncering</translation>
 <translation id="6210748933810148297">Ikke <ph name="EMAIL" />?</translation>
 <translation id="6211386937064921208">Forhåndsvisning af denne side</translation>
+<translation id="6212567362666004597">Føj fane til gruppe</translation>
 <translation id="6221633008163990886">Lås op for at eksportere dine adgangskoder</translation>
 <translation id="6225572914528673855">Adresselinje</translation>
 <translation id="6232535412751077445">Aktivering af "Do Not Track" betyder, at en anmodning medtages i din browsertrafik. Effekten afhænger af, om et website reagerer på anmodningen, og hvordan anmodningen fortolkes.
@@ -1150,6 +1154,7 @@
 <translation id="6324916366299863871">Rediger genvej</translation>
 <translation id="6324977638108296054">Der kan ikke oprettes et link til fremhævning</translation>
 <translation id="6333140779060797560">Del via <ph name="APPLICATION" /></translation>
+<translation id="6335454563754888572">Rediger webadressen til siden på: <ph name="PAGE_URL" /></translation>
 <translation id="6337234675334993532">Kryptering</translation>
 <translation id="6340526405444716530">Personlig tilpasning</translation>
 <translation id="6341580099087024258">Spørg, hvor filer skal gemmes</translation>
@@ -1193,6 +1198,7 @@
 <translation id="6486420406192123355">Denne PDF-fil er fra et website med en usikker forbindelse</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{Filen er downloadet}one{# fil er downloadet}other{# filer er downloadet}}</translation>
 <translation id="6508722015517270189">Genstart Chrome</translation>
+<translation id="6513924416597632811">Kopiér linket til søgeresultatsiden for: <ph name="SEARCH_QUERY" />. Kilde: <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">Verificer</translation>
 <translation id="6527303717912515753">Del</translation>
 <translation id="652948702951888897">Chrome-historik</translation>
@@ -1604,6 +1610,7 @@
 <translation id="8221401890884589479">Du kan blokere websites, du ikke er interesseret i. Chrome sletter også automatisk websites fra listen, som er mere end 30 dage gamle. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">Sletter browserdata</translation>
 <translation id="8223642481677794647">Feedkortmenu</translation>
+<translation id="82296173028782770">Rediger søgeforespørgsel: <ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">Nu kan du stryge til højre for at se sider, du har besøgt tidligere, og til venstre for at gå fremad</translation>
 <translation id="8236097722223016103">Føj til bogmærker</translation>
 <translation id="8243077599929149377">Tilføj dit brugernavn</translation>
@@ -1752,6 +1759,7 @@
 <translation id="8890668505403261809">Søg i dine inkognitofaner</translation>
 <translation id="8898822736010347272">Sender webadresser på visse sider, du besøger, begrænsede systemoplysninger og indhold fra visse sider til Google med henblik på at opdage nye trusler og beskytte brugerne på nettet.</translation>
 <translation id="8909135823018751308">Del…</translation>
+<translation id="8918299437379122615">Del linket til søgeresultatsiden for: <ph name="SEARCH_QUERY" />. Kilde: <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">Download sider via knappen Flere valgmuligheder for at bruge dem, når du er offline</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation>
 <translation id="892496902842311796"><ph name="LANG" /> er klar</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
index 0c6448ea..d541c7e 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">Bis zu 60 % Daten sparen und die Nachrichten von heute lesen</translation>
 <translation id="1303339473099049190">Dieses Passwort wurde nicht gefunden. Überprüfe die Schreibweise und versuche es noch einmal.</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" />: gesendet von <ph name="DEVICE_NAME" /></translation>
+<translation id="1318262688555255786">Link zur Webseite „<ph name="PAGE_TITLE" />“ teilen. Quelle: <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">Ablauf zum Speichern von Lesezeichen ist vollständig geöffnet</translation>
 <translation id="1327257854815634930">Der Navigationsverlauf ist geöffnet</translation>
 <translation id="1331212799747679585">Chrome kann nicht aktualisiert werden. Weitere Optionen</translation>
@@ -516,6 +517,7 @@
 <translation id="3435465986463792564">Du verwendest viele Fenster? Du kannst sie hier verwalten.</translation>
 <translation id="3435575784518354875">Wenn du weiterhin auf deine Passwörter zugreifen möchtest, exportiere sie jetzt, aktualisiere die Google Play-Dienste und importiere sie dann wieder in den Google Passwortmanager. <ph name="BEGIN_LINK" />Vollständige Anleitung<ph name="END_LINK" /></translation>
 <translation id="3435738964857648380">Sicherheit</translation>
+<translation id="3435914367318771664">Tab zu neuer Gruppe hinzufügen</translation>
 <translation id="3439276997620616816">Hier werden deine kürzlich geschlossenen Tabs angezeigt</translation>
 <translation id="3443221991560634068">Aktuelle Seite neu laden</translation>
 <translation id="3444179773590444986">Feedback zu dunklem Design für Websites teilen?</translation>
@@ -782,6 +784,7 @@
 <translation id="4684427112815847243">Alles synchronisieren</translation>
 <translation id="4685741273709472646">Wähle eine Option aus der Drop-down-Liste aus</translation>
 <translation id="4687718960473379118">Von Websites vorgeschlagene Werbung</translation>
+<translation id="468924408576231679">Link zur Webseite „<ph name="PAGE_TITLE" />“ kopieren. Quelle: <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">Bessere Inhalte erhalten</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 und <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> weitere}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 und <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> weitere}}</translation>
 <translation id="4698061626562952596">Hier kannst du deine inaktiven Tabs ansehen</translation>
@@ -1124,6 +1127,7 @@
 <translation id="6205314730813004066">Datenschutz bei Anzeigen</translation>
 <translation id="6210748933810148297"><ph name="EMAIL" /> ist nicht deine E-Mail-Adresse?</translation>
 <translation id="6211386937064921208">Vorschau für diese Seite</translation>
+<translation id="6212567362666004597">Tab zu Gruppe hinzufügen</translation>
 <translation id="6221633008163990886">Zum Exportieren deiner Passwörter entsperren</translation>
 <translation id="6225572914528673855">Adressleiste</translation>
 <translation id="6232535412751077445">Wenn du das Kästchen „Do Not Track“ anklickst, wird mit deinen Browserzugriffen eine Anforderung gesendet. Wie sich diese Anforderung auswirkt, hängt davon ab, ob eine Website darauf reagiert und wie die Anforderung interpretiert wird.
@@ -1151,6 +1155,7 @@
 <translation id="6324916366299863871">Verknüpfung bearbeiten</translation>
 <translation id="6324977638108296054">Link zum markierten Text kann nicht erstellt werden</translation>
 <translation id="6333140779060797560">Über <ph name="APPLICATION" /> teilen</translation>
+<translation id="6335454563754888572">URL bearbeiten, die auf die Seite unter <ph name="PAGE_URL" /> verweist</translation>
 <translation id="6337234675334993532">Verschlüsselung</translation>
 <translation id="6340526405444716530">Personalisierung</translation>
 <translation id="6341580099087024258">Fragen, wo Dateien gespeichert werden sollen</translation>
@@ -1194,6 +1199,7 @@
 <translation id="6486420406192123355">Diese PDF-Datei stammt von einer Website, die über eine unsichere Verbindung geladen wurde</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{Datei heruntergeladen}other{# Downloads abgeschlossen}}</translation>
 <translation id="6508722015517270189">Chrome neu starten</translation>
+<translation id="6513924416597632811">Link zur Suchergebnisseite für „<ph name="SEARCH_QUERY" />“ kopieren. Quelle: <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">Bestätigen</translation>
 <translation id="6527303717912515753">Teilen</translation>
 <translation id="652948702951888897">Chrome-Verlauf</translation>
@@ -1605,6 +1611,7 @@
 <translation id="8221401890884589479">Du kannst unerwünschte Websites blockieren. Außerdem werden Websites, die länger als 30 Tage gelistet sind, von Chrome automatisch aus der Liste gelöscht. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">Browserdaten werden gelöscht</translation>
 <translation id="8223642481677794647">Feedkartenmenü</translation>
+<translation id="82296173028782770">Suchanfrage bearbeiten: <ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">Wenn du jetzt nach rechts wischst, gelangst du zu den Seiten, die du zuvor besucht hast. Wenn du nach links wischst, springst du nach vorne.</translation>
 <translation id="8236097722223016103">Zu Lesezeichen hinzufügen</translation>
 <translation id="8243077599929149377">Nutzername hinzufügen</translation>
@@ -1753,6 +1760,7 @@
 <translation id="8890668505403261809">In meinen Inkognitotabs suchen</translation>
 <translation id="8898822736010347272">URLs einiger von dir besuchter Seiten, eingeschränkte Systemdaten und manche Seiteninhalte werden an Google gesendet, um die Erkennung neuer Bedrohungen zu verbessern und Nutzer im Internet zu schützen.</translation>
 <translation id="8909135823018751308">Teilen...</translation>
+<translation id="8918299437379122615">Link zur Suchergebnisseite für „<ph name="SEARCH_QUERY" />“ teilen. Quelle: <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">Seiten über die Schaltfläche "Weitere Optionen" zur Offline-Ansicht herunterladen</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation>
 <translation id="892496902842311796"><ph name="LANG" /> ist bereit</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
index bca9e01..c67848f 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">Εξοικονομήστε έως και το 60% των δεδομένων, διαβάστε τις σημερινές ειδήσεις</translation>
 <translation id="1303339473099049190">Δεν είναι δυνατή η εύρεση αυτού του κωδικού πρόσβασης. Ελέγξτε για τυχόν ορθογραφικά λάθη και δοκιμάστε ξανά.</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> - Στάλθηκε από <ph name="DEVICE_NAME" /></translation>
+<translation id="1318262688555255786">Κοινή χρήση συνδέσμου προς την ιστοσελίδα <ph name="PAGE_TITLE" />. Πηγή: <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">Φάκελοι ροής αποθήκευσης σελιδοδείκτη ανοιγμένοι στο πλήρες ύψος</translation>
 <translation id="1327257854815634930">Το ιστορικό περιήγησης έχει ανοίξει</translation>
 <translation id="1331212799747679585">Δεν είναι δυνατή η ενημέρωση του Chrome. Περισσότερες επιλογές</translation>
@@ -455,6 +456,7 @@
 <translation id="3072980200212375806">Η εφαρμογή <ph name="APP_NAME" /> θα ανοίξει στο Chrome. Εάν συνεχίσετε, συμφωνείτε με τους <ph name="BEGIN_LINK1" />Όρους Παροχής Υπηρεσιών της Google<ph name="END_LINK1" /> και τους <ph name="BEGIN_LINK2" />Πρόσθετους Όρους Παροχής Υπηρεσιών του Google Chrome και του Chrome OS<ph name="END_LINK2" />. Επίσης, ισχύει η <ph name="BEGIN_LINK3" />Πολιτική απορρήτου<ph name="END_LINK3" />.</translation>
 <translation id="3080525922482950719">Μπορείτε να αποθηκεύετε σελίδες για ανάγνωση αργότερα ή εκτός σύνδεσης.</translation>
 <translation id="3087734570205094154">Κάτω</translation>
+<translation id="3088687687599869821">ΠΛΟΗΓΗΣΗ ΣΤΙΣ ΣΕΛΙΔΕΣ</translation>
 <translation id="3091010850649238832">Εμφάνιση περιεχομένων πρόχειρου</translation>
 <translation id="3098745985164956033">Ορισμένες εικόνες αποστέλλονται στην Google για τη βελτίωση των περιγραφών για εσάς.</translation>
 <translation id="3114507951000454849">Διαβάστε τις σημερινές ειδήσεις <ph name="NEWS_ICON" /></translation>
@@ -515,6 +517,7 @@
 <translation id="3435465986463792564">Χρησιμοποιείτε πολλά παράθυρα; Μπορείτε να τα διαχειρίζεστε από εδώ.</translation>
 <translation id="3435575784518354875">Για να διατηρήσετε την πρόσβαση στους κωδικούς πρόσβασης, εξαγάγετε τους τώρα, ενημερώστε τις υπηρεσίες Google Play και, στη συνέχεια, εισαγάγετέ τους στη Διαχείριση κωδικών πρόσβασης Google. <ph name="BEGIN_LINK" />Δείτε τις πλήρεις οδηγίες<ph name="END_LINK" />.</translation>
 <translation id="3435738964857648380">Ασφάλεια</translation>
+<translation id="3435914367318771664">Προσθήκη καρτέλας σε νέα ομάδα</translation>
 <translation id="3439276997620616816">Εδώ θα βρείτε τις πρόσφατες καρτέλες σας</translation>
 <translation id="3443221991560634068">Επαναφόρτωση της τρέχουσας σελίδας</translation>
 <translation id="3444179773590444986">Θέλετε να υποβάλετε σχόλια σχετικά με το σκούρο θέμα για ιστοτόπους;</translation>
@@ -781,6 +784,7 @@
 <translation id="4684427112815847243">Συγχρονισμός όλων</translation>
 <translation id="4685741273709472646">Επιλέξτε από την αναπτυσσόμενη λίστα</translation>
 <translation id="4687718960473379118">Διαφημίσεις που προτείνονται από ιστότοπο</translation>
+<translation id="468924408576231679">Αντιγραφή συνδέσμου προς την ιστοσελίδα <ph name="PAGE_TITLE" />. Πηγή: <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">Λήψη καλύτερου περιεχομένου</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 και <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> ακόμη}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 και <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> ακόμη}}</translation>
 <translation id="4698061626562952596">Ελέγξτε τις ανενεργές καρτέλες σας εδώ</translation>
@@ -1123,6 +1127,7 @@
 <translation id="6205314730813004066">Απόρρητο διαφημίσεων</translation>
 <translation id="6210748933810148297">Δεν είστε ο χρήστης <ph name="EMAIL" />;</translation>
 <translation id="6211386937064921208">Πραγματοποιείται προεπισκόπηση αυτής της σελίδας</translation>
+<translation id="6212567362666004597">Προσθήκη καρτέλας σε ομάδα</translation>
 <translation id="6221633008163990886">Ξεκλειδώστε για εξαγωγή των κωδικών πρόσβασής σας</translation>
 <translation id="6225572914528673855">Γραμμή διευθύνσεων</translation>
 <translation id="6232535412751077445">Η ενεργοποίηση της επιλογής "Να μην γίνεται εντοπισμός" σημαίνει ότι θα συμπεριληφθεί ένα αίτημα με την επισκεψιμότητα της περιήγησής σας. Τυχόν αποτελέσματα εξαρτώνται από το κατά πόσο ένας ιστότοπος ανταποκρίνεται στο αίτημα, καθώς και από τον τρόπο με τον οποίο ερμηνεύεται το αίτημα.
@@ -1150,6 +1155,7 @@
 <translation id="6324916366299863871">Επεξεργασία συντόμευσης</translation>
 <translation id="6324977638108296054">Δεν είναι δυνατή η δημιουργία συνδέσμου προς την επισήμανση</translation>
 <translation id="6333140779060797560">Μοιραστείτε μέσω <ph name="APPLICATION" /></translation>
+<translation id="6335454563754888572">Επεξεργασία URL που οδηγεί στη σελίδα στη διεύθυνση: <ph name="PAGE_URL" /></translation>
 <translation id="6337234675334993532">Κρυπτογράφηση</translation>
 <translation id="6340526405444716530">Εξατομίκευση</translation>
 <translation id="6341580099087024258">Να γίνεται ερώτηση σχετικά με την τοποθεσία αποθήκευσης των αρχείων</translation>
@@ -1193,6 +1199,7 @@
 <translation id="6486420406192123355">Αυτό το αρχείο PDF προέρχεται από έναν ιστότοπο που χρησιμοποιεί μη ασφαλή σύνδεση</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{Η λήψη του αρχείου ολοκληρώθηκε.}other{# ολοκληρωμένες λήψεις}}</translation>
 <translation id="6508722015517270189">Επανεκκινήστε το Chrome</translation>
+<translation id="6513924416597632811">Αντιγραφή συνδέσμου στη σελίδα αποτελεσμάτων αναζήτησης για: <ph name="SEARCH_QUERY" />. Πηγή: <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">Επαλήθευση</translation>
 <translation id="6527303717912515753">Κοινοποίηση</translation>
 <translation id="652948702951888897">Ιστορικό Chrome</translation>
@@ -1604,6 +1611,7 @@
 <translation id="8221401890884589479">Μπορείτε να αποκλείσετε τους ιστοτόπους που δεν επιθυμείτε. Επίσης, το Chrome διαγράφει αυτόματα τους ιστοτόπους που είναι παλαιότεροι των 30 ημερών. <ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">Διαγραφή δεδομένων περιήγησης</translation>
 <translation id="8223642481677794647">Μενού της κάρτας ροής</translation>
+<translation id="82296173028782770">Επεξεργασία ερωτήματος αναζήτησης: <ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">Πλέον, η ολίσθηση προς τα δεξιά σάς μεταφέρει προς τα πίσω για να δείτε προηγούμενες σελίδες που έχετε επισκεφτεί, ενώ η ολίσθηση προς τα αριστερά σάς μεταφέρει προς τα εμπρός</translation>
 <translation id="8236097722223016103">Προσθήκη στους σελιδοδείκτες</translation>
 <translation id="8243077599929149377">Προσθέστε το όνομα χρήστη σας</translation>
@@ -1752,6 +1760,7 @@
 <translation id="8890668505403261809">Αναζήτηση στις καρτέλες ανώνυμης περιήγησης</translation>
 <translation id="8898822736010347272">Στέλνει URL από ορισμένες σελίδες που επισκέπτεστε, περιορισμένες πληροφορίες συστήματος και ορισμένο περιεχόμενο σελίδας στην Google, για να συμβάλλει στην ανακάλυψη νέων απειλών και την προστασία όλων των χρηστών στον ιστό.</translation>
 <translation id="8909135823018751308">Κοινοποίηση…</translation>
+<translation id="8918299437379122615">Κοινή χρήση συνδέσμου προς τη σελίδα αποτελεσμάτων αναζήτησης για: <ph name="SEARCH_QUERY" />. Πηγή: <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">Κατεβάστε σελίδες από το κουμπί "Περισσότερες επιλογές" για να τις χρησιμοποιήσετε εκτός σύνδεσης</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation>
 <translation id="892496902842311796">Η γλώσσα <ph name="LANG" /> είναι έτοιμη</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
index 5c2c19f..26b46e4 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -475,6 +475,7 @@
 <translation id="3208584281581115441">Kontrolli kohe</translation>
 <translation id="3211426585530211793"><ph name="ITEM_TITLE" /> kustutati</translation>
 <translation id="3220943972464248773">Paroolide sünkroonimiseks kinnitage oma isik</translation>
+<translation id="323213525320714789">ARENDAJA</translation>
 <translation id="3232293466644486101">Sirvimisandmete kustutamine …</translation>
 <translation id="3232754137068452469">Veebirakendus</translation>
 <translation id="3236059992281584593">Jäänud on 1 minut</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
index 2acb588f..36c1ee6 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -455,6 +455,7 @@
 <translation id="3072980200212375806">‏<ph name="APP_NAME" /> در Chrome باز می‌شود. درصورت ادامه دادن، با <ph name="BEGIN_LINK1" />شرایط خدمات Google<ph name="END_LINK1" /> و <ph name="BEGIN_LINK2" />شرایط خدمات تکمیلی Google Chrome و ChromeOS<ph name="END_LINK2" /> موافقت می‌کنید. <ph name="BEGIN_LINK3" />خط‌مشی رازداری<ph name="END_LINK3" /> نیز اعمال می‌شود.</translation>
 <translation id="3080525922482950719">می‌توانید صفحه‌ها را برای خواندن در فرصتی دیگر یا در حالت آفلاین ذخیره کنید</translation>
 <translation id="3087734570205094154">پایین</translation>
+<translation id="3088687687599869821">پیمایش صفحه</translation>
 <translation id="3091010850649238832">نمایش محتوای بریده‌دان</translation>
 <translation id="3098745985164956033">‏برخی از تصاویر به Google ارسال می‌شوند تا شرح آن‌ها برایتان بهبود یابد</translation>
 <translation id="3114507951000454849">اخبار <ph name="NEWS_ICON" /> امروز را بخوانید</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
index decb03d2..0383b40b 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">Économisez jusqu'à 60 % de données, découvrez les actualités du jour</translation>
 <translation id="1303339473099049190">Ce mot de passe est introuvable. Vérifiez l'orthographe et réessayez.</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> - Envoyé par <ph name="DEVICE_NAME" /></translation>
+<translation id="1318262688555255786">Partager le lien vers la page Web <ph name="PAGE_TITLE" />. Source : <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">Dossiers de flux d'enregistrement des favoris ouverts à pleine hauteur</translation>
 <translation id="1327257854815634930">L'historique de navigation est ouvert</translation>
 <translation id="1331212799747679585">Impossible de mettre à jour Chrome. Autres options</translation>
@@ -515,6 +516,7 @@
 <translation id="3435465986463792564">Vous avez de nombreuses fenêtres ouvertes? Vous pouvez les gérer à partir d'ici</translation>
 <translation id="3435575784518354875">Pour conserver l'accès à vos mots de passe, exportez-les maintenant, mettez à jour les services Google Play, puis réimportez-les dans le gestionnaire de mots de passe Google. <ph name="BEGIN_LINK" />Affichez les instructions complètes.<ph name="END_LINK" /></translation>
 <translation id="3435738964857648380">Sécurité</translation>
+<translation id="3435914367318771664">Ajouter cet onglet au nouveau groupe</translation>
 <translation id="3439276997620616816">Vous trouverez vos onglets récents ici</translation>
 <translation id="3443221991560634068">Actualiser la page actuelle</translation>
 <translation id="3444179773590444986">Faire part de vos commentaires sur le thème sombre pour les sites?</translation>
@@ -781,6 +783,7 @@
 <translation id="4684427112815847243">Tout synchroniser</translation>
 <translation id="4685741273709472646">Sélectionnez dans la liste du menu déroulant</translation>
 <translation id="4687718960473379118">Annonces suggérées par les sites</translation>
+<translation id="468924408576231679">Copier le lien vers la page Web <ph name="PAGE_TITLE" />. Source : <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">Obtenir un meilleur contenu</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 et <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> autre option de livraison}one{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 et <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> autre option de livraison}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 et <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> autres options de livraison}}</translation>
 <translation id="4698061626562952596">Consultez vos onglets inactifs ici</translation>
@@ -1123,6 +1126,7 @@
 <translation id="6205314730813004066">Confidentialité des annonces</translation>
 <translation id="6210748933810148297">Pas <ph name="EMAIL" />?</translation>
 <translation id="6211386937064921208">Affichage de l'aperçu de cette page</translation>
+<translation id="6212567362666004597">Ajouter cet onglet au groupe</translation>
 <translation id="6221633008163990886">Déverrouillez pour exporter vos mots de passe</translation>
 <translation id="6225572914528673855">Barre d'adresse</translation>
 <translation id="6232535412751077445">Si vous activez la fonction « Ne pas faire le suivi », une demande sera incluse dans le trafic lié à votre navigation. Les résultats obtenus dépendent de la réponse du site (s'il répond ou non) et de la manière dont il interprète la demande.
@@ -1150,6 +1154,7 @@
 <translation id="6324916366299863871">Modifier un raccourci</translation>
 <translation id="6324977638108296054">Impossible de créer un lien vers l'élément en surbrillance</translation>
 <translation id="6333140779060797560">Partager à l'aide de <ph name="APPLICATION" /></translation>
+<translation id="6335454563754888572">Modifier l'URL pointant vers la page sur : <ph name="PAGE_URL" /></translation>
 <translation id="6337234675334993532">Chiffrement</translation>
 <translation id="6340526405444716530">Personnalisation</translation>
 <translation id="6341580099087024258">Demander où enregistrer les fichiers</translation>
@@ -1193,6 +1198,7 @@
 <translation id="6486420406192123355">Ce fichier PDF provient d'un site utilisant une connexion non sécurisée</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{Fichier téléchargé}one{# téléchargement terminé}other{# téléchargements terminés}}</translation>
 <translation id="6508722015517270189">Redémarrer Google Chrome</translation>
+<translation id="6513924416597632811">Copier le lien vers la page de résultats de recherche pour : <ph name="SEARCH_QUERY" />. Source : <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">Vérifier</translation>
 <translation id="6527303717912515753">Partager</translation>
 <translation id="652948702951888897">Historique de Google Chrome</translation>
@@ -1604,6 +1610,7 @@
 <translation id="8221401890884589479">Vous pouvez bloquer les annonces des sites de votre choix. En outre, Chrome supprime automatiquement les sites de la liste datant de plus de 30 jours. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">Suppression des données de navigation en cours…</translation>
 <translation id="8223642481677794647">Menu de la carte du flux</translation>
+<translation id="82296173028782770">Modifier la requête de recherche : <ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">Désormais, un balayage vers la droite vous ramène en arrière pour voir les pages précédentes que vous avez visitées, et un balayage vers la gauche vous fait avancer.</translation>
 <translation id="8236097722223016103">Ajouter aux favoris</translation>
 <translation id="8243077599929149377">Ajouter votre nom d'utilisateur</translation>
@@ -1752,6 +1759,7 @@
 <translation id="8890668505403261809">Recherchez dans vos onglets de navigation privée</translation>
 <translation id="8898822736010347272">Envoie à Google des URL de certaines pages que vous visitez, certaines données système et des échantillons de contenu des pages afin d'aider à découvrir de nouvelles menaces et de protéger tous les internautes.</translation>
 <translation id="8909135823018751308">Partager...</translation>
+<translation id="8918299437379122615">Partager le lien vers la page de résultats de recherche pour : <ph name="SEARCH_QUERY" />. Source : <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">Téléchargez des pages à partir du bouton Plus d'options pour les utiliser hors connexion</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
 <translation id="892496902842311796"><ph name="LANG" /> est prêt</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
index 3e34033..a136806 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">60% જેટલો ડેટા બચાવો, આજના સમાચાર વાંચો</translation>
 <translation id="1303339473099049190">તે પાસવર્ડ શોધી શકતા નથી. તમારી જોડણી ચેક કરો અને ફરીથી પ્રયાસ કરો.</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> - <ph name="DEVICE_NAME" /> પરથી મોકલેલ</translation>
+<translation id="1318262688555255786">વેબપેજ <ph name="PAGE_TITLE" />ની લિંક શેર કરો. સૉર્સ: <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">બુકમાર્ક સાચવવાના ફ્લોના ફોલ્ડરો સંપૂર્ણ ઊંચાઈએ ખુલ્લા છે</translation>
 <translation id="1327257854815634930">નૅવિગેશન ઇતિહાસ ખુલ્લો છે</translation>
 <translation id="1331212799747679585">Chrome અપડેટ કરી શકાતું નથી. વધુ વિકલ્પો</translation>
@@ -515,6 +516,7 @@
 <translation id="3435465986463792564">શું ઘણી વિન્ડો ખોલી છે? તમે તેમને અહીંથી મેનેજ કરી શકો છો</translation>
 <translation id="3435575784518354875">તમારા પાસવર્ડનો ઍક્સેસ જાળવી રાખવા માટે, તેની હમણાં નિકાસ કરો, Google Play સેવાઓ અપડેટ કરો અને પછી તેમને પાછા Google Password Managerમાં આયાત કરો. <ph name="BEGIN_LINK" />સંપૂર્ણ સૂચના જુઓ<ph name="END_LINK" />.</translation>
 <translation id="3435738964857648380">સુરક્ષા</translation>
+<translation id="3435914367318771664">નવા ગ્રૂપમાં ટૅબ ઉમેરો</translation>
 <translation id="3439276997620616816">તમને તમારા તાજેતરના ટૅબ અહીં મળશે</translation>
 <translation id="3443221991560634068">હાલનું પેજ ફરીથી લોડ કરો</translation>
 <translation id="3444179773590444986">શું સાઇટ માટે ઘેરી થીમ પર પ્રતિસાદ શેર કરીએ?</translation>
@@ -781,6 +783,7 @@
 <translation id="4684427112815847243">દરેક વસ્તુ સમન્વયિત કરો</translation>
 <translation id="4685741273709472646">ડ્રૉપડાઉન સૂચિમાંથી પસંદ કરો</translation>
 <translation id="4687718960473379118">સાઇટ દ્વારા સૂચવેલી જાહેરાતો</translation>
+<translation id="468924408576231679">વેબપેજ <ph name="PAGE_TITLE" />ની લિંક કૉપિ કરો. સૉર્સ: <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">બહેતર કન્ટેન્ટ મેળવો</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 અને વધુ <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}one{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 અને વધુ <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 અને વધુ <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}}</translation>
 <translation id="4698061626562952596">તમારા નિષ્ક્રિય ટૅબનો અહીં રિવ્યૂ કરો</translation>
@@ -1123,6 +1126,7 @@
 <translation id="6205314730813004066">જાહેરાત સંબંધી પ્રાઇવસી</translation>
 <translation id="6210748933810148297"><ph name="EMAIL" /> નથી?</translation>
 <translation id="6211386937064921208">આ પેજનો પ્રીવ્યૂ કરી રહ્યાં છીએ</translation>
+<translation id="6212567362666004597">ગ્રૂપમાં ટૅબ ઉમેરો</translation>
 <translation id="6221633008163990886">તમારા બધા પાસવર્ડને નિકાસ કરવા માટે અનલૉક કરો</translation>
 <translation id="6225572914528673855">ઍડ્રેસ બાર</translation>
 <translation id="6232535412751077445">'ટ્રૅક કરશો નહીં’ ને સક્ષમ કરવાનો અર્થ છે કે તમારા બ્રાઉઝિંગ ટ્રાફિકમાં વિનંતી શામેલ કરવામાં આવશે. કોઈ વેબસાઇટ, વિનંતી પર પ્રતિસાદ કરે છે કે નહીં અને વિનંતીનું અર્થઘટન કેવી રીતે કર્યું તેના પર કોઈ પણ અસર આધારિત હોય છે.
@@ -1150,6 +1154,7 @@
 <translation id="6324916366299863871">શૉર્ટકટમાંમાં ફેરફાર કરો</translation>
 <translation id="6324977638108296054">હાઇલાઇટ કરેલી ટેક્સ્ટની લિંક બનાવી શકતા નથી</translation>
 <translation id="6333140779060797560"><ph name="APPLICATION" /> મારફતે શેર કરો</translation>
+<translation id="6335454563754888572">આના પર પેજનો સંકેત આપતા URLમાં ફેરફાર કરો: <ph name="PAGE_URL" /></translation>
 <translation id="6337234675334993532">એન્ક્રિપ્શન</translation>
 <translation id="6340526405444716530">મનગમતું બનાવવું</translation>
 <translation id="6341580099087024258">ફાઇલો ક્યાં સાચવવી તે પૂછો</translation>
@@ -1193,6 +1198,7 @@
 <translation id="6486420406192123355">આ PDF ફાઇલ અસુરક્ષિત કનેક્શનનો ઉપયોગ કરતી સાઇટમાંથી છે</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{ફાઇલ ડાઉનલોડ કરી}one{# ડાઉનલોડ પૂર્ણ થયું}other{# ડાઉનલોડ પૂર્ણ થયા}}</translation>
 <translation id="6508722015517270189">Chrome ને પુનઃપ્રારંભ કરો</translation>
+<translation id="6513924416597632811">આના માટે શોધ પરિણામોના પેજની લિંક કૉપિ કરો: <ph name="SEARCH_QUERY" />. સૉર્સ: <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">પ્રમાણિત કરો</translation>
 <translation id="6527303717912515753">શેર કરો</translation>
 <translation id="652948702951888897">Chrome ઇતિહાસ</translation>
@@ -1604,6 +1610,7 @@
 <translation id="8221401890884589479">તમને ન જોઈતી સાઇટ તમે બ્લૉક કરી શકો છો. Chrome સૂચિમાંથી 30 દિવસથી જૂની સાઇટને પણ ઑટોમૅટિક રીતે ડિલીટ કરે છે. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">બ્રાઉઝિંગ ડેટા ડિલીટ કરી રહ્યાં છીએ</translation>
 <translation id="8223642481677794647">ફીડ કાર્ડ મેનૂ</translation>
+<translation id="82296173028782770">શોધ ક્વેરીમાં ફેરફાર કરો: <ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">હવે જમણે સ્વાઇપ કરવાથી તમે પાછળ જશો અને તમે મુલાકાત લીધેલા અગાઉના પેજ જોઈ શકશો અને ડાબે સ્વાઇપ કરવાથી તમે આગળ વધશો</translation>
 <translation id="8236097722223016103">બુકમાર્કમાં ઉમેરો</translation>
 <translation id="8243077599929149377">તમારું વપરાશકર્તાનું નામ ઉમેરો</translation>
@@ -1752,6 +1759,7 @@
 <translation id="8890668505403261809">તમારા છૂપા ટૅબ શોધો</translation>
 <translation id="8898822736010347272">વેબ પરના નવા જોખમો શોધી કાઢવા અને દરેક વ્યક્તિની સુરક્ષિતતામાં સહાય કરવા માટે, તમે મુલાકાત લેતા અમુક પેજના URLs, સિસ્ટમની મર્યાદિત માહિતી અને પેજનું અમુક કન્ટેન્ટ Googleને મોકલે છે.</translation>
 <translation id="8909135823018751308">શેર કરો…</translation>
+<translation id="8918299437379122615">આના માટે શોધ પરિણામોના પેજની લિંક શેર કરો: <ph name="SEARCH_QUERY" />. સૉર્સ: <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">વધુ વિકલ્પો બટનની મદદથી પેજ ડાઉનલોડ કરો, જેથી તમે ઇન્ટરનેટ વિના પણ તેનો ઉપયોગ કરી શકો</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation>
 <translation id="892496902842311796"><ph name="LANG" /> ભાષા તૈયાર છે</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
index debdd0f1f..2d69991 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">60% तक डेटा बचाएं, आज की खबरें पढ़ें</translation>
 <translation id="1303339473099049190">वह पासवर्ड नहीं मिला. अपनी स्पेलिंग की जांच करें और फिर से कोशिश करें.</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> - <ph name="DEVICE_NAME" /> से भेजा गया</translation>
+<translation id="1318262688555255786"><ph name="PAGE_TITLE" /> वेबपेज का लिंक शेयर करें. सोर्स: <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">बुकमार्क सेव फ़्लो के फ़ोल्डर, पूरी स्क्रीन पर खुले हैं</translation>
 <translation id="1327257854815634930">नेविगेशन का इतिहास अपने पूरे आकार में खुला हुआ है</translation>
 <translation id="1331212799747679585">Chrome अपडेट नहीं किया जा सकता. ज़्यादा विकल्प</translation>
@@ -515,6 +516,7 @@
 <translation id="3435465986463792564">कई विंडो खुली हैं? उन सभी को यहां से मैनेज किया जा सकता है</translation>
 <translation id="3435575784518354875">अपने पासवर्ड का ऐक्सेस बनाए रखने के लिए, उन्हें अभी एक्सपोर्ट करें. इसके बाद, Google Play Services को अपडेट करें और फिर उन्हें Google Password Manager पर इंपोर्ट करें. <ph name="BEGIN_LINK" />पूरे निर्देश देखें<ph name="END_LINK" />.</translation>
 <translation id="3435738964857648380">सुरक्षा</translation>
+<translation id="3435914367318771664">नए ग्रुप में टैब जोड़ें</translation>
 <translation id="3439276997620616816">आपको हाल ही में खोले गए टैब, यहां दिखेंगे</translation>
 <translation id="3443221991560634068">वर्तमान पेज फिर से लोड करें</translation>
 <translation id="3444179773590444986">क्या आप साइटों के लिए गहरे रंग वाली थीम से जुड़े सुझाव, शिकायत या राय शेयर करना चाहते हैं?</translation>
@@ -781,6 +783,7 @@
 <translation id="4684427112815847243">सब कुछ सिंक करें</translation>
 <translation id="4685741273709472646">ड्रॉपडाउन सूची में से चुनें</translation>
 <translation id="4687718960473379118">साइट की ओर से सुझाए गए विज्ञापन</translation>
+<translation id="468924408576231679">वेबपेज <ph name="PAGE_TITLE" /> का लिंक कॉपी करें. सोर्स: <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">कॉन्टेंट के बेहतर सुझाव पाएं</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 और <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> अन्य}one{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 और <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> अन्य}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 और <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> अन्य}}</translation>
 <translation id="4698061626562952596">यहां जाकर इनऐक्टिव टैब देखें</translation>
@@ -1123,6 +1126,7 @@
 <translation id="6205314730813004066">विज्ञापन से जुड़ी निजता सेटिंग</translation>
 <translation id="6210748933810148297">क्या <ph name="EMAIL" /> नहीं हैं?</translation>
 <translation id="6211386937064921208">इस पेज की झलक दिखाई जा रही है</translation>
+<translation id="6212567362666004597">टैब को ग्रुप में जोड़ें</translation>
 <translation id="6221633008163990886">अपने पासवर्ड निर्यात करने के लिए अनलॉक करें</translation>
 <translation id="6225572914528673855">पता बार</translation>
 <translation id="6232535412751077445">‘नज़र न रखें’ सुविधा को चालू करने का मतलब है कि आपके ब्राउज़िंग ट्रैफ़िक के साथ कोई अनुरोध शामिल किया जाएगा. कोई भी प्रभाव इस बात पर निर्भर करता है कि वेबसाइट, अनुरोध का जवाब देती है या नहीं और अनुरोध को किस तरह समझा जाता है.
@@ -1150,6 +1154,7 @@
 <translation id="6324916366299863871">शॉर्टकट में बदलाव करें</translation>
 <translation id="6324977638108296054">हाइलाइट किए गए टेक्स्ट का लिंक नहीं बनाया जा सकता</translation>
 <translation id="6333140779060797560"><ph name="APPLICATION" /> के द्वारा शेयर करें</translation>
+<translation id="6335454563754888572">यूआरएल में बदलाव करें, ताकि वह इस पेज पर ले जाए: <ph name="PAGE_URL" /></translation>
 <translation id="6337234675334993532">सुरक्षित करने का तरीका</translation>
 <translation id="6340526405444716530">मनमुताबिक बनाना</translation>
 <translation id="6341580099087024258">फ़ाइलें सेव करने की जगह पूछें</translation>
@@ -1193,6 +1198,7 @@
 <translation id="6486420406192123355">इस PDF फ़ाइल को किसी ऐसी साइट से देखा जा रहा है जो असुरक्षित कनेक्शन का इस्तेमाल कर रही है</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{फ़ाइल डाउनलोड हो गई है}one{# डाउनलोड पूरा हुआ}other{# डाउनलोड पूरे हुए}}</translation>
 <translation id="6508722015517270189">Chrome को फिर से शुरू करें</translation>
+<translation id="6513924416597632811"><ph name="SEARCH_QUERY" /> के लिए खोज नतीजों के पेज का लिंक कॉपी करें. सोर्स: <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">पुष्टि करें</translation>
 <translation id="6527303717912515753">शेयर करें</translation>
 <translation id="652948702951888897">Chrome इतिहास</translation>
@@ -1604,6 +1610,7 @@
 <translation id="8221401890884589479">आपके पास किसी भी साइट को ब्लॉक करने का विकल्प होता है. Chrome, ब्लॉक की गई साइटों की सूची से उन साइटों को भी अपने-आप मिटा देता है जिन्हें 30 दिन पहले इस सूची में जोड़ा गया था. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">ब्राउज़िंग डेटा मिटाया जा रहा है</translation>
 <translation id="8223642481677794647">फ़ीड कार्ड मेन्यू</translation>
+<translation id="82296173028782770">सर्च क्वेरी में बदलाव करें: <ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">अब दाईं ओर स्वाइप करने पर, आपको पिछले पेज पर वापस ले जाया जाएगा. वहीं, बाईं ओर स्वाइप करने पर आपको अगले पेज पर ले जाया जाएगा</translation>
 <translation id="8236097722223016103">बुकमार्क में जोड़ें</translation>
 <translation id="8243077599929149377">अपना उपयोगकर्ता नाम जोड़ें</translation>
@@ -1752,6 +1759,7 @@
 <translation id="8890668505403261809">अपने गुप्त टैब खोजें</translation>
 <translation id="8898822736010347272">आपने जिन पेजों को विज़िट किया है उनमें से कुछ के यूआरएल, सिस्टम की सीमित जानकारी, और पेज का कुछ कॉन्टेंट Google को भेजा जाता है. ऐसा इसलिए, ताकि नए खतरों का पता लगाया जा सके और वेब पर सबको सुरक्षित रखा जा सके.</translation>
 <translation id="8909135823018751308">शेयर करें…</translation>
+<translation id="8918299437379122615"><ph name="SEARCH_QUERY" /> के लिए खोज नतीजों के पेज का लिंक शेयर करें. सोर्स: <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">पेज का ऑफ़लाइन उपयोग करने के लिए उन्हें ज़्यादा विकल्प बटन से डाउनलोड करें</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation>
 <translation id="892496902842311796"><ph name="LANG" /> तैयार है</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
index 31f09f3..d149bda23 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -477,6 +477,7 @@
 <translation id="3208584281581115441">Provjeri sad</translation>
 <translation id="3211426585530211793">Izbrisano <ph name="ITEM_TITLE" /></translation>
 <translation id="3220943972464248773">Za sinkroniziranje zaporki potvrdite da ste to vi</translation>
+<translation id="323213525320714789">RAZVOJNI PROGRAMER</translation>
 <translation id="3232293466644486101">Brisanje podataka o pregledavanju…</translation>
 <translation id="3232754137068452469">Web-aplikacija</translation>
 <translation id="3236059992281584593">Još 1 min</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
index dae69e9..4ba30b1 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">Hemat data hingga 60%, baca berita hari ini</translation>
 <translation id="1303339473099049190">Tidak dapat menemukan sandi tersebut. Periksa ejaan sandi dan coba lagi.</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> - Dikirim dari <ph name="DEVICE_NAME" /></translation>
+<translation id="1318262688555255786">Bagikan link ke halaman web <ph name="PAGE_TITLE" />. Sumber: <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">Folder alur penyimpanan bookmark terbuka sepenuhnya</translation>
 <translation id="1327257854815634930">Histori navigasi terbuka</translation>
 <translation id="1331212799747679585">Chrome tidak dapat diupdate. Opsi lainnya</translation>
@@ -515,6 +516,7 @@
 <translation id="3435465986463792564">Membuka banyak jendela Chrome? Anda dapat mengelolanya dari sini</translation>
 <translation id="3435575784518354875">Untuk mempertahankan akses ke sandi Anda, ekspor sandi sekarang, update Layanan Google Play, lalu impor sandi tersebut kembali ke Pengelola Sandi Google. <ph name="BEGIN_LINK" />Lihat petunjuk lengkap<ph name="END_LINK" />.</translation>
 <translation id="3435738964857648380">Keamanan</translation>
+<translation id="3435914367318771664">Tambahkan tab ke grup baru</translation>
 <translation id="3439276997620616816">Tab yang baru-baru ini ditutup akan ditampilkan di sini</translation>
 <translation id="3443221991560634068">Memuat ulang halaman saat ini</translation>
 <translation id="3444179773590444986">Bagikan masukan terkait tema gelap untuk situs?</translation>
@@ -781,6 +783,7 @@
 <translation id="4684427112815847243">Sinkronkan semua</translation>
 <translation id="4685741273709472646">Pilih dari daftar dropdown</translation>
 <translation id="4687718960473379118">Iklan yang disarankan situs</translation>
+<translation id="468924408576231679">Salin link ke halaman web <ph name="PAGE_TITLE" />. Sumber: <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">Dapatkan konten yang lebih baik</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 dan <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> lainnya}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 dan <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> lainnya}}</translation>
 <translation id="4698061626562952596">Tinjau tab tidak aktif di sini</translation>
@@ -1123,6 +1126,7 @@
 <translation id="6205314730813004066">Privasi iklan</translation>
 <translation id="6210748933810148297">Bukan <ph name="EMAIL" />?</translation>
 <translation id="6211386937064921208">Melihat pratinjau halaman ini</translation>
+<translation id="6212567362666004597">Tambahkan tab ke grup</translation>
 <translation id="6221633008163990886">Buka kunci untuk mengekspor sandi</translation>
 <translation id="6225572914528673855">Kolom URL</translation>
 <translation id="6232535412751077445">Jika “Jangan Lacak” diaktifkan, permintaan akan disertakan bersama traffic penjelajahan Anda. Dampaknya tergantung pada apakah situs web menanggapi permintaan itu, dan bagaimana permintaan itu diinterpretasikan.
@@ -1150,6 +1154,7 @@
 <translation id="6324916366299863871">Edit pintasan</translation>
 <translation id="6324977638108296054">Tidak dapat membuat link ke sorotan</translation>
 <translation id="6333140779060797560">Bagikan dengan <ph name="APPLICATION" /></translation>
+<translation id="6335454563754888572">Edit URL yang mengarah ke halaman di: <ph name="PAGE_URL" /></translation>
 <translation id="6337234675334993532">Enkripsi</translation>
 <translation id="6340526405444716530">Personalisasi</translation>
 <translation id="6341580099087024258">Tanya lokasi menyimpan file</translation>
@@ -1193,6 +1198,7 @@
 <translation id="6486420406192123355">File PDF ini berasal dari situs yang menggunakan koneksi yang tidak aman</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{File didownload}other{# download selesai}}</translation>
 <translation id="6508722015517270189">Buka Ulang Chrome</translation>
+<translation id="6513924416597632811">Salin link ke halaman hasil penelusuran untuk: <ph name="SEARCH_QUERY" />. Sumber: <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">Verifikasi</translation>
 <translation id="6527303717912515753">Bagikan</translation>
 <translation id="652948702951888897">Histori Chrome</translation>
@@ -1604,6 +1610,7 @@
 <translation id="8221401890884589479">Anda dapat memblokir situs yang tidak diinginkan. Chrome juga otomatis menghapus situs dari daftar yang tersimpan lebih dari 30 hari. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">Menghapus data penjelajahan</translation>
 <translation id="8223642481677794647">Menu kartu feed</translation>
+<translation id="82296173028782770">Edit kueri penelusuran: <ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">Sekarang, bergeser ke kanan akan membawa Anda kembali untuk melihat halaman sebelumnya yang telah Anda buka, sedangkan bergeser ke kiri akan membuka halaman berikutnya</translation>
 <translation id="8236097722223016103">Tambahkan ke bookmark</translation>
 <translation id="8243077599929149377">Tambahkan nama pengguna Anda</translation>
@@ -1752,6 +1759,7 @@
 <translation id="8890668505403261809">Telusuri tab Samaran Anda</translation>
 <translation id="8898822736010347272">Kirim URL beberapa halaman yang Anda kunjungi, informasi sistem terbatas, dan beberapa konten halaman ke Google untuk membantu menemukan ancaman baru dan melindungi semua orang di web.</translation>
 <translation id="8909135823018751308">Bagikan...</translation>
+<translation id="8918299437379122615">Bagikan link ke halaman hasil penelusuran untuk: <ph name="SEARCH_QUERY" />. Sumber: <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">Download halaman dari tombol opsi Lainnya untuk menggunakannya secara offline</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Pelajari Lebih Lanjut<ph name="END_LINK" /></translation>
 <translation id="892496902842311796"><ph name="LANG" /> sudah siap</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
index bda7693..71ab58d2 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
@@ -455,6 +455,7 @@
 <translation id="3072980200212375806"><ph name="APP_NAME" /> opnast í Chrome. Með því að halda áfram samþykkirðu <ph name="BEGIN_LINK1" />þjónustuskilmála Google<ph name="END_LINK1" /> og <ph name="BEGIN_LINK2" />viðbótarþjónustuskilmála Google Chrome og ChromeOS<ph name="END_LINK2" />. <ph name="BEGIN_LINK3" />Persónuverndarstefnan<ph name="END_LINK3" /> gildir einnig.</translation>
 <translation id="3080525922482950719">Þú getur vistað síður til að lesa þær síðar eða án nettengingar</translation>
 <translation id="3087734570205094154">Neðst</translation>
+<translation id="3088687687599869821">SÍÐUFLETTING</translation>
 <translation id="3091010850649238832">Sýna innihald klippiborðs</translation>
 <translation id="3098745985164956033">Sumar myndir eru sendar til Google til að bæta lýsingar</translation>
 <translation id="3114507951000454849">Lestu fréttir dagsins <ph name="NEWS_ICON" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
index 7ac0ea4..0b6fcb3 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">最大 60% のデータを節約、今日のニュースもチェック</translation>
 <translation id="1303339473099049190">お探しのパスワードが見つかりません。誤字や脱字がないかご確認のうえ、もう一度お試しください。</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> - <ph name="DEVICE_NAME" /> から送信</translation>
+<translation id="1318262688555255786">ウェブページ「<ph name="PAGE_TITLE" />」へのリンクを共有します。ソース: <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">ブックマーク保存フロー フォルダが画面全体に表示されています</translation>
 <translation id="1327257854815634930">ナビゲーション履歴が開いています</translation>
 <translation id="1331212799747679585">Chrome を更新できません。その他のオプション</translation>
@@ -455,6 +456,7 @@
 <translation id="3072980200212375806">Chrome で <ph name="APP_NAME" /> を開きます。続行すると、<ph name="BEGIN_LINK1" />Google 利用規約<ph name="END_LINK1" />と <ph name="BEGIN_LINK2" />Google Chrome および ChromeOS 追加利用規約<ph name="END_LINK2" />に同意したものと見なされます。また、<ph name="BEGIN_LINK3" />プライバシー ポリシー<ph name="END_LINK3" />も適用されます。</translation>
 <translation id="3080525922482950719">ページを保存して、後で読んだり、オフラインで読んだりできます</translation>
 <translation id="3087734570205094154">下</translation>
+<translation id="3088687687599869821">ページの操作</translation>
 <translation id="3091010850649238832">クリップボードの内容を表示</translation>
 <translation id="3098745985164956033">正確な説明を生成するため、画像が Google に送信される場合があります</translation>
 <translation id="3114507951000454849">今日のニュースをチェック <ph name="NEWS_ICON" /></translation>
@@ -515,6 +517,7 @@
 <translation id="3435465986463792564">ウィンドウの数が多くてお困りの場合も、ここで管理できます</translation>
 <translation id="3435575784518354875">パスワードを引き続き使用できるようにするには、今すぐパスワードをエクスポートし、Google Play 開発者サービスを更新してから、Google パスワード マネージャーに再度インポートしてください。<ph name="BEGIN_LINK" />詳細な手順はこちらをご覧ください<ph name="END_LINK" />。</translation>
 <translation id="3435738964857648380">セキュリティ</translation>
+<translation id="3435914367318771664">タブを新しいグループに追加</translation>
 <translation id="3439276997620616816">最近使ったタブがここに表示されます</translation>
 <translation id="3443221991560634068">現在のページを再読み込みする</translation>
 <translation id="3444179773590444986">サイトのダークモードに関するフィードバックを共有しますか?</translation>
@@ -781,6 +784,7 @@
 <translation id="4684427112815847243">すべてを同期する</translation>
 <translation id="4685741273709472646">プルダウン リストから選択します</translation>
 <translation id="4687718960473379118">ウェブサイトによる広告の提案</translation>
+<translation id="468924408576231679">ウェブページ「<ph name="PAGE_TITLE" />」へのリンクをコピーします。ソース: <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">関連性の高いコンテンツを表示</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 他 <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> 件}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 他 <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> 件}}</translation>
 <translation id="4698061626562952596">ここでアクティブでないタブを確認できます</translation>
@@ -1123,6 +1127,7 @@
 <translation id="6205314730813004066">広告プライバシー</translation>
 <translation id="6210748933810148297"><ph name="EMAIL" /> ではありませんか?</translation>
 <translation id="6211386937064921208">このページのプレビューを表示しています</translation>
+<translation id="6212567362666004597">タブをグループに追加</translation>
 <translation id="6221633008163990886">ロックを解除してパスワードをエクスポート</translation>
 <translation id="6225572914528673855">アドレスバー</translation>
 <translation id="6232535412751077445">「Do Not Track」を有効にすると、リクエストが閲覧トラフィックに含まれるようになります。ウェブサイトがリクエストに応答するかどうか、またリクエストがどのように解釈されるかによって、この影響は異なります。
@@ -1150,6 +1155,7 @@
 <translation id="6324916366299863871">ショートカットの編集</translation>
 <translation id="6324977638108296054">選択箇所へのリンクを作成できません</translation>
 <translation id="6333140779060797560"><ph name="APPLICATION" /> で共有します</translation>
+<translation id="6335454563754888572"><ph name="PAGE_URL" /> のページを指す URL を編集します</translation>
 <translation id="6337234675334993532">暗号化</translation>
 <translation id="6340526405444716530">カスタマイズ</translation>
 <translation id="6341580099087024258">ファイルの保存場所を確認する</translation>
@@ -1193,6 +1199,7 @@
 <translation id="6486420406192123355">この PDF ファイルは、安全でない接続を使用しているサイトから取得されたものです</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{ファイルをダウンロードしました}other{# 件のダウンロードが完了しました}}</translation>
 <translation id="6508722015517270189">Chrome を再起動する</translation>
+<translation id="6513924416597632811">「<ph name="SEARCH_QUERY" />」の検索結果ページへのリンクをコピーします。ソース: <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">確認</translation>
 <translation id="6527303717912515753">共有</translation>
 <translation id="652948702951888897">Chrome 履歴</translation>
@@ -1604,6 +1611,7 @@
 <translation id="8221401890884589479">広告主のウェブサイトを訪れた後、その企業からの広告を希望しない場合はブロックすることができます。また、30 日以上経過した広告主のウェブサイトはリストから自動削除されます。<ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">閲覧履歴データを削除しています</translation>
 <translation id="8223642481677794647">フィードカード メニュー</translation>
+<translation id="82296173028782770">検索語句「<ph name="SEARCH_QUERY" />」を編集します</translation>
 <translation id="8236063039629122676">右にスワイプすると前に見たページに戻り、左にスワイプすると次のページに進みます</translation>
 <translation id="8236097722223016103">ブックマークに追加</translation>
 <translation id="8243077599929149377">ユーザー名を追加</translation>
@@ -1752,6 +1760,7 @@
 <translation id="8890668505403261809">シークレット タブを検索</translation>
 <translation id="8898822736010347272">新たな脅威の発見と、すべてのウェブユーザーの保護に役立てるため、アクセスした一部のページの URL、限定的なシステム情報、一部のページ コンテンツを Google に送信します。</translation>
 <translation id="8909135823018751308">共有...</translation>
+<translation id="8918299437379122615">「<ph name="SEARCH_QUERY" />」の検索結果ページへのリンクを共有します。ソース: <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">[その他のオプション] からページをダウンロードするとオフラインで使用できるようになります</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation>
 <translation id="892496902842311796"><ph name="LANG" /> を使用できるようになりました</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
index ddd0f1a..81d68e2 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -456,6 +456,7 @@
 <translation id="3072980200212375806"><ph name="APP_NAME" /> გაიხსნება Chrome-ში. გაგრძელებით ეთანხმებით <ph name="BEGIN_LINK1" />Google-ის მომსახურების პირობებს<ph name="END_LINK1" />, ასევე, <ph name="BEGIN_LINK2" />Google Chrome-ისა და ChromeOS-ის მომსახურების დამატებით პირობებს<ph name="END_LINK2" />. გარდა ამისა, მოქმედებს <ph name="BEGIN_LINK3" />კონფიდენციალურობის დებულება<ph name="END_LINK3" />.</translation>
 <translation id="3080525922482950719">სურვილისამებრ, შეგიძლიათ შეინახოთ გვერდები მოგვიანებით ან ხაზგარეშე რეჟიმში წასაკითხად</translation>
 <translation id="3087734570205094154">ქვედა საზღვარი</translation>
+<translation id="3088687687599869821">გვერდზე ნავიგაცია</translation>
 <translation id="3091010850649238832">გაცვლის ბუფერის შიგთავსის ჩვენება</translation>
 <translation id="3098745985164956033">ზოგიერთი სურათი გაეგზავნება Google-ს, უკეთესი აღწერილობები რომ შემოგთავაზოთ</translation>
 <translation id="3114507951000454849">გაეცანით დღის სიახლეებს <ph name="NEWS_ICON" /></translation>
@@ -476,6 +477,7 @@
 <translation id="3208584281581115441">ახლავე შემოწმება</translation>
 <translation id="3211426585530211793"><ph name="ITEM_TITLE" /> წაშლილია</translation>
 <translation id="3220943972464248773">პაროლების სინქრონიზაციისთვის დაადასტურეთ, რომ ეს თქვენ ხართ</translation>
+<translation id="323213525320714789">დეველოპერი</translation>
 <translation id="3232293466644486101">დათვალიერების მონაცემების წაშლა…</translation>
 <translation id="3232754137068452469">ვებ-აპი</translation>
 <translation id="3236059992281584593">დარჩენილია 1 წთ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
index 089d98e..64b83fdf 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -850,7 +850,7 @@
 <translation id="4932247056774066048">Сіз <ph name="DOMAIN_NAME" /> басқаратын аккаунттан шығып бара жатқандықтан, Chrome браузеріңіздегі деректер осы құрылғыдан жойылады. Ол Google аккаунтыңызда сақталады.</translation>
 <translation id="4943703118917034429">Виртуалдық шындық</translation>
 <translation id="4943872375798546930">Нәтижесіз</translation>
-<translation id="4957722034734105353">Толығырақ…</translation>
+<translation id="4957722034734105353">Толық ақпарат…</translation>
 <translation id="4961107849584082341">Осы бетті кез келген тілге аударыңыз</translation>
 <translation id="4964614743143953889">Chrome сізге қауіпті сайттар мен жүктеп алу әрекеттері туралы ескертеді.</translation>
 <translation id="496607651705915226">Жаңа құпия сөздерді Google аккаунтыңызға сақтау және пайдалану үшін Google Play Services қолданбасын жаңартыңыз</translation>
@@ -1654,7 +1654,7 @@
 <translation id="8442258441309440798">Жаңалықтар жоқ</translation>
 <translation id="8443209985646068659">Chrome жаңартылмайды</translation>
 <translation id="8445448999790540984">Құпия сөздерді экспорттау мүмкін емес</translation>
-<translation id="8446884382197647889">Толығырақ</translation>
+<translation id="8446884382197647889">Толық ақпарат</translation>
 <translation id="8449781591250785734">{NUM_SITES,plural, =1{Рұқсаттар 1 сайттан өшірілді}other{Рұқсаттар # сайттан өшірілді}}</translation>
 <translation id="8453310803815879010">Динозавр ойынын бастау</translation>
 <translation id="8455675988389029454">Бетбелгілер, құпия сөздер және т.б. ақпарат барлық құрылғыда болады.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
index 866d844..25d1051 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
@@ -475,6 +475,7 @@
 <translation id="3208584281581115441">ಈಗಲೇ ಪರಿಶೀಲಿಸಿ</translation>
 <translation id="3211426585530211793"><ph name="ITEM_TITLE" /> ಅನ್ನು ಅಳಿಸಲಾಗಿದೆ</translation>
 <translation id="3220943972464248773">ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಲು, ಇದು ನೀವೇ ಎಂದು ದೃಢೀಕರಿಸಿ</translation>
+<translation id="323213525320714789">ಡೆವಲಪರ್</translation>
 <translation id="3232293466644486101">ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ಅಳಿಸಿ…</translation>
 <translation id="3232754137068452469">ವೆಬ್ ಅಪ್ಲಿಕೇಶನ್</translation>
 <translation id="3236059992281584593">1 ನಿಮಿಷ ಉಳಿದಿದೆ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
index 22a6ff3..0703870 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">데이터 최대 60% 절약 및 오늘의 뉴스 읽기</translation>
 <translation id="1303339473099049190">비밀번호를 찾을 수 없습니다. 철자를 확인하고 다시 시도해 주세요.</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> - <ph name="DEVICE_NAME" />에서 전송</translation>
+<translation id="1318262688555255786"><ph name="PAGE_TITLE" /> 웹페이지 링크를 공유합니다. 출처: <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">북마크 저장 흐름 폴더가 전체 높이로 열림</translation>
 <translation id="1327257854815634930">탐색 기록 열림</translation>
 <translation id="1331212799747679585">Chrome을 업데이트할 수 없습니다. 옵션 더보기</translation>
@@ -455,6 +456,7 @@
 <translation id="3072980200212375806"><ph name="APP_NAME" /> 앱이 Chrome에서 열립니다. 계속하면 <ph name="BEGIN_LINK1" />Google 서비스 약관<ph name="END_LINK1" /> 및 <ph name="BEGIN_LINK2" />Chrome 및 ChromeOS 추가 서비스 약관<ph name="END_LINK2" />에 동의하는 것으로 간주됩니다. <ph name="BEGIN_LINK3" />개인정보처리방침<ph name="END_LINK3" />도 적용됩니다.</translation>
 <translation id="3080525922482950719">페이지를 저장하여 나중에 읽거나 오프라인 상태에서 읽을 수 있습니다.</translation>
 <translation id="3087734570205094154">맨 아래</translation>
+<translation id="3088687687599869821">페이지 탐색</translation>
 <translation id="3091010850649238832">클립보드 내용 표시</translation>
 <translation id="3098745985164956033">설명을 개선하기 위해 일부 이미지가 Google에 전송됨</translation>
 <translation id="3114507951000454849">오늘의 뉴스 읽기 <ph name="NEWS_ICON" /></translation>
@@ -515,6 +517,7 @@
 <translation id="3435465986463792564">창이 많이 열렸나요? 여기에서 관리할 수 있습니다.</translation>
 <translation id="3435575784518354875">비밀번호에 대한 액세스를 유지하려면 지금 비밀번호를 내보내고 Google Play 서비스를 업데이트한 후 Google 비밀번호 관리자로 다시 가져오세요. <ph name="BEGIN_LINK" />전체 안내 보기<ph name="END_LINK" /></translation>
 <translation id="3435738964857648380">보안</translation>
+<translation id="3435914367318771664">새 그룹에 탭 추가</translation>
 <translation id="3439276997620616816">여기에서 최근 탭을 확인할 수 있습니다.</translation>
 <translation id="3443221991560634068">현재 페이지 새로고침</translation>
 <translation id="3444179773590444986">사이트의 어두운 테마에 관한 의견을 공유할까요?</translation>
@@ -781,6 +784,7 @@
 <translation id="4684427112815847243">모두 동기화</translation>
 <translation id="4685741273709472646">드롭다운 목록에서 선택</translation>
 <translation id="4687718960473379118">사이트 추천 광고</translation>
+<translation id="468924408576231679"><ph name="PAGE_TITLE" /> 웹페이지 링크를 복사합니다. 출처: <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">더 나은 콘텐츠 받기</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" /> 외 <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />개}other{<ph name="SHIPPING_OPTION_PREVIEW" /> 외 <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />개}}</translation>
 <translation id="4698061626562952596">여기에서 비활성 탭을 검토하세요</translation>
@@ -1123,6 +1127,7 @@
 <translation id="6205314730813004066">광고 개인 정보 보호</translation>
 <translation id="6210748933810148297"><ph name="EMAIL" />이(가) 아닌가요?</translation>
 <translation id="6211386937064921208">페이지 미리보기입니다.</translation>
+<translation id="6212567362666004597">그룹에 탭 추가</translation>
 <translation id="6221633008163990886">비밀번호를 내보내려면 잠금 해제하세요</translation>
 <translation id="6225572914528673855">주소 표시줄</translation>
 <translation id="6232535412751077445">‘추적 안함’을 사용하도록 설정하면 요청이 사용자의 인터넷 사용 트래픽에 포함됩니다. 웹사이트가 요청에 응답하는지 여부와 요청이 해석되는 방법에 따라 결과가 결정됩니다.
@@ -1150,6 +1155,7 @@
 <translation id="6324916366299863871">바로가기 수정</translation>
 <translation id="6324977638108296054">하이라이트 링크를 만들 수 없음</translation>
 <translation id="6333140779060797560">공유 방법: <ph name="APPLICATION" /></translation>
+<translation id="6335454563754888572">다음 페이지를 가리키는 URL을 수정합니다. <ph name="PAGE_URL" /></translation>
 <translation id="6337234675334993532">암호화</translation>
 <translation id="6340526405444716530">맞춤설정</translation>
 <translation id="6341580099087024258">파일 저장 위치 묻기</translation>
@@ -1193,6 +1199,7 @@
 <translation id="6486420406192123355">비보안 연결을 사용하는 사이트에서 가져온 PDF 파일입니다.</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{파일 1개 다운로드 완료}other{다운로드 #개 완료}}</translation>
 <translation id="6508722015517270189">Chrome 다시 시작하기</translation>
+<translation id="6513924416597632811"><ph name="SEARCH_QUERY" />에 대한 검색 결과 페이지 링크를 복사합니다. 출처: <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">확인</translation>
 <translation id="6527303717912515753">공유</translation>
 <translation id="652948702951888897">Chrome 방문 기록</translation>
@@ -1604,6 +1611,7 @@
 <translation id="8221401890884589479">원치 않는 사이트를 차단할 수 있습니다. 또한 Chrome에서는 30일이 지난 사이트도 목록에서 자동 삭제합니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">인터넷 사용 기록 삭제 중</translation>
 <translation id="8223642481677794647">피드 카드 메뉴</translation>
+<translation id="82296173028782770">검색어 수정: <ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">이제 오른쪽으로 스와이프하면 이전에 방문한 페이지로 이동하고, 왼쪽으로 스와이프하면 다음 페이지로 이동합니다.</translation>
 <translation id="8236097722223016103">북마크에 추가</translation>
 <translation id="8243077599929149377">사용자 이름 추가</translation>
@@ -1752,6 +1760,7 @@
 <translation id="8890668505403261809">시크릿 탭 검색</translation>
 <translation id="8898822736010347272">새로운 위협을 발견하고 모든 웹 사용자를 보호하는데 도움을 주기 위해 방문한 일부 페이지의 URL, 제한된 시스템 정보, 일부 페이지 콘텐츠를 Google로 전송합니다.</translation>
 <translation id="8909135823018751308">공유…</translation>
+<translation id="8918299437379122615"><ph name="SEARCH_QUERY" /> 검색 결과 페이지 링크를 공유합니다. 출처: <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">옵션 더보기 버튼을 눌러 페이지를 다운로드하여 오프라인에서 사용하세요.</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation>
 <translation id="892496902842311796"><ph name="LANG" /> 사용 가능</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
index e8ad1c6b..9c257ed 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">Бүгүнкү жаңылыктарды окуганда 60% чейин трафик үнөмдөңүз</translation>
 <translation id="1303339473099049190">Ал сырсөз табылган жок. Анын туура терилгенин текшерип, кайталап көрүңүз.</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> – <ph name="DEVICE_NAME" /> түзмөгүнөн жөнөтүлдү</translation>
+<translation id="1318262688555255786"><ph name="PAGE_TITLE" /> веб-баракчасынын шилтемесин бөлүшүңүз. Булагы: <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">Тематикасына жараша сакталган кыстармалар толук экранда ачылды</translation>
 <translation id="1327257854815634930">Чабыттоо таржымалы ачылды</translation>
 <translation id="1331212799747679585">Chrome жаңырбай жатат. Кошумча параметрлер</translation>
@@ -455,6 +456,7 @@
 <translation id="3072980200212375806"><ph name="APP_NAME" /> Chrome'до ачылат. Улантуу менен, <ph name="BEGIN_LINK1" />Google'дун Тейлөө шарттарына<ph name="END_LINK1" /> жана <ph name="BEGIN_LINK2" />Google Chrome менен ChromeOS'тун Кошумча Тейлөө шарттарына<ph name="END_LINK2" /> макул болосуз. <ph name="BEGIN_LINK3" />Купуялык эрежелери<ph name="END_LINK3" /> да колдонулат.</translation>
 <translation id="3080525922482950719">Барактарды сактап коюп, кийинчерээк оффлайн режиминде окуй аласыз</translation>
 <translation id="3087734570205094154">Аягы</translation>
+<translation id="3088687687599869821">БАРАКТОО</translation>
 <translation id="3091010850649238832">Алмашуу буфериндеги мазмундарды көрсөтүү</translation>
 <translation id="3098745985164956033">Сүрөттөмөлөрдү жакшыртуу үчүн айрым сүрөттөр Google'га жөнөтүлөт</translation>
 <translation id="3114507951000454849">Бүгүнкү жаңылыктарды окуңуз <ph name="NEWS_ICON" /></translation>
@@ -515,6 +517,7 @@
 <translation id="3435465986463792564">Көп терезе ачылып турабы? Аларды бул жерден башкарыңыз</translation>
 <translation id="3435575784518354875">Сырсөздөрдү колдоно берүү үчүн аларды азыр экспорттоп, Google Play кызматтарын жаңыртып, Сырсөздөрдү башкаргычка кайра импорттоп алыңыз. <ph name="BEGIN_LINK" />Толук нускамаларды көрүңүз<ph name="END_LINK" />.</translation>
 <translation id="3435738964857648380">Коопсуздук</translation>
+<translation id="3435914367318771664">Өтмөктү жаңы топко кошуу</translation>
 <translation id="3439276997620616816">Акыркы өтмөктөрүңүздү ушул жерден табасыз</translation>
 <translation id="3443221991560634068">Учурдагы баракты кайра жүктөө</translation>
 <translation id="3444179773590444986">Сайттарга колдонулган караңгы тема тууралуу пикир билдиресизби?</translation>
@@ -781,6 +784,7 @@
 <translation id="4684427112815847243">Баарын шайкештештирүү</translation>
 <translation id="4685741273709472646">Түрүлмө тизмеден тандоо</translation>
 <translation id="4687718960473379118">Сайт сунуштаган жарнамалар</translation>
+<translation id="468924408576231679"><ph name="PAGE_TITLE" /> веб-баракчасынын шилтемесин көчүрүңүз. Булагы: <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">Контентти жакшыртыңыз</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 жана дагы <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 жана дагы <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}}</translation>
 <translation id="4698061626562952596">Жигерсиз өтмөктөрүңүздү бул жерден карап чыгыңыз</translation>
@@ -1123,6 +1127,7 @@
 <translation id="6205314730813004066">Жарнаманын купуялыгы</translation>
 <translation id="6210748933810148297"><ph name="EMAIL" /> эмеспи?</translation>
 <translation id="6211386937064921208">Барак алдын ала көрсөтүлүүдө</translation>
+<translation id="6212567362666004597">Өтмөктү топко кошуу</translation>
 <translation id="6221633008163990886">Сырсөздөрүңүздү экспорттоо үчүн кулпусун ачыңыз</translation>
 <translation id="6225572914528673855">Дарек тилкеси</translation>
 <translation id="6232535412751077445">"Байкоо салынбасын" сурамы иштетилгенде, ал серептелген нерселердин трафигине кошулат. Бул аракет вебсайттын сурамга жооп кайтарып же кайтарбай тургандыгына жана сурамдын чечмеленишине түздөн-түз байланыштуу болот.
@@ -1150,6 +1155,7 @@
 <translation id="6324916366299863871">Кыска жолду түзөтүү</translation>
 <translation id="6324977638108296054">Бөлүнүп көрсөтүлгөн нерсеге шилтеме түзүлгөн жок</translation>
 <translation id="6333140779060797560"><ph name="APPLICATION" /> аркылуу бөлүшүү</translation>
+<translation id="6335454563754888572"><ph name="PAGE_URL" /> сайтындагы беттин URL дарегин түзөтүңүз</translation>
 <translation id="6337234675334993532">Шифрлөө</translation>
 <translation id="6340526405444716530">Жекечелештирүү</translation>
 <translation id="6341580099087024258">Файлдарды кайсы папкага сактоо керек экени суралсын</translation>
@@ -1193,6 +1199,7 @@
 <translation id="6486420406192123355">Бул PDF файлы корголбогон байланышты колдонгон сайттан алынды</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{Файл жүктөлүп алынды}other{# файл жүктөлүп алынды}}</translation>
 <translation id="6508722015517270189">Chrome’ду өчүрүп-күйгүзүңүз</translation>
+<translation id="6513924416597632811"><ph name="SEARCH_QUERY" /> боюнча табылган нерселердин бетине шилтемени көчүрүңүз. Булагы: <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">Текшерүү</translation>
 <translation id="6527303717912515753">Бөлүшүү</translation>
 <translation id="652948702951888897">Chrome таржымалы</translation>
@@ -1604,6 +1611,7 @@
 <translation id="8221401890884589479">Каалаган сайтты бөгөттөй аласыз. Chrome тизмеге 30 күн мурун кошулган сайттарды автоматтык түрдө жок кылып турат. <ph name="BEGIN_LINK" />Кеңири маалымат<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">Серептөө дайындары өчүрүлүүдө</translation>
 <translation id="8223642481677794647">Түрмөктөгү меню</translation>
+<translation id="82296173028782770">Изделген суроону түзөтүү: <ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">Эми экранды оңго сүрүп, буга чейин караган беттерге кайтып, ал эми солго сүрүп, алдыга өтө аласыз</translation>
 <translation id="8236097722223016103">Кыстармаларга кошуу</translation>
 <translation id="8243077599929149377">Колдонуучу атыңызды кошуңуз</translation>
@@ -1752,6 +1760,7 @@
 <translation id="8890668505403261809">Жашыруун өтмөктөрдөн издеңиз</translation>
 <translation id="8898822736010347272">Сиз баш баккан айрым барактардын URL даректерин, чектелген тутум маалыматын жана айрым барактардын мазмунун бардык колдонуучулар үчүн мүмкүн болгон коркунучтарды аныктап, бөгөттөө үчүн Google'га жөнөтөт.</translation>
 <translation id="8909135823018751308">Бөлүшүү…</translation>
+<translation id="8918299437379122615"><ph name="SEARCH_QUERY" /> боюнча табылган нерселердин бетине шилтемени бөлүшүңүз. Булагы: <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">"Дагы параметрлер" баскычын басып, оффлайн режиминде иштөө үчүн барактарды жүктөп алуу</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Кеңири маалымат<ph name="END_LINK" /></translation>
 <translation id="892496902842311796">Тил (<ph name="LANG" />) жүктөлүп алынды</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
index 59932e7..7265c5d7 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -455,6 +455,7 @@
 <translation id="3072980200212375806"><ph name="APP_NAME" /> ຈະເປີດໃນ Chrome. ໂດຍການສືບຕໍ່, ແມ່ນຖືວ່າທ່ານຍອມຮັບ <ph name="BEGIN_LINK1" />ຂໍ້ກຳນົດບໍລິການ Google<ph name="END_LINK1" /> ແລະ <ph name="BEGIN_LINK2" />ຂໍ້ກຳນົດບໍລິການເພີ່ມເຕີມ Google Chrome ແລະ ChromeOS<ph name="END_LINK2" />. ຈະນຳໃຊ້ <ph name="BEGIN_LINK3" />ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວ<ph name="END_LINK3" /> ນຳ.</translation>
 <translation id="3080525922482950719">ທ່ານສາມາດບັນທຶກໜ້າຕ່າງໆໄວ້ອ່ານໃນພາຍຫຼັງ ຫຼື ແບບອອບລາຍໄດ້</translation>
 <translation id="3087734570205094154">ດ້ານລຸ່ມ</translation>
+<translation id="3088687687599869821">ການນຳທາງໜ້າເວັບ</translation>
 <translation id="3091010850649238832">ສະແດງເນື້ອຫາຄລິບບອດ</translation>
 <translation id="3098745985164956033">ລະບົບຈະສົ່ງບາງຮູບໃຫ້ Google ເພື່ອປັບປຸງຄຳອະທິບາຍສຳລັບທ່ານ.</translation>
 <translation id="3114507951000454849">ອ່ານຂ່າວຂອງມື້ນີ້ <ph name="NEWS_ICON" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
index d2a78bf..438cd74 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">Sutaupykite iki 60 proc. duomenų, skaitykite šiandienos naujienas</translation>
 <translation id="1303339473099049190">Nepavyko rasti šio slaptažodžio. Patikrinkite rašybą ir bandykite dar kartą.</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> – išsiųsta iš „<ph name="DEVICE_NAME" />“</translation>
+<translation id="1318262688555255786">Bendrinti nuorodą į tinklalapį „<ph name="PAGE_TITLE" />“. Šaltinis: <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">Žymių išsaugojimo srautas atidarytas per visą ekrano aukštį</translation>
 <translation id="1327257854815634930">Naršymo istorija atidaryta</translation>
 <translation id="1331212799747679585">Nepavyksta atnaujinti „Chrome“. Daugiau parinkčių.</translation>
@@ -515,6 +516,7 @@
 <translation id="3435465986463792564">Atidaryta daug langų? Galite tvarkyti juos čia</translation>
 <translation id="3435575784518354875">Jei norite išsaugoti prieigą prie slaptažodžių, juos eksportuokite dabar, atnaujinkite „Google Play“ paslaugas ir tada importuokite juos atgal į „Google“ slaptažodžių tvarkyklę. <ph name="BEGIN_LINK" />Žr. išsamias instrukcijas<ph name="END_LINK" />.</translation>
 <translation id="3435738964857648380">Sauga</translation>
+<translation id="3435914367318771664">Pridėti skirtuką prie naujos grupės</translation>
 <translation id="3439276997620616816">Čia rasite naujausius skirtukus</translation>
 <translation id="3443221991560634068">Iš naujo įkelti dabartinį puslapį</translation>
 <translation id="3444179773590444986">Bendrinti atsiliepimą apie tamsiąją temą, skirtą svetainėms?</translation>
@@ -781,6 +783,7 @@
 <translation id="4684427112815847243">Viską sinchronizuoti</translation>
 <translation id="4685741273709472646">Pasirinkite iš išskleidžiamojo meniu sąrašo</translation>
 <translation id="4687718960473379118">Svetainių siūlomi skelbimai</translation>
+<translation id="468924408576231679">Kopijuoti nuorodą į puslapį „<ph name="PAGE_TITLE" />“. Šaltinis: <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">Geresnis turinys</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 ir dar <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}one{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 ir dar <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}few{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 ir dar <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}many{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 ir dar <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 ir dar <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}}</translation>
 <translation id="4698061626562952596">Čia peržiūrėkite neaktyvius skirtukus</translation>
@@ -1123,6 +1126,7 @@
 <translation id="6205314730813004066">Su skelbimais susijęs privatumas</translation>
 <translation id="6210748933810148297">Ne <ph name="EMAIL" />?</translation>
 <translation id="6211386937064921208">Peržiūrimas šis puslapis</translation>
+<translation id="6212567362666004597">Pridėti skirtuką prie grupės</translation>
 <translation id="6221633008163990886">Atrakinkite, kad galėtumėte eksportuoti slaptažodžius</translation>
 <translation id="6225572914528673855">Adreso juosta</translation>
 <translation id="6232535412751077445">Įgalinus funkciją „Nestebėti“, užklausa bus įtraukta į naršymo srautą. Poveikis priklauso nuo to, ar svetainė atsako į užklausą ir kaip užklausa interpretuojama.
@@ -1150,6 +1154,7 @@
 <translation id="6324916366299863871">Redaguoti spartųjį klavišą</translation>
 <translation id="6324977638108296054">Nepavyko sukurti nuorodos į paryškintą tekstą</translation>
 <translation id="6333140779060797560">Bendrinti per „<ph name="APPLICATION" />“</translation>
+<translation id="6335454563754888572">Redaguoti URL, nukreipiantį į puslapį: <ph name="PAGE_URL" /></translation>
 <translation id="6337234675334993532">Šifruotė</translation>
 <translation id="6340526405444716530">Suasmeninimas</translation>
 <translation id="6341580099087024258">Klausti, kur saugoti failus</translation>
@@ -1193,6 +1198,7 @@
 <translation id="6486420406192123355">Šis PDF failas yra iš svetainės, kurioje naudojamas nesaugus ryšys</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{Failas atsisiųstas}one{Baigtas # atsisiuntimas}few{Baigti # atsisiuntimai}many{Baigta # atsisiuntimo}other{Baigta # atsisiuntimų}}</translation>
 <translation id="6508722015517270189">Iš naujo paleiskite „Chrome“</translation>
+<translation id="6513924416597632811">Kopijuoti nuorodą į paieškos rezultatų puslapį pagal užklausą: „<ph name="SEARCH_QUERY" />“. Šaltinis: <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">Patvirtinti</translation>
 <translation id="6527303717912515753">Bendrinti</translation>
 <translation id="652948702951888897">„Chrome“ istorija</translation>
@@ -1604,6 +1610,7 @@
 <translation id="8221401890884589479">Galite užblokuoti nepageidaujamas svetaines. „Chrome“ taip pat iš sąrašo automatiškai ištrina senesnes nei trisdešimt dienų svetaines. <ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">Naršymo duomenų ištrynimas</translation>
 <translation id="8223642481677794647">Sklaidos kanalo kortelės meniu</translation>
+<translation id="82296173028782770">Redaguoti paieškos užklausą: „<ph name="SEARCH_QUERY" />“</translation>
 <translation id="8236063039629122676">Dabar perbraukę dešinėn galite grįžti atgal, kad peržiūrėtumėte ankstesnius puslapius, kuriuose lankėtės, o perbraukę kairėn – pirmyn</translation>
 <translation id="8236097722223016103">Pridėti prie žymių</translation>
 <translation id="8243077599929149377">Naudotojo vardo pridėjimas</translation>
@@ -1752,6 +1759,7 @@
 <translation id="8890668505403261809">Ieškokite inkognito skirtukuose</translation>
 <translation id="8898822736010347272">„Google“ siunčiami kai kurių lankomų puslapių URL, ribota sistemos informacija ir kai kurių puslapių turinys, kad būtų galima aptikti naujas grėsmes ir apsaugoti visus žiniatinklio naudotojus.</translation>
 <translation id="8909135823018751308">Bendrinti…</translation>
+<translation id="8918299437379122615">Bendrinti nuorodą į paieškos rezultatų puslapį pagal užklausą: „<ph name="SEARCH_QUERY" />“. Šaltinis: <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">Atsisiųskite puslapius spustelėję mygtuką „Daugiau parinkčių“, kad galėtumėte naudoti juos neprisijungę</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation>
 <translation id="892496902842311796"><ph name="LANG" /> paruošta naudoti</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
index 5f748243..5116caa 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
@@ -455,6 +455,7 @@
 <translation id="3072980200212375806">Lietotne <ph name="APP_NAME" /> tiks atvērta pārlūkā Chrome. Turpinot jūs piekrītat <ph name="BEGIN_LINK1" />Google pakalpojumu sniegšanas noteikumiem<ph name="END_LINK1" />, kā arī <ph name="BEGIN_LINK2" />Google Chrome un Chrome OS pakalpojumu sniegšanas papildu noteikumiem<ph name="END_LINK2" />. Ir spēkā arī <ph name="BEGIN_LINK3" />konfidencialitātes politika<ph name="END_LINK3" />.</translation>
 <translation id="3080525922482950719">Varat saglabāt lapas lasīšanai vēlāk vai bezsaistē.</translation>
 <translation id="3087734570205094154">Apakšā</translation>
+<translation id="3088687687599869821">NAVIGĀCIJA LAPĀS</translation>
 <translation id="3091010850649238832">Rādīt starpliktuves saturu</translation>
 <translation id="3098745985164956033">Daži attēli tiek sūtīti uz Google serveriem, lai uzlabotu aprakstus</translation>
 <translation id="3114507951000454849">Lasiet šodienas ziņas <ph name="NEWS_ICON" /></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 1bbf909..1b77c92 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
@@ -476,6 +476,7 @@
 <translation id="3208584281581115441">ယခု စစ်ကြည့်ရန်</translation>
 <translation id="3211426585530211793"><ph name="ITEM_TITLE" /> ကို ဖျက်လိုက်ပါပြီ</translation>
 <translation id="3220943972464248773">သင့်စကားဝှက်များကို စင့်ခ်လုပ်ရန် သင်ဖြစ်ကြောင်း အတည်ပြုပါ</translation>
+<translation id="323213525320714789">ဆော့ဖ်ဝဲရေးသူ</translation>
 <translation id="3232293466644486101">ဖွင့်ကြည့်ထားသည့်မှတ်တမ်းဒေတာကို ဖျက်ရန်…</translation>
 <translation id="3232754137068452469">ဝဘ် အက်ပ်</translation>
 <translation id="3236059992281584593">၁ မိနစ် ကျန်သည်</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
index ca09f5a..ab8ef3b 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -455,6 +455,7 @@
 <translation id="3072980200212375806"><ph name="APP_NAME" /> Chrome मा खुल्ने छ। तपाईंले जारी राख्नुभयो भने तपाईं <ph name="BEGIN_LINK1" />Google का सेवाका सर्त<ph name="END_LINK1" /> र <ph name="BEGIN_LINK2" />Google Chrome तथा ChromeOS का सेवाका अतिरिक्त सर्तहरू<ph name="END_LINK2" />मा सहमति जनाउनुहुन्छ भन्ने अर्थ लाग्छ। यसका साथै, <ph name="BEGIN_LINK3" />गोपनीयता नीति<ph name="END_LINK3" /> पनि लागू हुन्छ।</translation>
 <translation id="3080525922482950719">तपाईं पृष्ठहरू सुरक्षित गरी ती पृष्ठ पछि वा इन्टरनेट नभएका बेलामा पढ्न सक्नुहुन्छ</translation>
 <translation id="3087734570205094154">तल</translation>
+<translation id="3088687687599869821">पेज नेभिगेसन</translation>
 <translation id="3091010850649238832">क्लिपबोर्डमा भएका सामग्री देखाउनुहोस्</translation>
 <translation id="3098745985164956033">तपाईंलाई उपलब्ध गराइने वर्णनको गुणस्तर सुधार गर्न केही फोटोहरू Google मा पठाइन्छन्</translation>
 <translation id="3114507951000454849">आजको समाचार पढ्नुहोस् <ph name="NEWS_ICON" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
index 2547412..5bed92f8 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -455,6 +455,7 @@
 <translation id="3072980200212375806"><ph name="APP_NAME" /> wordt geopend in Chrome. Als je doorgaat, ga je akkoord met de <ph name="BEGIN_LINK1" />Servicevoorwaarden van Google<ph name="END_LINK1" /> en met de <ph name="BEGIN_LINK2" />Aanvullende servicevoorwaarden van Google Chrome en Chrome OS<ph name="END_LINK2" />. Het <ph name="BEGIN_LINK3" />Privacybeleid<ph name="END_LINK3" /> is ook van toepassing.</translation>
 <translation id="3080525922482950719">Je kunt pagina's opslaan en later of offline lezen</translation>
 <translation id="3087734570205094154">Onderaan</translation>
+<translation id="3088687687599869821">PAGINANAVIGATIE</translation>
 <translation id="3091010850649238832">Content op het klembord bekijken</translation>
 <translation id="3098745985164956033">Sommige afbeeldingen worden naar Google gestuurd om de beschrijvingen voor je te verbeteren</translation>
 <translation id="3114507951000454849">Lees het nieuws van vandaag <ph name="NEWS_ICON" /></translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
index 90fb2a1..b06ec16 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">60% ପର୍ଯ୍ୟନ୍ତ ଡାଟା ସେଭ୍ କରି, ଆଜିର ସମାଚାର ପଢ଼ନ୍ତୁ</translation>
 <translation id="1303339473099049190">ସେହି ପାସୱାର୍ଡ ମିଳୁନାହିଁ। ଆପଣଙ୍କର ବନାନ ଯାଞ୍ଚ କରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
 <translation id="1303507811548703290"><ph name="DEVICE_NAME" />ରୁ <ph name="DOMAIN" /> - ପଠାଯାଇଛି</translation>
+<translation id="1318262688555255786"><ph name="PAGE_TITLE" /> ୱେବପୃଷ୍ଠାରେ ଲିଙ୍କକୁ ସେୟାର କରନ୍ତୁ। ସୋର୍ସ: <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">ବୁକମାର୍କ ସେଭ ଫ୍ଲୋ ଫୋଲ୍ଡରଗୁଡ଼ିକ ସମ୍ପୂର୍ଣ୍ଣ ଭାବେ ଖୋଲାଯାଇଛି</translation>
 <translation id="1327257854815634930">ନାଭିଗେସନ୍ ଇତିହାସ ଖୋଲା ଅଛି</translation>
 <translation id="1331212799747679585">Chrome ଅପ୍‌ଡେଟ୍ ହୋଇପାରିବ ନାହିଁ। ଅଧିକ ବିକଳ୍ପ</translation>
@@ -455,6 +456,7 @@
 <translation id="3072980200212375806"><ph name="APP_NAME" /> Chromeରେ ଖୋଲିବ। ଜାରି ରଖି, ଆପଣ <ph name="BEGIN_LINK1" />Google ସେବାର ସର୍ତ୍ତାବଳୀ<ph name="END_LINK1" /> ଏବଂ <ph name="BEGIN_LINK2" />Google Chrome ଏବଂ ChromeOSର ଅତିରିକ୍ତ ସେବାର ସର୍ତ୍ତାବଳୀ<ph name="END_LINK2" />ରେ ସମ୍ମତ ହୁଅନ୍ତି। <ph name="BEGIN_LINK3" />ଗୋପନୀୟତା ନୀତି<ph name="END_LINK3" /> ମଧ୍ୟ ଲାଗୁ ହୁଏ।</translation>
 <translation id="3080525922482950719">ଆପଣ ପରେ କିମ୍ବା ଅଫଲାଇନରେ ପଢ଼ିବା ପାଇଁ ପୃଷ୍ଠାଗୁଡ଼ିକୁ ସେଭ୍ କରନ୍ତୁ</translation>
 <translation id="3087734570205094154">ନିମ୍ନଭାଗ</translation>
+<translation id="3088687687599869821">ପୃଷ୍ଠା ନାଭିଗେସନ</translation>
 <translation id="3091010850649238832">କ୍ଲିପବୋର୍ଡର ବିଷୟବସ୍ତୁଗୁଡ଼ିକୁ ଦେଖାନ୍ତୁ</translation>
 <translation id="3098745985164956033">ଆପଣଙ୍କ ପାଇଁ ବର୍ଣ୍ଣନାକୁ ଉନ୍ନତ କରିବା ନିମନ୍ତେ କିଛି ଛବି Googleକୁ ପଠାଯାଇଛି</translation>
 <translation id="3114507951000454849">ଆଜିର ସମାଚାର ପଢ଼ନ୍ତୁ <ph name="NEWS_ICON" /></translation>
@@ -515,6 +517,7 @@
 <translation id="3435465986463792564">ଅନେକ ୱିଣ୍ଡୋ ଖୋଲା ଅଛି କି? ଆପଣ ସେଗୁଡ଼ିକୁ ଏଠାରୁ ପରିଚାଳନା କରିପାରିବେ</translation>
 <translation id="3435575784518354875">ଆପଣଙ୍କ ପାସୱାର୍ଡଗୁଡ଼ିକୁ ଆକ୍ସେସ ଜାରି ରଖିବାକୁ, ସେଗୁଡ଼ିକୁ ଏବେ ଏକ୍ସପୋର୍ଟ କରନ୍ତୁ, Google Play ସେବାଗୁଡ଼ିକୁ ଅପଡେଟ କରନ୍ତୁ ଏବଂ ତା’ପରେ ସେଗୁଡ଼ିକୁ ପୁଣି Google Password Managerକୁ ଇମ୍ପୋର୍ଟ କରନ୍ତୁ। <ph name="BEGIN_LINK" />ସମ୍ପୂର୍ଣ୍ଣ ନିର୍ଦ୍ଦେଶାବଳୀ ଦେଖନ୍ତୁ<ph name="END_LINK" />।</translation>
 <translation id="3435738964857648380">ସୁରକ୍ଷା</translation>
+<translation id="3435914367318771664">ନୂଆ ଗୋଷ୍ଠୀରେ ଟାବ ଯୋଗ କରନ୍ତୁ</translation>
 <translation id="3439276997620616816">ଆପଣ ଏଠାରେ ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ଟାବଗୁଡ଼ିକ ପାଇବେ</translation>
 <translation id="3443221991560634068">ବର୍ତ୍ତମାନର ପୃଷ୍ଠାକୁ ରିଲୋଡ୍ କରନ୍ତୁ</translation>
 <translation id="3444179773590444986">ସାଇଟଗୁଡ଼ିକ ପାଇଁ ଗାଢ଼ା ଥିମ ବିଷୟରେ ମତାମତ ସେୟାର କରିବେ?</translation>
@@ -780,6 +783,7 @@
 <translation id="4684427112815847243">ସବୁକିଛି ସିଙ୍କ୍‌ କରନ୍ତୁ</translation>
 <translation id="4685741273709472646">ଡ୍ରପଡାଉନ ତାଲିକାରୁ ଚୟନ କରନ୍ତୁ</translation>
 <translation id="4687718960473379118">ସାଇଟ ଦ୍ୱାରା-ପରାମର୍ଶ ଦିଆଯାଇଥିବା ବିଜ୍ଞାପନଗୁଡ଼ିକ</translation>
+<translation id="468924408576231679"><ph name="PAGE_TITLE" /> ୱେବପୃଷ୍ଠାକୁ ଲିଙ୍କ କପି କରନ୍ତୁ। ସୋର୍ସ: <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">ଆହୁରି ଭଲ ବିଷୟବସ୍ତୁ ପାଆନ୍ତୁ</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 ଏବଂ <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> ଅଧିକ}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 ଏବଂ <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> ଅଧିକ}}</translation>
 <translation id="4698061626562952596">ଆପଣଙ୍କ ନିଷ୍ଟ୍ରିୟ ଟାବଗୁଡ଼ିକୁ ଏଠାରେ ସମୀକ୍ଷା କରନ୍ତୁ</translation>
@@ -1122,6 +1126,7 @@
 <translation id="6205314730813004066">ବିଜ୍ଞାପନ ଗୋପନୀୟତା</translation>
 <translation id="6210748933810148297"><ph name="EMAIL" /> ନୁହେଁ?</translation>
 <translation id="6211386937064921208">ଏହି ପୃଷ୍ଠା ପ୍ରିଭ୍ୟୁ କରାଯାଉଛି</translation>
+<translation id="6212567362666004597">ଗୋଷ୍ଠୀରେ ଟାବ ଯୋଗ କରନ୍ତୁ</translation>
 <translation id="6221633008163990886">ଆପଣଙ୍କର ପାସ୍‍ୱର୍ଡଗୁଡ଼ିକ ଏକ୍ସପୋର୍ଟ କରିବାକୁ ଅନ୍‌ଲକ୍ କରନ୍ତୁ</translation>
 <translation id="6225572914528673855">ଠିକଣା ବାର</translation>
 <translation id="6232535412751077445">’ଟ୍ରାକ୍ କରନ୍ତୁ ନାହିଁ’ ସକ୍ଷମ କରିବାର ଅର୍ଥ ହେଉଛି, ଆପଣଙ୍କର ବ୍ରାଉଜିଂ ଟ୍ରାଫିକ୍ ସହିତ ଏକ ଅନୁରୋଧ ଅନ୍ତର୍ଭୁକ୍ତ କରାଯିବ। କୌଣସି ପ୍ରଭାବ ଏହା ଉପରେ ନିର୍ଭର କରେ ଯେ, କୌଣସି ୱେବ୍‍ସାଇଟ୍ ଅନୁରୋଧର ପ୍ରତିକ୍ରିୟା କରେ କି ନାହିଁ ଏବଂ ଅନୁରୋଧକୁ କିପରି ଭାବରେ ବ୍ୟାଖ୍ୟା କରାଯାଉଛି।
@@ -1149,6 +1154,7 @@
 <translation id="6324916366299863871">ସର୍ଟକଟ୍‌କୁ ଏଡିଟ୍ କରନ୍ତୁ</translation>
 <translation id="6324977638108296054">ହାଇଲାଇଟ୍ କରାଯାଇଥିବା ଟେକ୍ସଟର ଲିଙ୍କକୁ ତିଆରି କରାଯାଇପାରିବ ନାହିଁ</translation>
 <translation id="6333140779060797560"><ph name="APPLICATION" /> ମାଧ୍ୟମରେ ସେୟାର୍ କରନ୍ତୁ</translation>
+<translation id="6335454563754888572">ଏଥିରେ ପୃଷ୍ଠାକୁ ପଏଣ୍ଟ କରାଯାଥିବା URL ଏଡିଟ କରନ୍ତୁ: <ph name="PAGE_URL" /></translation>
 <translation id="6337234675334993532">ଏନକ୍ରିପ୍ସନ୍</translation>
 <translation id="6340526405444716530">ପର୍ସନାଲାଇଜେସନ</translation>
 <translation id="6341580099087024258">କେଉଁଠି ଫାଇଲ୍‍ଗୁଡ଼ିକୁ ସେଭ୍ କରିବେ, ପଚାରନ୍ତୁ</translation>
@@ -1192,6 +1198,7 @@
 <translation id="6486420406192123355">ଏହି PDF ଫାଇଲଟି ଏକ ଅସୁରକ୍ଷିତ କନେକ୍ସନ ବ୍ୟବହାର କରୁଥିବା ଗୋଟିଏ ସାଇଟରୁ ଆସିଛି</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{ଫାଇଲ୍ ଡାଉନଲୋଡ୍ କରାଯାଇଛି}other{#ଟି ଡାଉନଲୋଡ୍ ସମୂର୍ଣ୍ଣ ହୋଇଛି}}</translation>
 <translation id="6508722015517270189">Chrome ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ</translation>
+<translation id="6513924416597632811">ଏହା ପାଇଁ ସର୍ଚ୍ଚ ଫଳାଫଳ ପୃଷ୍ଠାକୁ ଲିଙ୍କ କପି କରନ୍ତୁ: <ph name="SEARCH_QUERY" />। ସୋର୍ସ: <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">ଯାଞ୍ଚ କରନ୍ତୁ</translation>
 <translation id="6527303717912515753">ସେୟାର୍ କରନ୍ତୁ</translation>
 <translation id="652948702951888897">Chrome ଇତିବୃତ୍ତି</translation>
@@ -1603,6 +1610,7 @@
 <translation id="8221401890884589479">ଆପଣ ଚାହୁଁନଥିବା ସାଇଟଗୁଡ଼ିକୁ ଆପଣ ବ୍ଲକ କରିପାରିବେ। Chrome 30 ଦିନରୁ ଅଧିକ ପୁରୁଣା ସାଇଟଗୁଡ଼ିକୁ ମଧ୍ୟ ତାଲିକାରୁ ସ୍ୱତଃ-ଡିଲିଟ କରେ। <ph name="BEGIN_LINK" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">ବ୍ରାଉଜିଂ ଡାଟାକୁ ଡିଲିଟ କରାଯାଉଛି</translation>
 <translation id="8223642481677794647">ଫିଡ୍ କାର୍ଡ ମେନୁ</translation>
+<translation id="82296173028782770">ସର୍ଚ୍ଚ କ୍ୱେରୀ ଏଡିଟ କରନ୍ତୁ: <ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">ବର୍ତ୍ତମାନ, ଡାହାଣପଟକୁ ଏକ ସ୍ୱାଇପ ଆପଣ ଭିଜିଟ କରିଥିବା ପୂର୍ବ ପୃଷ୍ଠାଗୁଡ଼ିକୁ ଦେଖିବା ପାଇଁ ଆପଣଙ୍କୁ ପଛକୁ ନେଇଯାଏ ଏବଂ ବାମପଟକୁ ଏକ ସ୍ୱାଇପ ଆପଣଙ୍କୁ ଆଗକୁ ମୁଭ କରାଇଥାଏ</translation>
 <translation id="8236097722223016103">ବୁକମାର୍କଗୁଡ଼ିକରେ ଯୋଗ କରନ୍ତୁ</translation>
 <translation id="8243077599929149377">ଆପଣଙ୍କ ୟୁଜରନେମ ଯୋଗ କରନ୍ତୁ</translation>
@@ -1751,6 +1759,7 @@
 <translation id="8890668505403261809">ଆପଣଙ୍କ ଇନକଗ୍ନିଟୋ ଟାବଗୁଡ଼ିକୁ ସର୍ଚ୍ଚ କରନ୍ତୁ</translation>
 <translation id="8898822736010347272">ନୂଆ ବିପଦଗୁଡ଼ିକୁ ଖୋଜି ପାଇବାରେ ଏବଂ ୱେବରେ ସମସ୍ତଙ୍କୁ ସୁରକ୍ଷା ଦେବାରେ ସାହାଯ୍ୟ କରିବାକୁ, ଆପଣ ଭିଜିଟ୍ କରୁଥିବା କିଛି ୱେବପୃଷ୍ଠାର URLଗୁଡ଼ିକ, ସୀମିତ ସିଷ୍ଟମ୍ ସୂଚନା ଏବଂ କିଛି ୱେବପୃଷ୍ଠାର ବିଷୟବସ୍ତୁ Googleକୁ ପଠାଏ।</translation>
 <translation id="8909135823018751308">ସେୟାର୍ କରନ୍ତୁ…</translation>
+<translation id="8918299437379122615">ଏହା ପାଇଁ ସର୍ଚ୍ଚ ଫଳାଫଳ ପୃଷ୍ଠାରେ ଲିଙ୍କ ସେୟାର କରନ୍ତୁ: <ph name="SEARCH_QUERY" />। ସୋର୍ସ: <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">ସେଗୁଡ଼ିକୁ ଅଫ୍‌ଲାଇନ୍‌ରେ ବ୍ୟବହାର କରିବାକୁ ’ଅଧିକ ବିକଳ୍ପଗୁଡ଼ିକ’ ବଟନ୍‌ରୁ ପୃଷ୍ଠାଗୁଡ଼ିକ ଡାଉନ୍‌ଲୋଡ୍‌ କରନ୍ତୁ</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK" /></translation>
 <translation id="892496902842311796"><ph name="LANG" /> ପ୍ରସ୍ତୁତ ଅଛି</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
index 7c36f71..024a8b9 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -475,6 +475,7 @@
 <translation id="3208584281581115441">ਹੁਣ ਜਾਂਚ ਕਰੋ</translation>
 <translation id="3211426585530211793"><ph name="ITEM_TITLE" /> ਨੂੰ ਮਿਟਾਇਆ ਗਿਆ</translation>
 <translation id="3220943972464248773">ਆਪਣੇ ਪਾਸਵਰਡਾਂ ਦਾ ਸਿੰਕ ਕਰਨ ਲਈ, ਆਪਣੀ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ</translation>
+<translation id="323213525320714789">ਵਿਕਾਸਕਾਰ</translation>
 <translation id="3232293466644486101">ਬ੍ਰਾਊਜ਼ਿੰਗ ਡਾਟਾ ਮਿਟਾਓ…</translation>
 <translation id="3232754137068452469">ਵੈੱਬ ਐਪ</translation>
 <translation id="3236059992281584593">1 ਮਿੰਟ ਬਾਕੀ</translation>
@@ -612,6 +613,7 @@
 <translation id="3856096718352044181">ਕਿਰਪਾ ਕਰਕੇ ਪੁਸ਼ਟੀ ਕਰੋ ਕਿ ਇਹ ਇੱਕ ਵੈਧ ਪ੍ਰਦਾਨਕ ਹੈ ਜਾਂ ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ</translation>
 <translation id="3858860766373142691">ਨਾਮ</translation>
 <translation id="3863527519275151528">ਪ੍ਰਕਿਰਿਆ-ਅਧੀਨ ਸੂਚਨਾ</translation>
+<translation id="3866863539038222107">ਜਾਂਚ ਕਰੋ</translation>
 <translation id="3870908470613821006">ਹਰ ਕੋਈ “<ph name="GROUP_NAME" />” ਟੈਬ ਗਰੁੱਪ ਤੱਕ ਤੁਰੰਤ ਪਹੁੰਚ ਗੁਆ ਦੇਵੇਗਾ ਅਤੇ ਇਸ ਨੂੰ ਸਾਰੇ ਡੀਵਾਈਸਾਂ ਤੋਂ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ</translation>
 <translation id="3873174561423636563">ਜਾਰੀ ਰੱਖਣ ਲਈ, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ਤੁਹਾਡੇ <ph name="FIELDS_STRING" /> ਨੂੰ ਇਸ ਸਾਈਟ ਨਾਲ ਸਾਂਝਾ ਕਰੇਗਾ। ਇਸ ਸਾਈਟ ਦੇ <ph name="BEGIN_LINK1" />ਸੇਵਾ ਦੇ ਨਿਯਮ<ph name="END_LINK1" /> ਦੇਖੋ।</translation>
 <translation id="3892148308691398805">ਲਿਖਤ ਕਾਪੀ ਕਰੋ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
index f1d25c2..d2616b8 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">Economisește până la 60 % din date, citește știrile de azi</translation>
 <translation id="1303339473099049190">Parola nu a fost găsită. Verifică dacă ai scris-o corect și încearcă din nou.</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> – Trimis de la <ph name="DEVICE_NAME" /></translation>
+<translation id="1318262688555255786">Trimite linkul spre pagina web <ph name="PAGE_TITLE" />. Sursă: <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">Fluxul de salvare a marcajului în folder deschis la înălțimea completă</translation>
 <translation id="1327257854815634930">Istoricul de navigare este deschis</translation>
 <translation id="1331212799747679585">Chrome nu se poate actualiza. Mai multe opțiuni</translation>
@@ -455,6 +456,7 @@
 <translation id="3072980200212375806"><ph name="APP_NAME" /> se va deschide în Chrome. Dacă alegi să continui, ești de acord cu <ph name="BEGIN_LINK1" />Termenii și condițiile Google<ph name="END_LINK1" /> și cu <ph name="BEGIN_LINK2" />Termenii și condițiile suplimentare pentru Google Chrome și ChromeOS<ph name="END_LINK2" />. Se aplică și <ph name="BEGIN_LINK3" />Politica de confidențialitate<ph name="END_LINK3" />.</translation>
 <translation id="3080525922482950719">Poți să salvezi pagini ca să le citești offline sau mai târziu</translation>
 <translation id="3087734570205094154">Jos</translation>
+<translation id="3088687687599869821">NAVIGARE ÎN PAGINI</translation>
 <translation id="3091010850649238832">Afișează conținutul clipboardului</translation>
 <translation id="3098745985164956033">Unele imagini sunt trimise la Google pentru îmbunătățirea descrierilor</translation>
 <translation id="3114507951000454849">Citește știrile de azi <ph name="NEWS_ICON" /></translation>
@@ -515,6 +517,7 @@
 <translation id="3435465986463792564">Ai deschis multe ferestre? Gestionează-le de aici</translation>
 <translation id="3435575784518354875">Pentru a păstra accesul la parole, exportă-le acum, actualizează serviciile Google Play și apoi importă-le înapoi în Managerul de parole Google. <ph name="BEGIN_LINK" />Consultă instrucțiunile complete<ph name="END_LINK" />.</translation>
 <translation id="3435738964857648380">Securitate</translation>
+<translation id="3435914367318771664">Adaugă fila într-un grup nou</translation>
 <translation id="3439276997620616816">Aici vei vedea filele recente</translation>
 <translation id="3443221991560634068">Reîncarcă pagina curentă</translation>
 <translation id="3444179773590444986">Trimiți feedback despre tema întunecată pentru site-uri?</translation>
@@ -781,6 +784,7 @@
 <translation id="4684427112815847243">Sincronizează tot</translation>
 <translation id="4685741273709472646">Selectează din lista drop-down</translation>
 <translation id="4687718960473379118">Anunțurile sugerate de site-uri</translation>
+<translation id="468924408576231679">Copiază linkul spre pagina web <ph name="PAGE_TITLE" />. Sursă: <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">Primește conținut mai util</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 și încă <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}few{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 și încă <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 și încă <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}}</translation>
 <translation id="4698061626562952596">Analizează filele inactive aici</translation>
@@ -1123,6 +1127,7 @@
 <translation id="6205314730813004066">Confidențialitatea anunțurilor</translation>
 <translation id="6210748933810148297">Nu ești <ph name="EMAIL" />?</translation>
 <translation id="6211386937064921208">Previzualizare a paginii</translation>
+<translation id="6212567362666004597">Adaugă fila într-un grup</translation>
 <translation id="6221633008163990886">Deblochează pentru a-ți exporta parolele.</translation>
 <translation id="6225572914528673855">Bară de adrese</translation>
 <translation id="6232535412751077445">Dacă activezi opțiunea „Nu urmări”, o solicitare va fi inclusă împreună cu traficul de navigare. Efectul variază în funcție de răspunsul site-ului la solicitare și în funcție de modul în care este interpretată solicitarea.
@@ -1150,6 +1155,7 @@
 <translation id="6324916366299863871">Editează o comandă rapidă</translation>
 <translation id="6324977638108296054">Nu se poate crea linkul spre evidențiere</translation>
 <translation id="6333140779060797560">Trimite prin <ph name="APPLICATION" /></translation>
+<translation id="6335454563754888572">Editează adresa URL care trimite spre pagină de la: <ph name="PAGE_URL" /></translation>
 <translation id="6337234675334993532">Criptare</translation>
 <translation id="6340526405444716530">Personalizare</translation>
 <translation id="6341580099087024258">Întreabă unde să fie salvate fișierele</translation>
@@ -1193,6 +1199,7 @@
 <translation id="6486420406192123355">Acest fișier PDF provine de la un site care folosește o conexiune nesecurizată</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{Fișierul a fost descărcat}few{# descărcări finalizate}other{# de descărcări finalizate}}</translation>
 <translation id="6508722015517270189">repornește Chrome;</translation>
+<translation id="6513924416597632811">Copiază linkul spre pagina cu rezultatele căutării pentru: <ph name="SEARCH_QUERY" />. Sursă: <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">Confirmați</translation>
 <translation id="6527303717912515753">Trimite</translation>
 <translation id="652948702951888897">Istoricul Chrome</translation>
@@ -1604,6 +1611,7 @@
 <translation id="8221401890884589479">Poți să blochezi site-urile pe care nu le dorești. În plus, Chrome șterge automat site-urile din listă mai vechi de 30 de zile. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">Se șterg datele de navigare</translation>
 <translation id="8223642481677794647">Meniul cardului din feed</translation>
+<translation id="82296173028782770">Editează termenul de căutare: <ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">Acum, o glisare spre dreapta te duce înapoi pentru a vedea paginile anterioare pe care le-ai accesat, iar cu o glisare spre stânga te deplasezi înainte</translation>
 <translation id="8236097722223016103">Adaugă la marcaje</translation>
 <translation id="8243077599929149377">Adaugă-ți numele de utilizator</translation>
@@ -1752,6 +1760,7 @@
 <translation id="8890668505403261809">Caută în filele incognito</translation>
 <translation id="8898822736010347272">Trimite la Google adrese URL ale unor pagini pe care le accesezi, informații despre sistem limitate și o parte din conținutul paginii pentru a identifica amenințările noi și a proteja toți utilizatorii de pe web.</translation>
 <translation id="8909135823018751308">Trimite…</translation>
+<translation id="8918299437379122615">Trimite linkul spre pagina cu rezultatele căutării pentru: <ph name="SEARCH_QUERY" />. Sursă: <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">Descarcă paginile folosind butonul Mai multe opțiuni, pentru a le folosi offline</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation>
 <translation id="892496902842311796"><ph name="LANG" /> este gata</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
index 75cba9f..65ce8a5 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">Экономьте до 60 % трафика и читайте ежедневные новости.</translation>
 <translation id="1303339473099049190">Пароль не найден. Убедитесь, что он указан правильно, и повторите попытку.</translation>
 <translation id="1303507811548703290">Домен: <ph name="DOMAIN" />. Отправлено с устройства "<ph name="DEVICE_NAME" />".</translation>
+<translation id="1318262688555255786">Поделиться ссылкой на веб-страницу "<ph name="PAGE_TITLE" />". Источник: <ph name="PAGE_URL" />.</translation>
 <translation id="1320912611264252795">Страница сохранения закладки, открытая на весь экран</translation>
 <translation id="1327257854815634930">История переходов открыта</translation>
 <translation id="1331212799747679585">Не удалось обновить Chrome. Другие настройки</translation>
@@ -455,6 +456,7 @@
 <translation id="3072980200212375806">Приложение "<ph name="APP_NAME" />" откроется в Chrome. Продолжая, вы принимаете <ph name="BEGIN_LINK1" />Условия использования Google<ph name="END_LINK1" /> и <ph name="BEGIN_LINK2" />Дополнительные условия использования Chrome и Chrome OS<ph name="END_LINK2" />. Также действует <ph name="BEGIN_LINK3" />Политика конфиденциальности<ph name="END_LINK3" />.</translation>
 <translation id="3080525922482950719">Сохраняйте страницы, чтобы продолжить чтение позже или в офлайн-режиме.</translation>
 <translation id="3087734570205094154">Снизу</translation>
+<translation id="3088687687599869821">НАВИГАЦИЯ ПО СТРАНИЦАМ</translation>
 <translation id="3091010850649238832">Показать содержимое буфера обмена</translation>
 <translation id="3098745985164956033">Передавать некоторые изображения в Google, чтобы улучшить их описание</translation>
 <translation id="3114507951000454849">Будьте в курсе новостей <ph name="NEWS_ICON" /></translation>
@@ -515,6 +517,7 @@
 <translation id="3435465986463792564">Открыто много окон? Ими можно управлять здесь.</translation>
 <translation id="3435575784518354875">Экспортируйте пароли, обновите сервисы Google Play и импортируйте пароли обратно в Google Менеджер паролей. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
 <translation id="3435738964857648380">Безопасность</translation>
+<translation id="3435914367318771664">Добавить вкладку в новую группу</translation>
 <translation id="3439276997620616816">Здесь будут ваши недавние вкладки</translation>
 <translation id="3443221991560634068">Обновить страницу</translation>
 <translation id="3444179773590444986">Отправить отзыв о тёмной теме для сайтов?</translation>
@@ -781,6 +784,7 @@
 <translation id="4684427112815847243">Синхронизировать все</translation>
 <translation id="4685741273709472646">Выберите из списка</translation>
 <translation id="4687718960473379118">Реклама, предлагаемая сайтами</translation>
+<translation id="468924408576231679">Скопировать ссылку на веб-страницу "<ph name="PAGE_TITLE" />". Источник: <ph name="PAGE_URL" />.</translation>
 <translation id="469286762610133730">Более интересный контент</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" /> и ещё <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> способ доставки}one{<ph name="SHIPPING_OPTION_PREVIEW" /> и ещё <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> способ доставки}few{<ph name="SHIPPING_OPTION_PREVIEW" /> и ещё <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> способа доставки}many{<ph name="SHIPPING_OPTION_PREVIEW" /> и ещё <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> способов доставки}other{<ph name="SHIPPING_OPTION_PREVIEW" /> и ещё <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> способа доставки}}</translation>
 <translation id="4698061626562952596">Просмотр неактивных вкладок</translation>
@@ -1123,6 +1127,7 @@
 <translation id="6205314730813004066">Конфиденциальность в рекламе</translation>
 <translation id="6210748933810148297"><ph name="EMAIL" /> не ваш аккаунт?</translation>
 <translation id="6211386937064921208">Включен режим предпросмотра.</translation>
+<translation id="6212567362666004597">Добавить вкладку в группу</translation>
 <translation id="6221633008163990886">Чтобы экспортировать пароли, разблокируйте экран</translation>
 <translation id="6225572914528673855">Адресная строка</translation>
 <translation id="6232535412751077445">Если вы запретите отслеживание, в запросы браузера будет включена специальная команда. Сайты могут интерпретировать ее и отвечать на нее по-разному.
@@ -1150,6 +1155,7 @@
 <translation id="6324916366299863871">Изменить ярлык</translation>
 <translation id="6324977638108296054">Невозможно создать ссылку на выделенный текст.</translation>
 <translation id="6333140779060797560">Отправить с помощью <ph name="APPLICATION" /></translation>
+<translation id="6335454563754888572">Изменить URL страницы на сайте: <ph name="PAGE_URL" />.</translation>
 <translation id="6337234675334993532">Шифрование</translation>
 <translation id="6340526405444716530">Персонализация</translation>
 <translation id="6341580099087024258">Спрашивать, куда сохранять файлы</translation>
@@ -1193,6 +1199,7 @@
 <translation id="6486420406192123355">Этот PDF-файл расположен на сайте, подключение к которому не защищено.</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{Скачан 1 файл.}one{Скачан # файл.}few{Скачано # файла.}many{Скачано # файлов.}other{Скачано # файла.}}</translation>
 <translation id="6508722015517270189">Перезапустите Google Chrome.</translation>
+<translation id="6513924416597632811">Скопировать ссылку на страницу результатов поиска по запросу: <ph name="SEARCH_QUERY" />. Источник: <ph name="PAGE_URL" />.</translation>
 <translation id="6518133107902771759">Подтвердить</translation>
 <translation id="6527303717912515753">Поделиться</translation>
 <translation id="652948702951888897">История Chrome</translation>
@@ -1604,6 +1611,7 @@
 <translation id="8221401890884589479">Вы можете заблокировать ненужные сайты. Chrome также автоматически удаляет из списка сайты, добавленные более 30 дней назад. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">Удаление данных о работе в браузере</translation>
 <translation id="8223642481677794647">Меню карточки из ленты</translation>
+<translation id="82296173028782770">Изменить поисковый запрос: <ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">Теперь чтобы вернуться на предыдущую страницу, проведите по экрану вправо, а чтобы перейти дальше – влево.</translation>
 <translation id="8236097722223016103">Добавить в закладки</translation>
 <translation id="8243077599929149377">Добавьте свое имя пользователя</translation>
@@ -1752,6 +1760,7 @@
 <translation id="8890668505403261809">Поиск по вкладкам инкогнито</translation>
 <translation id="8898822736010347272">Отправлять в Google URL и контент некоторых посещенных страниц, а также определенную информацию о системе (это помогает обнаруживать новые угрозы и защищать всех пользователей интернета)</translation>
 <translation id="8909135823018751308">Поделиться...</translation>
+<translation id="8918299437379122615">Поделиться ссылкой на страницу результатов поиска по запросу: <ph name="SEARCH_QUERY" />. Источник: <ph name="PAGE_URL" />.</translation>
 <translation id="8922289737868596582">Скачивайте страницы через меню кнопки "Ещё" и открывайте их без подключения к Интернету</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
 <translation id="892496902842311796"><ph name="LANG" />: языковой пакет готов.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
index 3752ebe..9502fb50 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">Prihranite do 60 % pri prenosu podatkov, preberite današnje novice</translation>
 <translation id="1303339473099049190">Tega gesla ni mogoče najti. Preverite črkovanje in poskusite znova.</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> – poslano iz naprave <ph name="DEVICE_NAME" /></translation>
+<translation id="1318262688555255786">Deljenje povezave do spletne strani <ph name="PAGE_TITLE" />. Vir: <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">Mape v postopku shranjevanja zaznamka, odprte pri polni višini</translation>
 <translation id="1327257854815634930">Zgodovina krmarjenja je odprta</translation>
 <translation id="1331212799747679585">Posodobitev Chroma ni mogoča. Več možnosti.</translation>
@@ -515,6 +516,7 @@
 <translation id="3435465986463792564">Imate odprtih veliko oken? Tukaj jih lahko upravljate.</translation>
 <translation id="3435575784518354875">Če želite ohraniti dostop do gesel, jih izvozite, posodobite Storitve Google Play in nato gesla znova uvozite v Googlovega upravitelja gesel. <ph name="BEGIN_LINK" />Oglejte si celotna navodila<ph name="END_LINK" />.</translation>
 <translation id="3435738964857648380">Varnost</translation>
+<translation id="3435914367318771664">Dodaj zavihek novi skupini</translation>
 <translation id="3439276997620616816">Tukaj bodo prikazani nedavni zavihki</translation>
 <translation id="3443221991560634068">Vnovično nalaganje trenutne strani</translation>
 <translation id="3444179773590444986">Želite poslati povratne informacije o temni temi za spletna mesta?</translation>
@@ -781,6 +783,7 @@
 <translation id="4684427112815847243">Sinhroniziraj vse</translation>
 <translation id="4685741273709472646">Izberite na spustnem seznamu</translation>
 <translation id="4687718960473379118">Oglasi, ki jih predlaga spletno mesto</translation>
+<translation id="468924408576231679">Kopiranje povezave do spletne strani <ph name="PAGE_TITLE" />. Vir: <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">Prejemajte boljšo vsebino</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" /> \u2026 in še <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}one{<ph name="SHIPPING_OPTION_PREVIEW" /> \u2026 in še <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}two{<ph name="SHIPPING_OPTION_PREVIEW" /> \u2026 in še <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}few{<ph name="SHIPPING_OPTION_PREVIEW" /> \u2026 in še <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}other{<ph name="SHIPPING_OPTION_PREVIEW" /> \u2026 in še <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}}</translation>
 <translation id="4698061626562952596">Tukaj preglejte neaktivne zavihke</translation>
@@ -1123,6 +1126,7 @@
 <translation id="6205314730813004066">Zasebnost pri oglaševanju</translation>
 <translation id="6210748933810148297">Niste <ph name="EMAIL" />?</translation>
 <translation id="6211386937064921208">Predogled te strani</translation>
+<translation id="6212567362666004597">Dodaj zavihek skupini</translation>
 <translation id="6221633008163990886">Odklenite, če želite izvoziti gesla</translation>
 <translation id="6225572914528673855">Naslovna vrstica</translation>
 <translation id="6232535412751077445">Če omogočite možnost »Ne sledi«, bo zahteva vključena v vaš promet brskanja. Učinek je odvisen od odziva spletnega mesta na zahtevo in od tega, kako si zahtevo razlaga.
@@ -1150,6 +1154,7 @@
 <translation id="6324916366299863871">Urejanje bližnjice</translation>
 <translation id="6324977638108296054">Povezave do označitve ni mogoče ustvariti.</translation>
 <translation id="6333140779060797560">Skupna raba prek: <ph name="APPLICATION" /></translation>
+<translation id="6335454563754888572">Urejanje URL-ja, ki kaže na stran: <ph name="PAGE_URL" /></translation>
 <translation id="6337234675334993532">Šifriranje</translation>
 <translation id="6340526405444716530">Prilagoditev</translation>
 <translation id="6341580099087024258">Vprašaj, kje shraniti datoteke</translation>
@@ -1193,6 +1198,7 @@
 <translation id="6486420406192123355">Ta datoteka PDF je s spletnega mesta, ki uporablja povezavo, ki ni varna</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{Datoteka je prenesena}one{# prenos je končan.}two{# prenosa sta končana.}few{# prenosi so končani.}other{# prenosov je končanih.}}</translation>
 <translation id="6508722015517270189">Znova zaženite Chrome</translation>
+<translation id="6513924416597632811">Kopiranje povezave do strani z rezultati iskanja za: <ph name="SEARCH_QUERY" />. Vir: <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">Preveri</translation>
 <translation id="6527303717912515753">Skupna raba</translation>
 <translation id="652948702951888897">Zgodovina v Chromu</translation>
@@ -1604,6 +1610,7 @@
 <translation id="8221401890884589479">Spletna mesta, ki jih ne želite, lahko blokirate. Chrome prav tako s seznama samodejno izbriše spletna mesta, starejša od 30 dni. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">Brisanje podatkov brskanja</translation>
 <translation id="8223642481677794647">Meni kartice vira</translation>
+<translation id="82296173028782770">Urejanje iskalne poizvedbe: <ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">Če povlečete v desno, se vrnete nazaj za ogled prejšnjih obiskanih strani, če povlečete v levo, pa se premaknete naprej</translation>
 <translation id="8236097722223016103">Dodajanje med zaznamke</translation>
 <translation id="8243077599929149377">Dodajte uporabniško ime</translation>
@@ -1752,6 +1759,7 @@
 <translation id="8890668505403261809">Iščite po anonimnih zavihkih</translation>
 <translation id="8898822736010347272">Pošilja URL-je nekaterih strani, ki jih obiščete, omejene podatke o sistemu in nekatere vsebine strani Googlu zaradi pomoči pri odkrivanju novih groženj in zaščiti vseh uporabnikov v spletu.</translation>
 <translation id="8909135823018751308">Skupna raba …</translation>
+<translation id="8918299437379122615">Deljenje povezave do strani z rezultati iskanja za: <ph name="SEARCH_QUERY" />. Vir: <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">Prenos strani za uporabo brez povezave z gumbom »Več možnosti«</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation>
 <translation id="892496902842311796">Jezik <ph name="LANG" /> je pripravljen.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
index 8c22d84c..b6d8e5d 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
@@ -477,6 +477,7 @@
 <translation id="3208584281581115441">Proveri</translation>
 <translation id="3211426585530211793">Stavka <ph name="ITEM_TITLE" /> je izbrisana</translation>
 <translation id="3220943972464248773">Da biste sinhronizovali lozinke, potvrdite svoj identitet</translation>
+<translation id="323213525320714789">PROGRAMER</translation>
 <translation id="3232293466644486101">Izbriši podatke pregledanja…</translation>
 <translation id="3232754137068452469">Veb-aplikacija</translation>
 <translation id="3236059992281584593">Još 1 min</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
index 3a1d919..a17efb53 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -477,6 +477,7 @@
 <translation id="3208584281581115441">Провери</translation>
 <translation id="3211426585530211793">Ставка <ph name="ITEM_TITLE" /> је избрисана</translation>
 <translation id="3220943972464248773">Да бисте синхронизовали лозинке, потврдите свој идентитет</translation>
+<translation id="323213525320714789">ПРОГРАМЕР</translation>
 <translation id="3232293466644486101">Избриши податке прегледања…</translation>
 <translation id="3232754137068452469">Веб-апликација</translation>
 <translation id="3236059992281584593">Још 1 мин</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
index 7a4d0469..1ae43a7a 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">Spara upp till 60 % data och läs dagens nyheter</translation>
 <translation id="1303339473099049190">Det gick inte att hitta lösenordet. Kontrollera stavningen och försök igen.</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> – Skickades från <ph name="DEVICE_NAME" /></translation>
+<translation id="1318262688555255786">Dela länk till webbsidan <ph name="PAGE_TITLE" />. Källa: <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">Mappar i flöde för att spara bokmärken har öppnats över hela skärmen</translation>
 <translation id="1327257854815634930">Navigeringshistoriken har öppnats</translation>
 <translation id="1331212799747679585">Det går inte att uppdatera Chrome. Fler alternativ</translation>
@@ -515,6 +516,7 @@
 <translation id="3435465986463792564">Har du många fönster? Du kan hantera dem härifrån</translation>
 <translation id="3435575784518354875">Om du vill behålla åtkomsten till dina lösenord kan du exportera dem nu, uppdatera Google Play-tjänster och sedan importera dem till Google Lösenordshantering. <ph name="BEGIN_LINK" />Se fullständiga instruktioner<ph name="END_LINK" />.</translation>
 <translation id="3435738964857648380">Säkerhet</translation>
+<translation id="3435914367318771664">Lägg till fliken i en ny grupp</translation>
 <translation id="3439276997620616816">Du hittar dina senaste flikar här</translation>
 <translation id="3443221991560634068">Läs in den aktuella sidan igen</translation>
 <translation id="3444179773590444986">Vill du dela feedback om mörkt tema för webbplatser?</translation>
@@ -782,6 +784,7 @@
 <translation id="4684427112815847243">Synkronisera allt</translation>
 <translation id="4685741273709472646">Välj i rullgardinsmenyn</translation>
 <translation id="4687718960473379118">Föreslagna annonser på webbplatser</translation>
+<translation id="468924408576231679">Kopiera länk till webbsidan <ph name="PAGE_TITLE" />. Källa: <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">Få bättre innehåll</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 och <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> till}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 och <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> till}}</translation>
 <translation id="4698061626562952596">Granska dina inaktiva flikar här</translation>
@@ -1124,6 +1127,7 @@
 <translation id="6205314730813004066">Annonsintegritet</translation>
 <translation id="6210748933810148297">Inte <ph name="EMAIL" />?</translation>
 <translation id="6211386937064921208">Förhandsgranskar sidan</translation>
+<translation id="6212567362666004597">Lägg till fliken i gruppen</translation>
 <translation id="6221633008163990886">Lås upp om du vill exportera dina lösenord</translation>
 <translation id="6225572914528673855">Adressfält</translation>
 <translation id="6232535412751077445">Om du aktiverar Do Not Track inkluderas en begäran i din surftrafik. Eventuella effekter beror på om webbplatsen svarar på begäran och hur begäran tolkas.
@@ -1151,6 +1155,7 @@
 <translation id="6324916366299863871">Redigera genväg</translation>
 <translation id="6324977638108296054">Det gick inte att skapa en länk till markeringen</translation>
 <translation id="6333140779060797560">Dela via <ph name="APPLICATION" /></translation>
+<translation id="6335454563754888572">Redigera webbadress som pekar på sidan på: <ph name="PAGE_URL" /></translation>
 <translation id="6337234675334993532">Kryptering</translation>
 <translation id="6340526405444716530">Anpassning</translation>
 <translation id="6341580099087024258">Fråga var filerna ska sparas</translation>
@@ -1194,6 +1199,7 @@
 <translation id="6486420406192123355">Den här PDF-filen kommer från en webbplats som använder en osäker anslutning</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{Filen har laddats ned}other{# nedladdningar har slutförts}}</translation>
 <translation id="6508722015517270189">Starta om Chrome</translation>
+<translation id="6513924416597632811">Kopiera länken till sökresultatsidan för: <ph name="SEARCH_QUERY" />. Källa: <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">Verifiera</translation>
 <translation id="6527303717912515753">Dela</translation>
 <translation id="652948702951888897">Chrome-historik</translation>
@@ -1605,6 +1611,7 @@
 <translation id="8221401890884589479">Du kan blockera webbplatser som du inte vill ha. Chrome raderar även webbplatser som är äldre än 30 dagar automatiskt. <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">Radera webbinformation</translation>
 <translation id="8223642481677794647">Menyn med flödeskort</translation>
+<translation id="82296173028782770">Redigera sökfråga: <ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">Med ett svep åt höger kan du nu återgå till tidigare sidor du besökt, medan ett svep åt vänster tar dig framåt</translation>
 <translation id="8236097722223016103">Lägg till i bokmärken</translation>
 <translation id="8243077599929149377">Lägg till ditt användarnamn</translation>
@@ -1753,6 +1760,7 @@
 <translation id="8890668505403261809">Sök bland inkognitoflikar</translation>
 <translation id="8898822736010347272">Skickar webbadresser till vissa sidor som du besöker, vissa systemuppgifter och visst sidinnehåll till Google för att upptäcka och blockera nya hot och skydda alla användare på internet.</translation>
 <translation id="8909135823018751308">Dela …</translation>
+<translation id="8918299437379122615">Dela länken till sökresultatsidan för: <ph name="SEARCH_QUERY" />. Källa: <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">Ladda ned sidor via knappen Fler alternativ så att du kan använda dem offline</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation>
 <translation id="892496902842311796"><ph name="LANG" /> är redo</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
index a6f9741..c6bed08 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
@@ -477,6 +477,7 @@
 <translation id="3208584281581115441">ఇప్పుడే చెక్ చేయండి</translation>
 <translation id="3211426585530211793"><ph name="ITEM_TITLE" /> తొలగించబడింది</translation>
 <translation id="3220943972464248773">మీ పాస్‌వర్డ్‌లను సింక్ చేయడానికి, అది మీరేనని వెరిఫై చేయండి</translation>
+<translation id="323213525320714789">డెవలపర్</translation>
 <translation id="3232293466644486101">బ్రౌజింగ్ డేటాను తొలగించండి…</translation>
 <translation id="3232754137068452469">వెబ్ యాప్‌</translation>
 <translation id="3236059992281584593">1 నిమిషం మిగిలి ఉంది</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 a233ece4..5dacabc 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
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">อ่านข่าววันนี้ ประหยัดอินเทอร์เน็ตได้ถึง 60%</translation>
 <translation id="1303339473099049190">ไม่พบรหัสผ่านดังกล่าว โปรดตรวจสอบการสะกดแล้วลองอีกครั้ง</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> - ส่งจาก <ph name="DEVICE_NAME" /></translation>
+<translation id="1318262688555255786">แชร์ลิงก์ไปยังหน้าเว็บ <ph name="PAGE_TITLE" /> แหล่งที่มา: <ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">ขั้นตอนการบันทึกบุ๊กมาร์กเปิดอยู่ที่ระดับเต็มความสูง</translation>
 <translation id="1327257854815634930">ประวัติการนำทางเปิดอยู่</translation>
 <translation id="1331212799747679585">อัปเดต Chrome ไม่ได้ ตัวเลือกอื่นๆ</translation>
@@ -516,6 +517,7 @@
 <translation id="3435465986463792564">หากมีหน้าต่างเปิดอยู่หลายหน้า คุณจัดการหน้าต่างเหล่านั้นได้จากที่นี่</translation>
 <translation id="3435575784518354875">หากต้องการเข้าถึงรหัสผ่านต่อไป ให้ส่งออกรหัสผ่านตอนนี้ อัปเดตบริการ Google Play แล้วนำเข้ากลับไปยังเครื่องมือจัดการรหัสผ่านบน Google <ph name="BEGIN_LINK" />ดูวิธีการโดยละเอียด<ph name="END_LINK" /></translation>
 <translation id="3435738964857648380">ความปลอดภัย</translation>
+<translation id="3435914367318771664">เพิ่มแท็บไปยังกลุ่มใหม่</translation>
 <translation id="3439276997620616816">คุณจะเห็นแท็บล่าสุดที่นี่</translation>
 <translation id="3443221991560634068">โหลดหน้าปัจจุบันอีกครั้ง</translation>
 <translation id="3444179773590444986">ต้องการแชร์ความคิดเห็นเกี่ยวกับธีมมืดสำหรับเว็บไซต์ไหม</translation>
@@ -782,6 +784,7 @@
 <translation id="4684427112815847243">ซิงค์ทุกอย่าง</translation>
 <translation id="4685741273709472646">เลือกจากรายการแบบเลื่อนลง</translation>
 <translation id="4687718960473379118">โฆษณาที่เว็บไซต์แนะนำ</translation>
+<translation id="468924408576231679">คัดลอกลิงก์ไปยังหน้าเว็บ <ph name="PAGE_TITLE" /> แหล่งที่มา: <ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">รับเนื้อหาที่ดีขึ้น</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 และอีก <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> ตัวเลือก}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 และอีก <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> ตัวเลือก}}</translation>
 <translation id="4698061626562952596">ตรวจสอบแท็บที่ไม่ได้ใช้งานที่นี่</translation>
@@ -1124,6 +1127,7 @@
 <translation id="6205314730813004066">ความเป็นส่วนตัวเกี่ยวกับโฆษณา</translation>
 <translation id="6210748933810148297"><ph name="EMAIL" /> ไม่ใช่บัญชีที่ฉันจะใช้</translation>
 <translation id="6211386937064921208">แสดงตัวอย่างหน้าเว็บนี้</translation>
+<translation id="6212567362666004597">เพิ่มแท็บไปยังกลุ่ม</translation>
 <translation id="6221633008163990886">ปลดล็อกเพื่อส่งออกรหัสผ่าน</translation>
 <translation id="6225572914528673855">แถบที่อยู่</translation>
 <translation id="6232535412751077445">การเปิดใช้ "ไม่ติดตาม" หมายความว่าจะมีการรวมคำขอหนึ่งไว้กับการเข้าชมของคุณ ผลกระทบทั้งหมดขึ้นอยู่กับว่าเว็บไซต์ตอบสนองต่อคำขอนั้นไหม และวิธีตีความคำขอ
@@ -1151,6 +1155,7 @@
 <translation id="6324916366299863871">แก้ไขทางลัด</translation>
 <translation id="6324977638108296054">สร้างลิงก์ไปยังไฮไลต์ไม่ได้</translation>
 <translation id="6333140779060797560">แชร์ผ่าน <ph name="APPLICATION" /></translation>
+<translation id="6335454563754888572">แก้ไข URL ที่ชี้ไปยังหน้าเว็บ: <ph name="PAGE_URL" /></translation>
 <translation id="6337234675334993532">การเข้ารหัส</translation>
 <translation id="6340526405444716530">การปรับเปลี่ยนในแบบของคุณ</translation>
 <translation id="6341580099087024258">ถามว่าจะให้บันทึกไฟล์ไว้ที่ใด</translation>
@@ -1194,6 +1199,7 @@
 <translation id="6486420406192123355">ไฟล์ PDF นี้มาจากเว็บไซต์ที่ใช้การเชื่อมต่อที่ไม่ปลอดภัย</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{ดาวน์โหลดไฟล์แล้ว}other{การดาวน์โหลด # รายการเสร็จสมบูรณ์}}</translation>
 <translation id="6508722015517270189">รีสตาร์ท Chrome</translation>
+<translation id="6513924416597632811">คัดลอกลิงก์ไปยังหน้าผลการค้นหาสำหรับ: <ph name="SEARCH_QUERY" /> แหล่งที่มา: <ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">ยืนยัน</translation>
 <translation id="6527303717912515753">แชร์</translation>
 <translation id="652948702951888897">ประวัติการเข้าชมใน Chrome</translation>
@@ -1605,6 +1611,7 @@
 <translation id="8221401890884589479">คุณบล็อกเว็บไซต์ที่ไม่ต้องการได้ นอกจากนี้ Chrome จะลบข้อมูลเว็บไซต์ที่นานเกิน 30 วันออกจากรายการโดยอัตโนมัติ <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">กำลังลบข้อมูลการท่องเว็บ</translation>
 <translation id="8223642481677794647">เมนูของการ์ดฟีด</translation>
+<translation id="82296173028782770">แก้ไขคำค้นหา: <ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">ตอนนี้การปัดไปทางขวาจะพาคุณย้อนกลับไปดูหน้าเว็บที่เคยเข้าชมก่อนหน้านี้ ส่วนการปัดไปทางซ้ายจะพาคุณไปข้างหน้า</translation>
 <translation id="8236097722223016103">เพิ่มลงในบุ๊กมาร์ก</translation>
 <translation id="8243077599929149377">เพิ่มชื่อผู้ใช้ของคุณ</translation>
@@ -1753,6 +1760,7 @@
 <translation id="8890668505403261809">ค้นหาแท็บที่ไม่ระบุตัวตน</translation>
 <translation id="8898822736010347272">ส่ง URL ของหน้าบางหน้าที่คุณเข้าชม ข้อมูลระบบที่จำกัด และเนื้อหาบางส่วนของหน้าไปให้ Google เพื่อช่วยตรวจหาภัยคุกคามใหม่ๆ และปกป้องทุกคนที่ใช้อินเทอร์เน็ต</translation>
 <translation id="8909135823018751308">แชร์…</translation>
+<translation id="8918299437379122615">แชร์ลิงก์ไปยังหน้าผลการค้นหาสำหรับ: <ph name="SEARCH_QUERY" /> แหล่งที่มา: <ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">ดาวน์โหลดหน้าจากปุ่มตัวเลือกเพิ่มเติมเพื่อใช้งานแบบออฟไลน์</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation>
 <translation id="892496902842311796">ภาษา<ph name="LANG" />พร้อมใช้งานแล้ว</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
index 8f4ec9c2..de9cf67 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -476,6 +476,7 @@
 <translation id="3208584281581115441">Hozir tekshirish</translation>
 <translation id="3211426585530211793">Oʻchirib tashlandi: <ph name="ITEM_TITLE" /></translation>
 <translation id="3220943972464248773">Parollarni sinxronlash uchun shaxsingizni tasdiqlang</translation>
+<translation id="323213525320714789">DASTURCHI</translation>
 <translation id="3232293466644486101">Brauzer maʼlumotlarini oʻchirish…</translation>
 <translation id="3232754137068452469">Veb-ilova</translation>
 <translation id="3236059992281584593">1 daqiqa qoldi</translation>
@@ -614,6 +615,7 @@
 <translation id="3856096718352044181">Bu ishonchli xizmat ekanini tekshiring yoki keyinroq qayta urining</translation>
 <translation id="3858860766373142691">Ism</translation>
 <translation id="3863527519275151528">Bildirishnoma qayta ishlanmoqda</translation>
+<translation id="3866863539038222107">Tekshirish</translation>
 <translation id="3870908470613821006">“<ph name="GROUP_NAME" />” varaqlar guruhi hammada ishlamay qoladi va barcha qurilmalardan oʻchiriladi</translation>
 <translation id="3873174561423636563">Davom etish uchun <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> maʼlumotlaringizni (<ph name="FIELDS_STRING" />) bu saytga ulashadi. Bu saytning <ph name="BEGIN_LINK1" />xizmat shartlari<ph name="END_LINK1" />.</translation>
 <translation id="3892148308691398805">Matnni nusxalash</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
index b8fa649..05abd83 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">节省高达 60% 的数据流量,阅读今日新闻</translation>
 <translation id="1303339473099049190">找不到该密码。请检查拼写,然后重试。</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> - 发送者:<ph name="DEVICE_NAME" /></translation>
+<translation id="1318262688555255786">分享指向“<ph name="PAGE_TITLE" />”网页的链接。来源:<ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">书签保存流程文件夹已全屏打开</translation>
 <translation id="1327257854815634930">导航历史记录已打开</translation>
 <translation id="1331212799747679585">Chrome 无法更新。更多选项</translation>
@@ -475,6 +476,7 @@
 <translation id="3208584281581115441">立即检查</translation>
 <translation id="3211426585530211793">已删除“<ph name="ITEM_TITLE" />”</translation>
 <translation id="3220943972464248773">若要同步您的密码,请验证是您本人在操作</translation>
+<translation id="323213525320714789">开发者</translation>
 <translation id="3232293466644486101">删除浏览数据…</translation>
 <translation id="3232754137068452469">网络应用</translation>
 <translation id="3236059992281584593">还剩 1 分钟</translation>
@@ -515,6 +517,7 @@
 <translation id="3435465986463792564">打开了许多窗口?您可在此处管理它们</translation>
 <translation id="3435575784518354875">如需继续使用您的密码,请立即将其导出,更新 Google Play 服务,然后将其重新导入 Google 密码管理工具。<ph name="BEGIN_LINK" />查看完整说明<ph name="END_LINK" />。</translation>
 <translation id="3435738964857648380">安全</translation>
+<translation id="3435914367318771664">向新分组中添加标签页</translation>
 <translation id="3439276997620616816">此处会显示您近期关闭的标签页</translation>
 <translation id="3443221991560634068">重新加载当前网页</translation>
 <translation id="3444179773590444986">针对为网站开启深色主题分享反馈?</translation>
@@ -781,6 +784,7 @@
 <translation id="4684427112815847243">同步所有数据</translation>
 <translation id="4685741273709472646">从下拉列表中选择</translation>
 <translation id="4687718960473379118">网站建议的广告</translation>
+<translation id="468924408576231679">复制指向“<ph name="PAGE_TITLE" />”网页的链接。来源:<ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">获得更合乎需求的内容</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026以及另外 <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> 种送货方式}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026以及另外 <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> 种送货方式}}</translation>
 <translation id="4698061626562952596">在此处查看闲置标签页</translation>
@@ -1123,6 +1127,7 @@
 <translation id="6205314730813004066">广告隐私权设置</translation>
 <translation id="6210748933810148297">不是 <ph name="EMAIL" />?</translation>
 <translation id="6211386937064921208">正在预览此页</translation>
+<translation id="6212567362666004597">向分组中添加标签页</translation>
 <translation id="6221633008163990886">需解锁才能导出您的密码</translation>
 <translation id="6225572914528673855">地址栏</translation>
 <translation id="6232535412751077445">如果您启用了“不跟踪”,您的浏览流量中将会包含一项请求。具体影响取决于网站是否会回应该请求以及如何解读该请求。
@@ -1150,6 +1155,7 @@
 <translation id="6324916366299863871">修改快捷方式</translation>
 <translation id="6324977638108296054">无法创建指向突出显示的内容的链接</translation>
 <translation id="6333140779060797560">通过<ph name="APPLICATION" />分享</translation>
+<translation id="6335454563754888572">修改指向以下网站的网址:<ph name="PAGE_URL" /></translation>
 <translation id="6337234675334993532">加密</translation>
 <translation id="6340526405444716530">个性化</translation>
 <translation id="6341580099087024258">询问文件保存位置</translation>
@@ -1193,6 +1199,7 @@
 <translation id="6486420406192123355">此 PDF 文件来自使用不安全连接的网站</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{文件已下载完毕}other{# 个文件已下载完毕}}</translation>
 <translation id="6508722015517270189">重新启动 Chrome</translation>
+<translation id="6513924416597632811">复制指向以下搜索查询的搜索结果页的链接:<ph name="SEARCH_QUERY" />。来源:<ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">验证</translation>
 <translation id="6527303717912515753">分享</translation>
 <translation id="652948702951888897">Chrome 历史记录</translation>
@@ -1602,6 +1609,7 @@
 <translation id="8221401890884589479">您可根据自己的需要屏蔽一些网站。Chrome 还会从列表中自动删除保留时长超过 30 天的网站。<ph name="BEGIN_LINK" />了解详情<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">正在删除浏览数据</translation>
 <translation id="8223642481677794647">动态卡片上的菜单</translation>
+<translation id="82296173028782770">修改搜索查询:<ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">现在,向右滑动可返回查看您之前访问过的页面,向左滑动可前进</translation>
 <translation id="8236097722223016103">添加到书签</translation>
 <translation id="8243077599929149377">添加您的用户名</translation>
@@ -1750,6 +1758,7 @@
 <translation id="8890668505403261809">搜索无痕式标签页</translation>
 <translation id="8898822736010347272">向 Google 发送您访问过的部分网页的网址、有限的系统信息以及部分网页内容,以便帮助我们发现新威胁并保护网络上的所有用户。</translation>
 <translation id="8909135823018751308">分享…</translation>
+<translation id="8918299437379122615">分享指向以下搜索查询的搜索结果页的链接:<ph name="SEARCH_QUERY" />。来源:<ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">通过“更多选项”按钮下载网页以供离线查看</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />了解详情<ph name="END_LINK" /></translation>
 <translation id="892496902842311796">可以使用<ph name="LANG" />了</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
index 98018ec2..5e11986 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">節省高達 60% 數據用量,立即閱讀今天新聞</translation>
 <translation id="1303339473099049190">找不到該密碼。請檢查您輸入的內容,然後再試一次。</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> - 來自 <ph name="DEVICE_NAME" /></translation>
+<translation id="1318262688555255786">分享「<ph name="PAGE_TITLE" />」的網頁連結,來源:<ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">書籤儲存流程宜家顯示喺成個畫面</translation>
 <translation id="1327257854815634930">導覽記錄開咗</translation>
 <translation id="1331212799747679585">無法更新 Chrome。其他選項</translation>
@@ -455,6 +456,7 @@
 <translation id="3072980200212375806">「<ph name="APP_NAME" />」將在 Chrome 中開啟。繼續即表示您同意《<ph name="BEGIN_LINK1" />Google 服務條款<ph name="END_LINK1" />》以及 <ph name="BEGIN_LINK2" />Google Chrome 和 Chrome OS 的《附加服務條款》<ph name="END_LINK2" />。須同時受《<ph name="BEGIN_LINK3" />私隱權政策<ph name="END_LINK3" />》約束。</translation>
 <translation id="3080525922482950719">您可儲存網頁,以便稍後或離線閱讀</translation>
 <translation id="3087734570205094154">下方</translation>
+<translation id="3088687687599869821">網頁導覽</translation>
 <translation id="3091010850649238832">顯示剪貼簿內容</translation>
 <translation id="3098745985164956033">部分圖片會傳送至 Google,以便為您提供更完善的說明</translation>
 <translation id="3114507951000454849">閱讀今天的新聞 <ph name="NEWS_ICON" /></translation>
@@ -515,6 +517,7 @@
 <translation id="3435465986463792564">開啟了很多視窗嗎?您可在此管理視窗</translation>
 <translation id="3435575784518354875">如要繼續存取密碼,請立即匯出密碼、更新 Google Play 服務,再將密碼匯入回「Google 密碼管理工具」。<ph name="BEGIN_LINK" />查閱完整指示<ph name="END_LINK" />。</translation>
 <translation id="3435738964857648380">安全性</translation>
+<translation id="3435914367318771664">將分頁加入新群組</translation>
 <translation id="3439276997620616816">最近開啟的分頁會在這裡顯示</translation>
 <translation id="3443221991560634068">重新載入目前網頁</translation>
 <translation id="3444179773590444986">要就網站深色主題背景提供意見嗎?</translation>
@@ -781,6 +784,7 @@
 <translation id="4684427112815847243">同步處理所有資料</translation>
 <translation id="4685741273709472646">由下拉式選單入面揀</translation>
 <translation id="4687718960473379118">網站建議的廣告</translation>
+<translation id="468924408576231679">複製「<ph name="PAGE_TITLE" />」的網頁連結,來源:<ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">取得更適切的內容</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 和另外 <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> 種運送方式}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 和另外 <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> 種運送方式}}</translation>
 <translation id="4698061626562952596">在此查看閒置分頁</translation>
@@ -1123,6 +1127,7 @@
 <translation id="6205314730813004066">廣告私隱權</translation>
 <translation id="6210748933810148297">不是 <ph name="EMAIL" /> 嗎?</translation>
 <translation id="6211386937064921208">正在預覽此網頁</translation>
+<translation id="6212567362666004597">將分頁加入群組</translation>
 <translation id="6221633008163990886">解鎖即可匯出您的密碼</translation>
 <translation id="6225572914528673855">網址列</translation>
 <translation id="6232535412751077445">啟用「不追蹤」即表示您的瀏覽流量將包含一個要求,其效用視乎網站會否回應要求,以及如何解讀要求。
@@ -1150,6 +1155,7 @@
 <translation id="6324916366299863871">編輯捷徑</translation>
 <translation id="6324977638108296054">無法建立突顯文字的連結</translation>
 <translation id="6333140779060797560">透過 <ph name="APPLICATION" /> 分享</translation>
+<translation id="6335454563754888572">編輯指向 <ph name="PAGE_URL" /> 的網址</translation>
 <translation id="6337234675334993532">加密</translation>
 <translation id="6340526405444716530">個人化</translation>
 <translation id="6341580099087024258">詢問儲存檔案的地方</translation>
@@ -1193,6 +1199,7 @@
 <translation id="6486420406192123355">此 PDF 檔案來自的網站使用不安全的連接</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{已下載檔案}other{已完成 # 項下載}}</translation>
 <translation id="6508722015517270189">重新啟動 Chrome</translation>
+<translation id="6513924416597632811">複製「<ph name="SEARCH_QUERY" />」的搜尋結果網頁連結,來源:<ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">驗證</translation>
 <translation id="6527303717912515753">分享</translation>
 <translation id="652948702951888897">Chrome 記錄</translation>
@@ -1604,6 +1611,7 @@
 <translation id="8221401890884589479">您可封鎖不想要的網站。Chrome 亦會從清單自動刪除超過 30 日的網站。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">正在刪除瀏覽資料</translation>
 <translation id="8223642481677794647">資訊提供卡選單</translation>
+<translation id="82296173028782770">編輯搜尋查詢:<ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">現在,向右輕掃即可返回之前瀏覽的頁面,向左掃則可前進</translation>
 <translation id="8236097722223016103">加入書籤</translation>
 <translation id="8243077599929149377">新增你的使用者名稱</translation>
@@ -1752,6 +1760,7 @@
 <translation id="8890668505403261809">搜尋無痕式分頁</translation>
 <translation id="8898822736010347272">向 Google 傳送部分您瀏覽網頁的網址、特定的系統資料及部分網頁內容,以協助探索新威脅,並保護所有網絡使用者。</translation>
 <translation id="8909135823018751308">共用…</translation>
+<translation id="8918299437379122615">分享「<ph name="SEARCH_QUERY" />」的搜尋結果網頁連結,來源:<ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">透過「更多選項」按鈕下載網頁,方便喺離線嗰陣使用</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
 <translation id="892496902842311796"><ph name="LANG" />套件已下載完成</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 78c2a44..a3ebfcf 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
@@ -77,6 +77,7 @@
 <translation id="1298077576058087471">節省高達 60% 的數據用量,閱讀今日新聞</translation>
 <translation id="1303339473099049190">找不到指定密碼。請檢查你輸入的內容,然後再試一次。</translation>
 <translation id="1303507811548703290"><ph name="DOMAIN" /> - 來自 <ph name="DEVICE_NAME" /></translation>
+<translation id="1318262688555255786">分享「<ph name="PAGE_TITLE" />」的網頁連結,來源:<ph name="PAGE_URL" /></translation>
 <translation id="1320912611264252795">書籤儲存流程資料夾已開啟,目前顯示整個版面的內容</translation>
 <translation id="1327257854815634930">瀏覽記錄已開啟</translation>
 <translation id="1331212799747679585">無法更新 Chrome。更多選項</translation>
@@ -455,6 +456,7 @@
 <translation id="3072980200212375806">「<ph name="APP_NAME" />」將在 Chrome 中開啟。選擇繼續即表示您同意《<ph name="BEGIN_LINK1" />Google 服務條款<ph name="END_LINK1" />》以及 <ph name="BEGIN_LINK2" />Google Chrome 和 Chrome OS 的《附加服務條款》<ph name="END_LINK2" />。您也必須遵守《<ph name="BEGIN_LINK3" />隱私權政策<ph name="END_LINK3" />》。</translation>
 <translation id="3080525922482950719">你可以儲存頁面以便稍後閱讀或離線閱讀</translation>
 <translation id="3087734570205094154">置底</translation>
+<translation id="3088687687599869821">網頁瀏覽</translation>
 <translation id="3091010850649238832">顯示剪貼簿內容</translation>
 <translation id="3098745985164956033">系統會將某些圖片傳送到 Google,為你提供更完善的圖片說明</translation>
 <translation id="3114507951000454849">閱讀今日新聞 <ph name="NEWS_ICON" /></translation>
@@ -515,6 +517,7 @@
 <translation id="3435465986463792564">開啟了多個視窗嗎?你可以在這裡進行管理</translation>
 <translation id="3435575784518354875">如要繼續存取密碼,請立即匯出密碼、更新 Google Play 服務,再將密碼匯入回 Google 密碼管理工具。<ph name="BEGIN_LINK" />查看完整操作說明<ph name="END_LINK" />。</translation>
 <translation id="3435738964857648380">安全性</translation>
+<translation id="3435914367318771664">將分頁加入新群組</translation>
 <translation id="3439276997620616816">這裡會顯示最近關閉的分頁</translation>
 <translation id="3443221991560634068">重新載入目前網頁</translation>
 <translation id="3444179773590444986">要針對網站的深色主題提供意見嗎?</translation>
@@ -781,6 +784,7 @@
 <translation id="4684427112815847243">同步處理所有資料</translation>
 <translation id="4685741273709472646">開啟下拉式清單</translation>
 <translation id="4687718960473379118">網站建議廣告</translation>
+<translation id="468924408576231679">複製「<ph name="PAGE_TITLE" />」的網頁連結,來源:<ph name="PAGE_URL" /></translation>
 <translation id="469286762610133730">取得優質內容</translation>
 <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 和另外 <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> 種運送方式}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 和另外 <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> 種運送方式}}</translation>
 <translation id="4698061626562952596">在此查看閒置分頁</translation>
@@ -1123,6 +1127,7 @@
 <translation id="6205314730813004066">廣告隱私權設定</translation>
 <translation id="6210748933810148297">不是 <ph name="EMAIL" /> 嗎?</translation>
 <translation id="6211386937064921208">正在預覽這個網頁</translation>
+<translation id="6212567362666004597">將分頁加入群組</translation>
 <translation id="6221633008163990886">解鎖即可匯出你的密碼</translation>
 <translation id="6225572914528673855">網址列</translation>
 <translation id="6232535412751077445">啟用「不追蹤」選項後,您的瀏覽流量會置入一項特定的要求,其作用則視網站是否回應要求,以及網站解讀要求的方式而定。
@@ -1150,6 +1155,7 @@
 <translation id="6324916366299863871">編輯捷徑</translation>
 <translation id="6324977638108296054">無法建立醒目顯示文字的連結</translation>
 <translation id="6333140779060797560">透過 <ph name="APPLICATION" /> 分享</translation>
+<translation id="6335454563754888572">編輯指向 <ph name="PAGE_URL" /> 的網址</translation>
 <translation id="6337234675334993532">加密</translation>
 <translation id="6340526405444716530">個人化</translation>
 <translation id="6341580099087024258">詢問檔案儲存位置</translation>
@@ -1193,6 +1199,7 @@
 <translation id="6486420406192123355">這個 PDF 檔的來源網站使用不安全連線</translation>
 <translation id="650224091954855786">{FILE_COUNT,plural, =1{已下載檔案}other{已完成 # 項下載作業}}</translation>
 <translation id="6508722015517270189">重新啟動 Chrome</translation>
+<translation id="6513924416597632811">複製「<ph name="SEARCH_QUERY" />」的搜尋結果頁面連結,來源:<ph name="PAGE_URL" /></translation>
 <translation id="6518133107902771759">驗證</translation>
 <translation id="6527303717912515753">分享</translation>
 <translation id="652948702951888897">Chrome 歷史記錄</translation>
@@ -1604,6 +1611,7 @@
 <translation id="8221401890884589479">如果不想讓網站儲存造訪資訊,建議你封鎖這些網站。Chrome 也會自動將 30 天前的網站從清單中刪除。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
 <translation id="8221985041778490865">正在刪除瀏覽資料</translation>
 <translation id="8223642481677794647">動態消息資訊卡選單</translation>
+<translation id="82296173028782770">編輯搜尋查詢:<ph name="SEARCH_QUERY" /></translation>
 <translation id="8236063039629122676">向右滑動現在可返回先前的頁面,向左滑動則可前進下一頁</translation>
 <translation id="8236097722223016103">加入書籤</translation>
 <translation id="8243077599929149377">新增使用者名稱</translation>
@@ -1752,6 +1760,7 @@
 <translation id="8890668505403261809">搜尋無痕分頁</translation>
 <translation id="8898822736010347272">將部分已造訪網頁的網址、特定的系統資訊和部分網頁內容傳送至 Google,以協助發現新威脅並保障所有網路使用者的安全。</translation>
 <translation id="8909135823018751308">分享…</translation>
+<translation id="8918299437379122615">分享「<ph name="SEARCH_QUERY" />」的搜尋結果頁面連結,來源:<ph name="PAGE_URL" /></translation>
 <translation id="8922289737868596582">透過「更多選項」按鈕下載網頁,以便離線存取</translation>
 <translation id="8924575305646776101"><ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
 <translation id="892496902842311796"><ph name="LANG" />套件已下載完成</translation>
diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/BottomUiThemeColorProvider.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/BottomUiThemeColorProvider.java
index f1d084e..9089bbc 100644
--- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/BottomUiThemeColorProvider.java
+++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/BottomUiThemeColorProvider.java
@@ -8,9 +8,10 @@
 import android.content.res.ColorStateList;
 
 import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
 import androidx.core.content.ContextCompat;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.browser_controls.BottomControlsStacker;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider.ControlsPosition;
@@ -32,6 +33,7 @@
  * This allows other bottom controls using this class to match the toolbar's color when it's
  * visually adjacent to them.
  */
+@NullMarked
 public class BottomUiThemeColorProvider extends ThemeColorProvider
         implements BrowserControlsStateProvider.Observer,
                 IncognitoStateObserver,
@@ -41,8 +43,8 @@
     private final ThemeColorProvider mToolbarThemeColorProvider;
     private final @ColorInt int mPrimaryBackgroundColorWithTopToolbar;
     private final @ColorInt int mIncognitoBackgroundColorWithTopToolbar;
-    private final ColorStateList mPrimaryTintWithTopToolbar;
-    private final ColorStateList mIncognitoTintWithTopToolbar;
+    private final @Nullable ColorStateList mPrimaryTintWithTopToolbar;
+    private final @Nullable ColorStateList mIncognitoTintWithTopToolbar;
     private final Context mContext;
     private final BrowserControlsStateProvider mBrowserControlsStateProvider;
     private final BottomControlsStacker mBottomControlsStacker;
@@ -59,11 +61,11 @@
      * @param context The {@link Context} that is used to retrieve color related resources.
      */
     public BottomUiThemeColorProvider(
-            @NonNull ThemeColorProvider toolbarThemeColorProvider,
-            @NonNull BrowserControlsStateProvider browserControlsStateProvider,
-            @NonNull BottomControlsStacker bottomControlsStacker,
-            @NonNull IncognitoStateProvider incognitoStateProvider,
-            @NonNull Context context) {
+            ThemeColorProvider toolbarThemeColorProvider,
+            BrowserControlsStateProvider browserControlsStateProvider,
+            BottomControlsStacker bottomControlsStacker,
+            IncognitoStateProvider incognitoStateProvider,
+            Context context) {
         super(context);
         mContext = context;
         mToolbarThemeColorProvider = toolbarThemeColorProvider;
@@ -117,7 +119,9 @@
     // TintObserver implementation.
     @Override
     public void onTintChanged(
-            ColorStateList tint, ColorStateList activityFocusTint, int brandedColorScheme) {
+            @Nullable ColorStateList tint,
+            @Nullable ColorStateList activityFocusTint,
+            int brandedColorScheme) {
         updateColorAndTint(false);
     }
 
@@ -138,7 +142,7 @@
         mBottomControlsStacker.notifyBackgroundColor(getThemeColor());
     }
 
-    private ColorStateList getTintForTopAnchoredToolbar() {
+    private @Nullable ColorStateList getTintForTopAnchoredToolbar() {
         return mIncognito ? mIncognitoTintWithTopToolbar : mPrimaryTintWithTopToolbar;
     }
 
diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeColorProvider.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeColorProvider.java
index a96e50ea..db07aaaf 100644
--- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeColorProvider.java
+++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeColorProvider.java
@@ -8,13 +8,14 @@
 import android.content.res.ColorStateList;
 
 import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 
 import org.chromium.base.ObserverList;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.ui.theme.BrandedColorScheme;
 
 /** An abstract class that provides the current theme color. */
+@NullMarked
 public abstract class ThemeColorProvider {
     /** An interface to be notified about changes to the theme color. */
     public interface ThemeColorObserver {
@@ -37,8 +38,8 @@
          * @param brandedColorScheme The {@link BrandedColorScheme} the observer should use.
          */
         void onTintChanged(
-                ColorStateList tint,
-                ColorStateList activityFocusTint,
+                @Nullable ColorStateList tint,
+                @Nullable ColorStateList activityFocusTint,
                 @BrandedColorScheme int brandedColorScheme);
     }
 
@@ -52,10 +53,10 @@
      * The primary icon tint for the current theme, that does not take the activity focus state into
      * account.
      */
-    private ColorStateList mTint;
+    private @Nullable ColorStateList mTint;
 
     /** The icon tint for the current theme, that takes the activity focus state into account. */
-    private ColorStateList mActivityFocusTint;
+    private @Nullable ColorStateList mActivityFocusTint;
 
     /** List of {@link ThemeColorObserver}s. These are used to broadcast events to listeners. */
     private final ObserverList<ThemeColorObserver> mThemeColorObservers;
@@ -113,14 +114,14 @@
      * @return The current tint of this provider, that does not take the activity focus state into
      *     account.
      */
-    public ColorStateList getTint() {
+    public @Nullable ColorStateList getTint() {
         return mTint;
     }
 
     /**
      * @return The tint that takes the current activity's focus state into account.
      */
-    public ColorStateList getActivityFocusTint() {
+    public @Nullable ColorStateList getActivityFocusTint() {
         return mActivityFocusTint;
     }
 
@@ -146,8 +147,8 @@
     }
 
     protected void updateTint(
-            @NonNull ColorStateList tint,
-            @NonNull ColorStateList activityFocusTint,
+            @Nullable ColorStateList tint,
+            @Nullable ColorStateList activityFocusTint,
             @BrandedColorScheme int brandedColorScheme) {
         if (tint == mTint && activityFocusTint == mActivityFocusTint) return;
         mTint = tint;
diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeModuleUtils.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeModuleUtils.java
index 203abc19..38e74f2 100644
--- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeModuleUtils.java
+++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeModuleUtils.java
@@ -6,13 +6,15 @@
 
 import org.chromium.base.ResettersForTesting;
 import org.chromium.base.ServiceLoaderUtil;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 
 /** Utility class for interactions with ThemeOverlayProvider. */
+@NullMarked
 public final class ThemeModuleUtils {
 
-    private static ThemeOverlayProvider sInstance;
+    private static @Nullable ThemeOverlayProvider sInstance;
 
     private ThemeModuleUtils() {}
 
diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeOverlayProvider.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeOverlayProvider.java
index 707ad5c..a7a8561 100644
--- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeOverlayProvider.java
+++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeOverlayProvider.java
@@ -6,7 +6,10 @@
 
 import androidx.annotation.StyleRes;
 
+import org.chromium.build.annotations.NullMarked;
+
 /** Interface that provides a theme overlay resource ID. */
+@NullMarked
 public interface ThemeOverlayProvider {
     /** Get the theme overlay resource ID provided by the instance. */
     @StyleRes
diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java
index f17270c..8d42911 100644
--- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java
+++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java
@@ -10,11 +10,12 @@
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.ColorRes;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.core.content.ContextCompat;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.ui.native_page.NativePage;
 import org.chromium.chrome.browser.ui.theme.BrandedColorScheme;
@@ -25,6 +26,7 @@
 import org.chromium.ui.util.ColorUtils;
 
 /** Utility methods for theme colors. */
+@NullMarked
 public class ThemeUtils {
     /**
      * Alpha used when TextBox color is computed by brightening the Toolbar color using Color.WHITE.
diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/TopUiThemeColorProvider.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/TopUiThemeColorProvider.java
index bfa8d0d..2f0d4c2 100644
--- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/TopUiThemeColorProvider.java
+++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/TopUiThemeColorProvider.java
@@ -11,6 +11,7 @@
 
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.Supplier;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.tab.CurrentTabObserver;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
@@ -25,6 +26,7 @@
  * conditions such as dark mode settings, incognito mode, security state, etc.
  * <p>The theme color is only updated when the supplied tab is non-null.
  */
+@NullMarked
 public class TopUiThemeColorProvider extends ThemeColorProvider {
     private final CurrentTabObserver mTabObserver;
 
diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/ui/theme/BrandedColorScheme.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/ui/theme/BrandedColorScheme.java
index b2dc1e0..316fc06 100644
--- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/ui/theme/BrandedColorScheme.java
+++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/ui/theme/BrandedColorScheme.java
@@ -6,6 +6,8 @@
 
 import androidx.annotation.IntDef;
 
+import org.chromium.build.annotations.NullMarked;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -16,6 +18,7 @@
     BrandedColorScheme.APP_DEFAULT
 })
 @Retention(RetentionPolicy.SOURCE)
+@NullMarked
 public @interface BrandedColorScheme {
     /**
      * Light branded color as defined by the website, unrelated to the app/OS dark theme setting.
diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/ui/theme/ChromeSemanticColorUtils.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/ui/theme/ChromeSemanticColorUtils.java
index 69813933..5a14e9f 100644
--- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/ui/theme/ChromeSemanticColorUtils.java
+++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/ui/theme/ChromeSemanticColorUtils.java
@@ -9,11 +9,13 @@
 import androidx.annotation.ColorInt;
 import androidx.core.content.res.ResourcesCompat;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.theme.R;
 import org.chromium.components.browser_ui.styles.SemanticColorUtils;
 import org.chromium.ui.util.ColorUtils;
 
 /** Chrome specific version of {@link SemanticColorUtils}. */
+@NullMarked
 public class ChromeSemanticColorUtils {
     /**
      * Returns the semantic color value that corresponds to
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/back_button/BackButtonMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/back_button/BackButtonMediator.java
index 59c92b8d..cea239ea 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/back_button/BackButtonMediator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/back_button/BackButtonMediator.java
@@ -124,8 +124,8 @@
 
     @Override
     public void onTintChanged(
-            ColorStateList tint,
-            ColorStateList activityFocusTint,
+            @Nullable ColorStateList tint,
+            @Nullable ColorStateList activityFocusTint,
             @BrandedColorScheme int brandedColorScheme) {
         mModel.set(BackButtonProperties.TINT_COLOR_LIST, activityFocusTint);
         updateBackgroundHighlight(brandedColorScheme);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/reload_button/ReloadButtonMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/reload_button/ReloadButtonMediator.java
index 47d291fc..55f3dd4 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/reload_button/ReloadButtonMediator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/reload_button/ReloadButtonMediator.java
@@ -133,8 +133,8 @@
 
     @Override
     public void onTintChanged(
-            ColorStateList tint,
-            ColorStateList activityFocusTint,
+            @Nullable ColorStateList tint,
+            @Nullable ColorStateList activityFocusTint,
             @BrandedColorScheme int brandedColorScheme) {
         mModel.set(ReloadButtonProperties.TINT_LIST, activityFocusTint);
         updateBackgroundHighlight(brandedColorScheme);
diff --git a/chrome/browser/ui/android/web_app_header/BUILD.gn b/chrome/browser/ui/android/web_app_header/BUILD.gn
new file mode 100644
index 0000000..dc58255
--- /dev/null
+++ b/chrome/browser/ui/android/web_app_header/BUILD.gn
@@ -0,0 +1,20 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/rules.gni")
+
+android_library("java") {
+  sources = [
+    "java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayout.java",
+    "java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutCoordinator.java",
+    "java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutMediator.java",
+    "java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutProperties.java",
+    "java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutViewBinder.java",
+  ]
+
+  deps = [
+    "//base:base_java",
+    "//ui/android:ui_no_recycler_view_java",
+  ]
+}
diff --git a/chrome/browser/ui/android/web_app_header/DIR_METADATA b/chrome/browser/ui/android/web_app_header/DIR_METADATA
new file mode 100644
index 0000000..d35346f0
--- /dev/null
+++ b/chrome/browser/ui/android/web_app_header/DIR_METADATA
@@ -0,0 +1,6 @@
+# ChromeOS > Software > Developer > Web Apps on ChromeOS & Android
+buganizer: {
+    component_id: 1389907
+}
+team_email: "cros-web-apps-team@google.com"
+os: ANDROID
diff --git a/chrome/browser/ui/android/web_app_header/OWNERS b/chrome/browser/ui/android/web_app_header/OWNERS
new file mode 100644
index 0000000..bc59b0d
--- /dev/null
+++ b/chrome/browser/ui/android/web_app_header/OWNERS
@@ -0,0 +1,4 @@
+asraine@chromium.org
+aixba@chromium.org
+japhet@chromium.org
+vkorotkevich@google.com
diff --git a/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayout.java b/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayout.java
new file mode 100644
index 0000000..fd0c292
--- /dev/null
+++ b/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayout.java
@@ -0,0 +1,7 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.ui.web_app_header;
+
+public class WebAppHeaderLayout {}
diff --git a/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutCoordinator.java b/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutCoordinator.java
new file mode 100644
index 0000000..caf1cb9
--- /dev/null
+++ b/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutCoordinator.java
@@ -0,0 +1,10 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.ui.web_app_header;
+
+import org.chromium.build.annotations.NullMarked;
+
+@NullMarked
+public class WebAppHeaderLayoutCoordinator {}
diff --git a/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutMediator.java b/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutMediator.java
new file mode 100644
index 0000000..bd9654d
--- /dev/null
+++ b/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutMediator.java
@@ -0,0 +1,10 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.ui.web_app_header;
+
+import org.chromium.build.annotations.NullMarked;
+
+@NullMarked
+class WebAppHeaderLayoutMediator {}
diff --git a/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutProperties.java b/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutProperties.java
new file mode 100644
index 0000000..645f128d
--- /dev/null
+++ b/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutProperties.java
@@ -0,0 +1,7 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.ui.web_app_header;
+
+class WebAppHeaderLayoutProperties {}
diff --git a/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutViewBinder.java b/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutViewBinder.java
new file mode 100644
index 0000000..b4e68d7
--- /dev/null
+++ b/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutViewBinder.java
@@ -0,0 +1,15 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.ui.web_app_header;
+
+import org.chromium.ui.modelutil.PropertyKey;
+import org.chromium.ui.modelutil.PropertyModel;
+
+class WebAppHeaderLayoutViewBinder {
+
+    private WebAppHeaderLayoutViewBinder() {}
+
+    public static void bind(PropertyModel model, WebAppHeaderLayout view, PropertyKey key) {}
+}
diff --git a/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionComponent.java b/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionComponent.java
index 45dc1047..1336812 100644
--- a/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionComponent.java
+++ b/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionComponent.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.ui.android.webid;
 
 import org.chromium.blink.mojom.RpContext;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.ui.android.webid.data.Account;
 import org.chromium.chrome.browser.ui.android.webid.data.IdentityCredentialTokenError;
 import org.chromium.chrome.browser.ui.android.webid.data.IdentityProviderData;
@@ -20,6 +21,7 @@
  * This component supports accounts selection for WebID. It shows a list of
  * accounts to the user which can select one of them or dismiss it.
  */
+@NullMarked
 public interface AccountSelectionComponent {
     /**
      * This delegate is called when the AccountSelection component is interacted with (e.g.
diff --git a/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/Account.java b/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/Account.java
index 10f49d2..7d72ccb 100644
--- a/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/Account.java
+++ b/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/Account.java
@@ -9,6 +9,7 @@
 import org.jni_zero.CalledByNative;
 import org.jni_zero.JniType;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 
 /**
@@ -16,6 +17,7 @@
  * Android counterpart of IdentityRequestAccount in
  * //content/public/browser/identity_request_account.h
  */
+@NullMarked
 public class Account {
     private final String mId;
     private final String mDisplayIdentifier;
diff --git a/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/ClientIdMetadata.java b/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/ClientIdMetadata.java
index e4a7287..47cfae8 100644
--- a/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/ClientIdMetadata.java
+++ b/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/ClientIdMetadata.java
@@ -9,12 +9,14 @@
 import org.jni_zero.CalledByNative;
 import org.jni_zero.JniType;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.url.GURL;
 
 /**
  * This class holds the data used to represent client ID metadata for display
  * in the account chooser dialog.
  */
+@NullMarked
 public class ClientIdMetadata {
     private final GURL mTermsOfServiceUrl;
     private final GURL mPrivacyPolicyUrl;
diff --git a/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/IdentityCredentialTokenError.java b/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/IdentityCredentialTokenError.java
index ee5e84e..362da38 100644
--- a/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/IdentityCredentialTokenError.java
+++ b/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/IdentityCredentialTokenError.java
@@ -7,9 +7,11 @@
 import org.jni_zero.CalledByNative;
 import org.jni_zero.JniType;
 
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.url.GURL;
 
 /** Holds data used to represent an error for display in the "error" dialog. */
+@NullMarked
 public class IdentityCredentialTokenError {
     private final String mCode;
     private final GURL mUrl;
diff --git a/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/IdentityProviderData.java b/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/IdentityProviderData.java
index a3f9fc7..894de63 100644
--- a/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/IdentityProviderData.java
+++ b/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/IdentityProviderData.java
@@ -10,12 +10,14 @@
 import org.jni_zero.JniType;
 
 import org.chromium.blink.mojom.RpContext;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.content.webid.IdentityRequestDialogDisclosureField;
 
 /**
  * Holds data associated with the identity provider in FedCM dialogs. Android counterpart of
  * IdentityProviderData in //content/public/browser/identity_request_dialog_controller.h
  */
+@NullMarked
 public class IdentityProviderData {
     private final String mIdpForDisplay;
     private final IdentityProviderMetadata mIdpMetadata;
diff --git a/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/IdentityProviderMetadata.java b/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/IdentityProviderMetadata.java
index a6f6bba..21c4a09 100644
--- a/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/IdentityProviderMetadata.java
+++ b/chrome/browser/ui/android/webid/java/src/org/chromium/chrome/browser/ui/android/webid/data/IdentityProviderMetadata.java
@@ -6,18 +6,19 @@
 
 import android.graphics.Bitmap;
 
-import androidx.annotation.Nullable;
-
 import org.jni_zero.CalledByNative;
 import org.jni_zero.JniType;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.ui.util.ColorUtils;
 import org.chromium.url.GURL;
 
 /** Holds data used to represent identity provider for display in the "account chooser" dialog. */
+@NullMarked
 public class IdentityProviderMetadata {
-    private final Integer mBrandTextColor;
-    private final Integer mBrandBackgroundColor;
+    private final @Nullable Integer mBrandTextColor;
+    private final @Nullable Integer mBrandBackgroundColor;
     private final Bitmap mBrandIconBitmap;
     private final GURL mConfigUrl;
     private final GURL mLoginUrl;
diff --git a/chrome/browser/ui/autofill/payments/desktop_payments_window_manager.cc b/chrome/browser/ui/autofill/payments/desktop_payments_window_manager.cc
index 2f7b944b..a185f38 100644
--- a/chrome/browser/ui/autofill/payments/desktop_payments_window_manager.cc
+++ b/chrome/browser/ui/autofill/payments/desktop_payments_window_manager.cc
@@ -192,9 +192,10 @@
       client_->GetPaymentsAutofillClient()->ShowAutofillErrorDialog(
           AutofillErrorDialogContext::WithVirtualCardPermanentOrTemporaryError(
               /*is_permanent_error=*/false));
-    } else {
-      // TODO(crbug.com/356443046): Add handling for BNPL pop-up window not
-      // being shown.
+    } else if (bnpl_context_.has_value()) {
+      client_->GetPaymentsAutofillClient()->ShowAutofillErrorDialog(
+          AutofillErrorDialogContext::WithBnplPermanentOrTemporaryError(
+              /*is_permanent_error=*/false));
     }
   }
 }
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc
index d63eb8c..81b14e0 100644
--- a/chrome/browser/ui/browser_command_controller.cc
+++ b/chrome/browser/ui/browser_command_controller.cc
@@ -920,7 +920,7 @@
       ShowExtensions(browser_->GetBrowserForOpeningWebUi());
       break;
     case IDC_EXTENSIONS_SUBMENU_VISIT_CHROME_WEB_STORE:
-    case IDC_EXPLORE_EXTENSIONS:
+    case IDC_FIND_EXTENSIONS:
       ShowWebStore(browser_, extension_urls::kAppMenuUtmSource);
       break;
     case IDC_PERFORMANCE:
@@ -1618,7 +1618,7 @@
       /*state=*/true);
   command_updater_.UpdateCommandEnabled(
       IDC_EXTENSIONS_SUBMENU_VISIT_CHROME_WEB_STORE, /*state=*/true);
-  command_updater_.UpdateCommandEnabled(IDC_EXPLORE_EXTENSIONS,
+  command_updater_.UpdateCommandEnabled(IDC_FIND_EXTENSIONS,
                                         /*state=*/true);
 }
 
diff --git a/chrome/browser/ui/content_settings/BUILD.gn b/chrome/browser/ui/content_settings/BUILD.gn
index 494d73e..948f9f3 100644
--- a/chrome/browser/ui/content_settings/BUILD.gn
+++ b/chrome/browser/ui/content_settings/BUILD.gn
@@ -130,7 +130,7 @@
     "//chrome/browser/content_settings",
     "//chrome/browser/content_settings:content_settings_factory",
     "//chrome/browser/permissions",
-    "//chrome/browser/permissions:unit_tests",
+    "//chrome/browser/permissions:test_support",
     "//chrome/browser/ui:ui_features",
     "//chrome/browser/web_applications:web_applications_test_support",
     "//chrome/test:test_support",
diff --git a/chrome/browser/ui/exclusive_access/exclusive_access_permission_manager.cc b/chrome/browser/ui/exclusive_access/exclusive_access_permission_manager.cc
index 4fe61fa..7040c1f 100644
--- a/chrome/browser/ui/exclusive_access/exclusive_access_permission_manager.cc
+++ b/chrome/browser/ui/exclusive_access/exclusive_access_permission_manager.cc
@@ -10,6 +10,7 @@
 #include "content/public/browser/global_routing_id.h"
 #include "content/public/browser/media_session.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "third_party/blink/public/common/permissions/permission_utils.h"
@@ -111,7 +112,9 @@
   requests.waiting_responses += requests.pending.size();
   for (PermissionRequest& request : requests.pending) {
     content::PermissionRequestDescription description(
-        request.type, web_contents->HasRecentInteraction());
+        content::PermissionDescriptorUtil::
+            CreatePermissionDescriptorForPermissionType(request.type),
+        web_contents->HasRecentInteraction());
     GetPermissionController(web_contents.get())
         ->RequestPermissionsFromCurrentDocument(
             rfh, std::move(description),
diff --git a/chrome/browser/ui/exclusive_access/exclusive_access_permission_manager_unittest.cc b/chrome/browser/ui/exclusive_access/exclusive_access_permission_manager_unittest.cc
index 4e5f796a..d1b4857 100644
--- a/chrome/browser/ui/exclusive_access/exclusive_access_permission_manager_unittest.cc
+++ b/chrome/browser/ui/exclusive_access/exclusive_access_permission_manager_unittest.cc
@@ -9,7 +9,6 @@
 #include "base/time/time.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "content/public/browser/permission_controller.h"
-#include "content/public/browser/permission_request_description.h"
 #include "content/public/browser/permission_result.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
@@ -64,7 +63,8 @@
                 base::OnceCallback<void(
                     const std::vector<blink::mojom::PermissionStatus>&)>
                     callback) {
-              switch (description.permissions.at(0)) {
+              switch (blink::PermissionDescriptorToPermissionType(
+                  description.permissions.at(0))) {
                 case blink::PermissionType::POINTER_LOCK:
                   if (pointer_lock_response) {
                     std::move(callback).Run({*pointer_lock_response});
diff --git a/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper.cc b/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper.cc
index 4f7e318..9830c6e 100644
--- a/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper.cc
+++ b/chrome/browser/ui/privacy_sandbox/privacy_sandbox_prompt_helper.cc
@@ -281,7 +281,6 @@
   bool eligible = GetRequiredPromptType(profile) !=
                   PrivacySandboxService::PromptType::kNone;
 
-#if !BUILDFLAG(IS_ANDROID)
   if (auto* privacy_sandbox_service =
           PrivacySandboxServiceFactory::GetForProfile(profile)) {
     privacy_sandbox::PrivacySandboxQueueManager& queue_manager =
@@ -294,7 +293,6 @@
     eligible ? queue_manager.MaybeQueueNotice()
              : queue_manager.MaybeUnqueueNotice();
   }
-#endif  // !BUILDFLAG(IS_ANDROID)
 
   return eligible;
 }
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/tab_group_sync_service_proxy.cc b/chrome/browser/ui/tabs/saved_tab_groups/tab_group_sync_service_proxy.cc
index bc7a0c8..3628c82 100644
--- a/chrome/browser/ui/tabs/saved_tab_groups/tab_group_sync_service_proxy.cc
+++ b/chrome/browser/ui/tabs/saved_tab_groups/tab_group_sync_service_proxy.cc
@@ -329,6 +329,11 @@
   NOTIMPLEMENTED();
 }
 
+void TabGroupSyncServiceProxy::UpdateArchivalStatus(const base::Uuid& sync_id,
+                                                    bool success) {
+  NOTIMPLEMENTED();
+}
+
 TabGroupSyncMetricsLogger*
 TabGroupSyncServiceProxy::GetTabGroupSyncMetricsLogger() {
   return service_->GetTabGroupSyncMetricsLogger();
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/tab_group_sync_service_proxy.h b/chrome/browser/ui/tabs/saved_tab_groups/tab_group_sync_service_proxy.h
index bf80c6d..f10d9fb 100644
--- a/chrome/browser/ui/tabs/saved_tab_groups/tab_group_sync_service_proxy.h
+++ b/chrome/browser/ui/tabs/saved_tab_groups/tab_group_sync_service_proxy.h
@@ -117,6 +117,8 @@
       const std::optional<std::string>& cache_guid) const override;
   bool WasTabGroupClosedLocally(const base::Uuid& sync_id) const override;
   void RecordTabGroupEvent(const EventDetails& event_details) override;
+  void UpdateArchivalStatus(const base::Uuid& sync_id,
+                            bool archival_status) override;
   TabGroupSyncMetricsLogger* GetTabGroupSyncMetricsLogger() override;
   base::WeakPtr<syncer::DataTypeControllerDelegate>
   GetSavedTabGroupControllerDelegate() override;
diff --git a/chrome/browser/ui/toolbar/app_menu_model.cc b/chrome/browser/ui/toolbar/app_menu_model.cc
index a1ab38f..3ed27d78 100644
--- a/chrome/browser/ui/toolbar/app_menu_model.cc
+++ b/chrome/browser/ui/toolbar/app_menu_model.cc
@@ -1205,12 +1205,12 @@
       }
       LogMenuAction(MENU_ACTION_VISIT_CHROME_WEB_STORE);
       break;
-    case IDC_EXPLORE_EXTENSIONS:
+    case IDC_FIND_EXTENSIONS:
       if (!uma_action_recorded_) {
-        base::UmaHistogramMediumTimes(
-            "WrenchMenu.TimeToAction.ExploreExtensions", delta);
+        base::UmaHistogramMediumTimes("WrenchMenu.TimeToAction.FindExtensions",
+                                      delta);
       }
-      LogMenuAction(MENU_ACTION_EXPLORE_EXTENSIONS);
+      LogMenuAction(MENU_ACTION_FIND_EXTENSIONS);
       break;
     // Recent tabs menu.
     case IDC_RESTORE_TAB:
@@ -1913,10 +1913,10 @@
   // Extensions sub menu.
   if (base::FeatureList::IsEnabled(features::kExtensionsCollapseMainMenu) &&
       !extensions::ui_util::HasManageableExtensions(browser_->profile())) {
-    AddItemWithStringIdAndVectorIcon(this, IDC_EXPLORE_EXTENSIONS,
-                                     IDS_EXPLORE_EXTENSIONS,
+    AddItemWithStringIdAndVectorIcon(this, IDC_FIND_EXTENSIONS,
+                                     IDS_FIND_EXTENSIONS,
                                      vector_icons::kExtensionChromeRefreshIcon);
-    SetElementIdentifierAt(GetIndexOfCommandId(IDC_EXPLORE_EXTENSIONS).value(),
+    SetElementIdentifierAt(GetIndexOfCommandId(IDC_FIND_EXTENSIONS).value(),
                            ExtensionsMenuModel::kVisitChromeWebStoreMenuItem);
   } else {
     sub_menus_.push_back(std::make_unique<ExtensionsMenuModel>(this, browser_));
diff --git a/chrome/browser/ui/toolbar/app_menu_model.h b/chrome/browser/ui/toolbar/app_menu_model.h
index 63bf3cc2..ec1f1a1 100644
--- a/chrome/browser/ui/toolbar/app_menu_model.h
+++ b/chrome/browser/ui/toolbar/app_menu_model.h
@@ -114,7 +114,7 @@
   MENU_ACTION_SHOW_CUSTOMIZE_CHROME_SIDE_PANEL = 92,
   MENU_ACTION_DECLUTTER_TABS = 93,
   MENU_ACTION_OPEN_GLIC = 94,
-  MENU_ACTION_EXPLORE_EXTENSIONS = 95,
+  MENU_ACTION_FIND_EXTENSIONS = 95,
   LIMIT_MENU_ACTION
 };
 // LINT.ThenChange(/tools/metrics/histograms/metadata/ui/enums.xml:WrenchMenuAction)
diff --git a/chrome/browser/ui/toolbar/app_menu_model_interactive_uitest.cc b/chrome/browser/ui/toolbar/app_menu_model_interactive_uitest.cc
index acc65441..5fcef2c 100644
--- a/chrome/browser/ui/toolbar/app_menu_model_interactive_uitest.cc
+++ b/chrome/browser/ui/toolbar/app_menu_model_interactive_uitest.cc
@@ -284,13 +284,13 @@
   histograms_.ExpectTotalCount("WrenchMenu.TimeToAction.ManageExtensions", 1);
   histograms_.ExpectTotalCount("WrenchMenu.TimeToAction.VisitChromeWebStore",
                                0);
-  histograms_.ExpectTotalCount("WrenchMenu.TimeToAction.ExploreExtensions", 0);
+  histograms_.ExpectTotalCount("WrenchMenu.TimeToAction.FindExtensions", 0);
   histograms_.ExpectBucketCount("WrenchMenu.MenuAction",
                                 MENU_ACTION_MANAGE_EXTENSIONS, 1);
   histograms_.ExpectBucketCount("WrenchMenu.MenuAction",
                                 MENU_ACTION_VISIT_CHROME_WEB_STORE, 0);
   histograms_.ExpectBucketCount("WrenchMenu.MenuAction",
-                                MENU_ACTION_EXPLORE_EXTENSIONS, 0);
+                                MENU_ACTION_FIND_EXTENSIONS, 0);
 }
 
 // Test to confirm that the visit Chrome Web Store menu item navigates to the
@@ -315,15 +315,14 @@
 
   histograms_.ExpectTotalCount("WrenchMenu.TimeToAction.VisitChromeWebStore",
                                collapse ? 0 : 1);
-  histograms_.ExpectTotalCount("WrenchMenu.TimeToAction.ExploreExtensions",
+  histograms_.ExpectTotalCount("WrenchMenu.TimeToAction.FindExtensions",
                                collapse ? 1 : 0);
   histograms_.ExpectTotalCount("WrenchMenu.TimeToAction.ManageExtensions", 0);
   histograms_.ExpectBucketCount("WrenchMenu.MenuAction",
                                 MENU_ACTION_VISIT_CHROME_WEB_STORE,
                                 collapse ? 0 : 1);
   histograms_.ExpectBucketCount("WrenchMenu.MenuAction",
-                                MENU_ACTION_EXPLORE_EXTENSIONS,
-                                collapse ? 1 : 0);
+                                MENU_ACTION_FIND_EXTENSIONS, collapse ? 1 : 0);
   histograms_.ExpectBucketCount("WrenchMenu.MenuAction",
                                 MENU_ACTION_MANAGE_EXTENSIONS, 0);
 }
diff --git a/chrome/browser/ui/toolbar/app_menu_model_unittest.cc b/chrome/browser/ui/toolbar/app_menu_model_unittest.cc
index 64aaa46..d9dc55e8f 100644
--- a/chrome/browser/ui/toolbar/app_menu_model_unittest.cc
+++ b/chrome/browser/ui/toolbar/app_menu_model_unittest.cc
@@ -441,7 +441,7 @@
   model.Init();
 
   if (GetParam()) {
-    const auto index = model.GetIndexOfCommandId(IDC_EXPLORE_EXTENSIONS);
+    const auto index = model.GetIndexOfCommandId(IDC_FIND_EXTENSIONS);
     ASSERT_TRUE(index.has_value());
     EXPECT_EQ(nullptr, model.GetSubmenuModelAt(*index));
   } else {
diff --git a/chrome/browser/ui/views/apps/app_window_frame_view_win.cc b/chrome/browser/ui/views/apps/app_window_frame_view_win.cc
index ce4fd993..4dcd3e6a 100644
--- a/chrome/browser/ui/views/apps/app_window_frame_view_win.cc
+++ b/chrome/browser/ui/views/apps/app_window_frame_view_win.cc
@@ -30,8 +30,8 @@
 
 gfx::Insets AppWindowFrameViewWin::GetFrameInsets() const {
   int caption_height =
-      display::win::ScreenWin::GetSystemMetricsInDIP(SM_CYSIZEFRAME) +
-      display::win::ScreenWin::GetSystemMetricsInDIP(SM_CYCAPTION);
+      display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CYSIZEFRAME) +
+      display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CYCAPTION);
 
   return gfx::Insets::TLBR(caption_height, 0, 0, 0);
 }
@@ -89,7 +89,7 @@
   // Don't allow overlapping resize handles when the window is maximized or
   // fullscreen, as it can't be resized in those states.
   int resize_border =
-      display::win::ScreenWin::GetSystemMetricsInDIP(SM_CXSIZEFRAME);
+      display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CXSIZEFRAME);
   int frame_component = GetHTComponentForFrame(
       point, gfx::Insets(resize_border), kResizeAreaCornerSize - resize_border,
       kResizeAreaCornerSize - resize_border, can_ever_resize);
diff --git a/chrome/browser/ui/views/autofill/autofill_ai/save_or_update_autofill_ai_data_bubble_view.cc b/chrome/browser/ui/views/autofill/autofill_ai/save_or_update_autofill_ai_data_bubble_view.cc
index bbb9422..6fc59ceb 100644
--- a/chrome/browser/ui/views/autofill/autofill_ai/save_or_update_autofill_ai_data_bubble_view.cc
+++ b/chrome/browser/ui/views/autofill/autofill_ai/save_or_update_autofill_ai_data_bubble_view.cc
@@ -37,18 +37,11 @@
 
 namespace {
 
-// The padding between the header (image and title) and the elements around it.
-constexpr int kHeaderPadding = 20;
 constexpr int kBubbleWidth = 320;
 constexpr int kNewOrUpdatedAttributeDotSize = 4;
 constexpr int kNewOrUpdatedAttributeDotRightSpacing = 4;
 constexpr int kNewOrUpdatedAttributeDotTopSpacing = 8;
-
-int GetVerticaSpaceBetweenDialogSections() {
-  return ChromeLayoutProvider::Get()->GetDistanceMetric(
-             views::DISTANCE_CONTROL_LIST_VERTICAL) *
-         2;
-}
+constexpr int kSubTitleBottomMargin = 16;
 
 gfx::Insets GetBubbleInnerMargins() {
   return ChromeLayoutProvider::Get()->GetDialogInsetsForContentType(
@@ -120,17 +113,21 @@
       views::BoxLayout::Orientation::kVertical));
   set_margins(GetBubbleInnerMargins());
   SetAccessibleTitle(controller_->GetDialogTitle());
+  SetTitle(controller_->GetDialogTitle());
 
-  auto* main_content_wrapper = AddChildView(
-      views::Builder<views::BoxLayoutView>()
-          .SetOrientation(views::BoxLayout::Orientation::kVertical)
-          .SetBetweenChildSpacing(GetVerticaSpaceBetweenDialogSections())
-          .SetCrossAxisAlignment(views::LayoutAlignment::kStart)
-          .Build());
-
-  const bool is_save_prompt = controller_->IsSavePrompt();
-  if (is_save_prompt) {
-    main_content_wrapper->AddChildView(
+  auto* main_content_wrapper =
+      AddChildView(views::Builder<views::BoxLayoutView>()
+                       .SetOrientation(views::BoxLayout::Orientation::kVertical)
+                       .SetCrossAxisAlignment(views::LayoutAlignment::kStart)
+                       .Build());
+  if (controller_->IsSavePrompt()) {
+    auto subtititle_container =
+        views::Builder<views::BoxLayoutView>()
+            .SetOrientation(views::BoxLayout::Orientation::kVertical)
+            .SetInsideBorderInsets(
+                gfx::Insets::TLBR(0, 0, kSubTitleBottomMargin, 0))
+            .Build();
+    subtititle_container->AddChildView(
         views::Builder<views::Label>()
             .SetText(l10n_util::GetStringUTF16(
                 IDS_AUTOFILL_AI_SAVE_ENTITY_DIALOG_SUBTITLE))
@@ -139,6 +136,7 @@
             .SetMultiLine(true)
             .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT)
             .Build());
+    main_content_wrapper->AddChildView(std::move(subtititle_container));
   }
 
   auto* attributes_wrapper = main_content_wrapper->AddChildView(
@@ -146,7 +144,7 @@
           .SetOrientation(views::BoxLayout::Orientation::kVertical)
           .SetBetweenChildSpacing(
               ChromeLayoutProvider::Get()->GetDistanceMetric(
-                  views::DISTANCE_CONTROL_LIST_VERTICAL))
+                  DISTANCE_CONTENT_LIST_VERTICAL_SINGLE))
           .SetCrossAxisAlignment(views::LayoutAlignment::kStart)
           .SetAccessibleRole(ax::mojom::Role::kDescriptionList)
           .Build());
@@ -305,36 +303,15 @@
 }
 
 void SaveOrUpdateAutofillAiDataBubbleView::AddedToWidget() {
-  auto header_container =
-      views::Builder<views::BoxLayoutView>()
-          .SetOrientation(views::BoxLayout::Orientation::kVertical)
-          .SetBetweenChildSpacing(GetVerticaSpaceBetweenDialogSections())
-          // The bottom padding has to be subtracted by the distance between the
-          // information that will be saved, so to avoid double padding.
-          .SetInsideBorderInsets(gfx::Insets::TLBR(
-              kHeaderPadding, kHeaderPadding,
-              std::min(0, kHeaderPadding -
-                              ChromeLayoutProvider::Get()->GetDistanceMetric(
-                                  views::DISTANCE_CONTROL_LIST_VERTICAL)),
-              kHeaderPadding))
-          .Build();
   if (controller_->IsSavePrompt()) {
     std::pair<int, int> images = controller_->GetTitleImagesResourceId();
-    header_container->AddChildView(
+    GetBubbleFrameView()->SetHeaderView(
         std::make_unique<ThemeTrackingNonAccessibleImageView>(
             ui::ImageModel::FromResourceId(images.first),
             ui::ImageModel::FromResourceId(images.second),
             base::BindRepeating(&views::BubbleDialogDelegate::background_color,
                                 base::Unretained(this))));
   }
-  header_container->AddChildView(
-      views::Builder<views::Label>()
-          .SetText(controller_->GetDialogTitle())
-          .SetTextStyle(views::style::STYLE_HEADLINE_4)
-          .SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT)
-          .SetAccessibleRole(ax::mojom::Role::kHeading)
-          .Build());
-  GetBubbleFrameView()->SetHeaderView(std::move(header_container));
 }
 
 void SaveOrUpdateAutofillAiDataBubbleView::WindowClosing() {
diff --git a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.cc b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.cc
index 7a7f434..44fbb2e 100644
--- a/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.cc
+++ b/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.cc
@@ -376,7 +376,7 @@
     // The glass should extend to the bottom of the tabstrip.
     gfx::Rect tabstrip_region_bounds(browser_frame_->GetBoundsForTabStripRegion(
         browser_view_->tab_strip_region_view()->GetMinimumSize()));
-    tabstrip_region_bounds = display::win::ScreenWin::DIPToClientRect(
+    tabstrip_region_bounds = display::win::GetScreenWin()->DIPToClientRect(
         GetHWND(), tabstrip_region_bounds);
 
     *insets = gfx::Insets::TLBR(tabstrip_region_bounds.bottom(), 0, 0, 0);
diff --git a/chrome/browser/ui/views/frame/browser_frame_view_win.cc b/chrome/browser/ui/views/frame/browser_frame_view_win.cc
index 71a4409..cc133de 100644
--- a/chrome/browser/ui/views/frame/browser_frame_view_win.cc
+++ b/chrome/browser/ui/views/frame/browser_frame_view_win.cc
@@ -152,7 +152,7 @@
 
 gfx::Rect BrowserFrameViewWin::GetBoundsForWebAppFrameToolbar(
     const gfx::Size& toolbar_preferred_size) const {
-  int x = display::win::ScreenWin::GetSystemMetricsInDIP(SM_CXSIZEFRAME);
+  int x = display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CXSIZEFRAME);
   if (IsMaximized()) {
     x += kMaximizedLeftMargin;
   }
@@ -240,12 +240,12 @@
   min_size.Enlarge(0, GetTopInset(false));
 
   gfx::Size titlebar_min_size(
-      display::win::ScreenWin::GetSystemMetricsInDIP(SM_CXSIZEFRAME) +
+      display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CXSIZEFRAME) +
           CaptionButtonsRegionWidth(),
       TitlebarHeight(false));
   if (ShouldShowWindowIcon(TitlebarType::kAny)) {
     titlebar_min_size.Enlarge(
-        display::win::ScreenWin::GetSystemMetricsInDIP(SM_CXSMICON) +
+        display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CXSMICON) +
             kIconTitleSpacing,
         0);
   }
@@ -336,9 +336,9 @@
   // first so that clicks in a tab don't get treated as sysmenu clicks.
   if (frame_component != HTCLIENT && ShouldShowWindowIcon(TitlebarType::kAny)) {
     gfx::Rect sys_menu_region(
-        0, display::win::ScreenWin::GetSystemMetricsInDIP(SM_CYSIZEFRAME),
-        display::win::ScreenWin::GetSystemMetricsInDIP(SM_CXSMICON),
-        display::win::ScreenWin::GetSystemMetricsInDIP(SM_CYSMICON));
+        0, display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CYSIZEFRAME),
+        display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CXSMICON),
+        display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CYSMICON));
     if (sys_menu_region.Contains(point)) {
       return HTSYSMENU;
     }
@@ -486,7 +486,8 @@
 int BrowserFrameViewWin::FrameBorderThickness() const {
   return (IsMaximized() || frame()->IsFullscreen())
              ? 0
-             : display::win::ScreenWin::GetSystemMetricsInDIP(SM_CXSIZEFRAME);
+             : display::win::GetScreenWin()->GetSystemMetricsInDIP(
+                   SM_CXSIZEFRAME);
 }
 
 int BrowserFrameViewWin::FrameTopBorderThickness(bool restored) const {
@@ -517,7 +518,7 @@
   // to fail when it ought to succeed.
   return std::floor(
       FrameTopBorderThicknessPx(restored) /
-      display::win::ScreenWin::GetScaleFactorForHWND(HWNDForView(this)));
+      display::win::GetScreenWin()->GetScaleFactorForHWND(HWNDForView(this)));
 }
 
 int BrowserFrameViewWin::FrameTopBorderThicknessPx(bool restored) const {
@@ -563,7 +564,7 @@
 
 int BrowserFrameViewWin::TitlebarMaximizedVisualHeight() const {
   int maximized_height =
-      display::win::ScreenWin::GetSystemMetricsInDIP(SM_CYCAPTION);
+      display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CYCAPTION);
   // Adding 2 dip of vertical padding puts at least 1 dip of space on the top
   // and bottom of the element.
   constexpr int kVerticalPadding = 2;
@@ -767,14 +768,14 @@
   }
 
   const int icon_size =
-      display::win::ScreenWin::GetSystemMetricsInDIP(SM_CYSMICON);
+      display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CYSMICON);
   const int titlebar_visual_height =
       IsMaximized() ? TitlebarMaximizedVisualHeight() : TitlebarHeight(false);
   // Don't include the area above the screen when maximized. However it only
   // looks centered if we start from y=0 when restored.
   const int window_top = IsMaximized() ? WindowTopY() : 0;
   int next_leading_x =
-      display::win::ScreenWin::GetSystemMetricsInDIP(SM_CXSIZEFRAME);
+      display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CXSIZEFRAME);
   if (IsMaximized()) {
     next_leading_x += kMaximizedLeftMargin;
   }
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc
index 38939aea..a36cbc59e 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc
@@ -306,7 +306,7 @@
   if (event->type() == ui::EventType::kGestureLongTap &&
       NonClientHitTest(event_loc) == HTCAPTION) {
     views::View::ConvertPointToScreen(this, &event_loc);
-    event_loc = display::win::ScreenWin::DIPToScreenPoint(event_loc);
+    event_loc = display::win::GetScreenWin()->DIPToScreenPoint(event_loc);
     views::ShowSystemMenuAtScreenPixelLocation(views::HWNDForView(this),
                                                event_loc);
     event->SetHandled();
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 9bdf938..c736c55 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -980,13 +980,11 @@
 // show_after_ and blocked_by_ lists passed to QueueRequiredNotice() calls to
 // the product_messaging_controller. These calls usually live within individual
 // services. Queue is kicked off a frame or two later.
-#if !BUILDFLAG(IS_ANDROID)
   if (auto* privacy_sandbox_service =
           PrivacySandboxServiceFactory::GetForProfile(browser_->profile())) {
     privacy_sandbox_service->GetPrivacySandboxNoticeQueueManager()
         .MaybeQueueNotice();
   }
-#endif  // !BUILDFLAG(IS_ANDROID)
 
   browser_->tab_strip_model()->AddObserver(this);
   immersive_mode_controller_ = chrome::CreateImmersiveModeController(this);
diff --git a/chrome/browser/ui/views/frame/minimize_button_metrics_win.cc b/chrome/browser/ui/views/frame/minimize_button_metrics_win.cc
index 47965e8..7e5d91a 100644
--- a/chrome/browser/ui/views/frame/minimize_button_metrics_win.cc
+++ b/chrome/browser/ui/views/frame/minimize_button_metrics_win.cc
@@ -135,7 +135,8 @@
   // convert the minimize button corner offset to DIP before returning it.
   MapWindowPoints(HWND_DESKTOP, hwnd_, &minimize_button_corner, 1);
   gfx::Point pixel_point = {minimize_button_corner.x, 0};
-  gfx::Point dip_point = ScreenWin::ClientToDIPPoint(hwnd_, pixel_point);
+  gfx::Point dip_point =
+      display::win::GetScreenWin()->ClientToDIPPoint(hwnd_, pixel_point);
   return dip_point.x();
 }
 
diff --git a/chrome/browser/ui/views/frame/multi_contents_view.cc b/chrome/browser/ui/views/frame/multi_contents_view.cc
index 9bec5a3..afe100d 100644
--- a/chrome/browser/ui/views/frame/multi_contents_view.cc
+++ b/chrome/browser/ui/views/frame/multi_contents_view.cc
@@ -39,16 +39,20 @@
     WebContentsPressedCallback inactive_view_pressed_callback)
     : browser_view_(browser_view),
       inactive_view_pressed_callback_(inactive_view_pressed_callback) {
-  contents_views_.push_back(AddChildView(
-      std::make_unique<ContentsWebView>(browser_view_->GetProfile())));
-  contents_views_[0]->set_is_primary_web_contents_for_window(true);
+  contents_container_views_.push_back(
+      AddChildView(std::make_unique<ContentsContainerView>(
+          std::make_unique<ContentsWebView>(browser_view_->GetProfile()))));
+  contents_container_views_[0]
+      ->GetContentsView()
+      ->set_is_primary_web_contents_for_window(true);
 
   resize_area_ = AddChildView(std::make_unique<MultiContentsResizeArea>(this));
   resize_area_->SetVisible(false);
 
-  contents_views_.push_back(AddChildView(
-      std::make_unique<ContentsWebView>(browser_view_->GetProfile())));
-  contents_views_[1]->SetVisible(false);
+  contents_container_views_.push_back(
+      AddChildView(std::make_unique<ContentsContainerView>(
+          std::make_unique<ContentsWebView>(browser_view_->GetProfile()))));
+  contents_container_views_[1]->SetVisible(false);
 
   SetProperty(views::kElementIdentifierKey, kMultiContentsViewElementId);
   SetLayoutManager(std::make_unique<views::FlexLayout>())
@@ -58,12 +62,12 @@
 MultiContentsView::~MultiContentsView() = default;
 
 ContentsWebView* MultiContentsView::GetActiveContentsView() {
-  return contents_views_[active_index_];
+  return contents_container_views_[active_index_]->GetContentsView();
 }
 
 ContentsWebView* MultiContentsView::GetInactiveContentsView() {
   int inactive_index = active_index_ == 0 ? 1 : 0;
-  return contents_views_[inactive_index];
+  return contents_container_views_[inactive_index]->GetContentsView();
 }
 
 bool MultiContentsView::IsInSplitView() {
@@ -75,10 +79,11 @@
     int index) {
   CHECK(web_contents);
   CHECK(index >= 0 && index < 2);
-  contents_views_[index]->SetWebContents(web_contents);
+  contents_container_views_[index]->GetContentsView()->SetWebContents(
+      web_contents);
 
-  if (index == 1 && !contents_views_[1]->GetVisible()) {
-    contents_views_[1]->SetVisible(true);
+  if (index == 1 && !contents_container_views_[1]->GetVisible()) {
+    contents_container_views_[1]->SetVisible(true);
     resize_area_->SetVisible(true);
   }
 }
@@ -88,14 +93,14 @@
     return;
   }
   if (active_index_ == 1) {
-    // Move the active WebContents so that the first ContentsWebView in
-    // contents_views_ can always be visible.
-    std::iter_swap(contents_views_.begin(),
-                   contents_views_.begin() + active_index_);
+    // Move the active WebContents so that the first ContentsContainerView in
+    // contents_container_views_ can always be visible.
+    std::iter_swap(contents_container_views_.begin(),
+                   contents_container_views_.begin() + active_index_);
     active_index_ = 0;
   }
-  contents_views_[1]->SetWebContents(nullptr);
-  contents_views_[1]->SetVisible(false);
+  contents_container_views_[1]->GetContentsView()->SetWebContents(nullptr);
+  contents_container_views_[1]->SetVisible(false);
   resize_area_->SetVisible(false);
 }
 
@@ -104,7 +109,7 @@
   // number of contents views.
   CHECK(index >= 0 && index < 2);
   // We will only activate a visible contents view.
-  CHECK(contents_views_[index]->GetVisible());
+  CHECK(contents_container_views_[index]->GetVisible());
   active_index_ = index;
   GetActiveContentsView()->set_is_primary_web_contents_for_window(true);
   GetInactiveContentsView()->set_is_primary_web_contents_for_window(false);
@@ -133,9 +138,9 @@
 
 void MultiContentsView::ExecuteOnEachVisibleContentsView(
     base::RepeatingCallback<void(ContentsWebView*)> callback) {
-  for (auto* contents_view : contents_views_) {
-    if (contents_view->GetVisible()) {
-      callback.Run(contents_view);
+  for (auto* contents_container_view : contents_container_views_) {
+    if (contents_container_view->GetVisible()) {
+      callback.Run(contents_container_view->GetContentsView());
     }
   }
 }
@@ -143,10 +148,10 @@
 void MultiContentsView::OnResize(int resize_amount, bool done_resizing) {
   if (!initial_start_width_on_resize_.has_value()) {
     initial_start_width_on_resize_ =
-        std::make_optional(contents_views_[0]->size().width());
+        std::make_optional(contents_container_views_[0]->size().width());
   }
-  double total_width =
-      contents_views_[0]->size().width() + contents_views_[1]->size().width();
+  double total_width = contents_container_views_[0]->size().width() +
+                       contents_container_views_[1]->size().width();
   start_ratio_ =
       (initial_start_width_on_resize_.value() + resize_amount) / total_width;
   if (done_resizing) {
@@ -173,17 +178,23 @@
     end_rect.Inset(gfx::Insets(kSplitViewContentInset).set_left(0));
     corner_radius = kContentCornerRadius;
   }
-  for (auto* contents_view : contents_views_) {
-    contents_view->layer()->SetRoundedCornerRadius(
+  for (auto* contents_container_view : contents_container_views_) {
+    contents_container_view->GetContentsView()->layer()->SetRoundedCornerRadius(
         gfx::RoundedCornersF{corner_radius});
   }
-  contents_views_[0]->SetBoundsRect(start_rect);
+  contents_container_views_[0]->SetBoundsRect(start_rect);
   resize_area_->SetBoundsRect(resize_rect);
-  contents_views_[1]->SetBoundsRect(end_rect);
+  contents_container_views_[1]->SetBoundsRect(end_rect);
 }
 
 void MultiContentsView::OnPaint(gfx::Canvas* canvas) {
   if (!IsInSplitView()) {
+    if (contents_container_views_[0]->GetBorder()) {
+      contents_container_views_[0]->SetBorder(nullptr);
+    }
+    if (contents_container_views_[1]->GetBorder()) {
+      contents_container_views_[1]->SetBorder(nullptr);
+    }
     return;
   }
 
@@ -191,42 +202,46 @@
   TopContainerBackground::PaintBackground(canvas, this, browser_view_);
 
   // Draw active/inactive outlines around the contents areas.
-  const auto draw_contents_outline = [this, canvas](views::View* content_view) {
-    const bool is_active = content_view == GetActiveContentsView();
-    cc::PaintFlags flags;
-    flags.setStyle(cc::PaintFlags::kStroke_Style);
-    flags.setStrokeWidth(kContentOutlineThickness);
+  const auto set_contents_border = [this](ContentsContainerView*
+                                              contents_container_view) {
+    const bool is_active =
+        contents_container_view->GetContentsView() == GetActiveContentsView();
     const SkColor color =
         is_active ? GetColorProvider()->GetColor(
                         kColorMulitContentsViewActiveContentOutline)
                   : GetColorProvider()->GetColor(
                         kColorMulitContentsViewInactiveContentOutline);
-    flags.setColor(color);
-    flags.setAntiAlias(true);
-    gfx::RectF main_content_border_rect = gfx::RectF(content_view->bounds());
-    const float outset =
-        kSplitViewContentPadding + (kContentOutlineThickness / 2.0f);
-    main_content_border_rect.Outset(outset);
-    canvas->DrawRoundRect(main_content_border_rect, kContentOutlineCornerRadius,
-                          flags);
+    contents_container_view->SetBorder(views::CreatePaddedBorder(
+        views::CreateRoundedRectBorder(kContentOutlineThickness,
+                                       kContentOutlineCornerRadius, color),
+        gfx::Insets(kSplitViewContentPadding)));
   };
-  for (auto* contents_view : contents_views_) {
-    draw_contents_outline(contents_view);
+  for (auto* contents_container_view : contents_container_views_) {
+    set_contents_border(contents_container_view);
   }
 }
 
+MultiContentsView::ContentsContainerView::ContentsContainerView(
+    std::unique_ptr<ContentsWebView> contents_view) {
+  SetUseDefaultFillLayout(true);
+  contents_view_ = AddChildView(std::move(contents_view));
+}
+BEGIN_METADATA(MultiContentsView, ContentsContainerView)
+END_METADATA
+
 MultiContentsView::ViewWidths MultiContentsView::GetViewWidths(
     gfx::Rect available_space) {
   ViewWidths widths;
   if (IsInSplitView()) {
-    CHECK(contents_views_[0]->GetVisible() && contents_views_[1]->GetVisible());
+    CHECK(contents_container_views_[0]->GetVisible() &&
+          contents_container_views_[1]->GetVisible());
     widths.resize_width = resize_area_->GetPreferredSize().width();
     widths.start_width =
         start_ratio_ * (available_space.width() - widths.resize_width);
     widths.end_width =
         available_space.width() - widths.start_width - widths.resize_width;
   } else {
-    CHECK(!contents_views_[1]->GetVisible());
+    CHECK(!contents_container_views_[1]->GetVisible());
     widths.start_width = available_space.width();
   }
   return ClampToMinWidth(widths);
diff --git a/chrome/browser/ui/views/frame/multi_contents_view.h b/chrome/browser/ui/views/frame/multi_contents_view.h
index fc4cf02..7fa6e46 100644
--- a/chrome/browser/ui/views/frame/multi_contents_view.h
+++ b/chrome/browser/ui/views/frame/multi_contents_view.h
@@ -61,14 +61,14 @@
   // Returns true if more than one WebContents is displayed.
   bool IsInSplitView();
 
-  // Assigns the given |web_contents| to the ContentsWebView at |index| in
-  // contents_views_. |index| must be either 0 or 1 as we currently only support
-  // two contents. If |index| is 1 and we are not currently in a split
-  // view, displays the split views.
+  // Assigns the given |web_contents| to the ContentsContainerView's
+  // ContentsWebView at |index| in contents_container_views_. |index| must be
+  // either 0 or 1 as we currently only support two contents. If |index| is 1
+  // and we are not currently in a split view, displays the split views.
   void SetWebContentsAtIndex(content::WebContents* web_contents, int index);
 
-  // Preserves the active WebContents and hides the second ContentsWebView and
-  // resize handle.
+  // Preserves the active WebContents and hides the second ContentsContainerView
+  // and resize handle.
   void CloseSplitView();
 
   // Sets the index of the active contents view within contents_views_.
@@ -90,7 +90,7 @@
   void OnPaint(gfx::Canvas* canvas) override;
 
   ContentsWebView* start_contents_view_for_testing() const {
-    return contents_views_[0];
+    return contents_container_views_[0]->GetContentsView();
   }
 
   MultiContentsResizeArea* resize_area_for_testing() const {
@@ -98,19 +98,36 @@
   }
 
   ContentsWebView* end_contents_view_for_testing() const {
-    return contents_views_[1];
+    return contents_container_views_[1]->GetContentsView();
   }
 
  private:
+  // ContentsContainerView holds the ContentsWebView and the outlines and
+  // minitoolbar when in split view.
+  class ContentsContainerView : public views::View {
+    METADATA_HEADER(ContentsContainerView, views::View)
+   public:
+    explicit ContentsContainerView(
+        std::unique_ptr<ContentsWebView> contents_view);
+    ContentsContainerView(ContentsContainerView&) = delete;
+    ContentsContainerView& operator=(const ContentsContainerView&) = delete;
+    ~ContentsContainerView() override = default;
+
+    ContentsWebView* GetContentsView() { return contents_view_; }
+
+   private:
+    raw_ptr<ContentsWebView> contents_view_;
+  };
+
   ViewWidths GetViewWidths(gfx::Rect available_space);
 
   ViewWidths ClampToMinWidth(ViewWidths widths);
 
   raw_ptr<BrowserView> browser_view_;
 
-  // Holds ContentsWebViews, when not in a split view the second ContentsWebView
-  // is not visible.
-  std::vector<ContentsWebView*> contents_views_;
+  // Holds ContentsContainerViews, when not in a split view the second
+  // ContentsContainerView is not visible.
+  std::vector<ContentsContainerView*> contents_container_views_;
 
   // The handle responsible for resizing the two contents views as relative to
   // each other.
@@ -123,7 +140,7 @@
   // the inactive contents view.
   WebContentsPressedCallback inactive_view_pressed_callback_;
 
-  // Current ratio of |contents_views_|'s first ContentsWebView's width /
+  // Current ratio of |contents_views_|'s first ContentsContainerView's width /
   // overall contents view width.
   double start_ratio_ = 0.5;
 
diff --git a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
index e702c68..5188551f 100644
--- a/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
+++ b/chrome/browser/ui/views/frame/opaque_browser_frame_view.cc
@@ -480,7 +480,7 @@
 #if BUILDFLAG(IS_WIN)
   // This metric scales up if either the titlebar height or the titlebar font
   // size are increased.
-  return display::win::ScreenWin::GetSystemMetricsInDIP(SM_CYSMICON);
+  return display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CYSMICON);
 #else
   // The icon never shrinks below 16 px on a side.
   const int kIconMinimumSize = 16;
diff --git a/chrome/browser/ui/views/intent_picker_dialog_browsertest.cc b/chrome/browser/ui/views/intent_picker_dialog_browsertest.cc
index 95c75899..debeabb 100644
--- a/chrome/browser/ui/views/intent_picker_dialog_browsertest.cc
+++ b/chrome/browser/ui/views/intent_picker_dialog_browsertest.cc
@@ -15,10 +15,12 @@
 #include "chrome/browser/ui/intent_picker_tab_helper.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/test/test_browser_dialog.h"
+#include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/frame/toolbar_button_provider.h"
 #include "chrome/browser/ui/views/intent_picker_bubble_view.h"
 #include "chrome/browser/ui/views/location_bar/intent_chip_button.h"
+#include "chrome/browser/ui/views/location_bar/intent_chip_button_test_base.h"
 #include "chrome/browser/ui/views/location_bar/location_bar_view.h"
 #include "chrome/browser/ui/views/page_action/page_action_icon_view.h"
 #include "content/public/test/browser_test.h"
@@ -82,11 +84,21 @@
 class IntentPickerDialogGridViewTest
     : public IntentPickerDialogTest,
       public testing::WithParamInterface<
-          apps::test::LinkCapturingFeatureVersion> {
+          std::tuple<apps::test::LinkCapturingFeatureVersion, bool>>,
+      public IntentChipButtonTestBase {
  public:
   IntentPickerDialogGridViewTest() {
-    feature_list_.InitWithFeaturesAndParameters(
-        apps::test::GetFeaturesToEnableLinkCapturingUX(GetParam()), {});
+    std::vector<base::test::FeatureRefAndParams> features_to_enable =
+        apps::test::GetFeaturesToEnableLinkCapturingUX(
+            std::get<apps::test::LinkCapturingFeatureVersion>(GetParam()));
+
+    if (IsMigrationEnabled()) {
+      features_to_enable.push_back(
+          {::features::kPageActionsMigration,
+           {{::features::kPageActionsMigrationIntentPicker.name, "true"}}});
+    }
+
+    feature_list_.InitWithFeaturesAndParameters(features_to_enable, {});
   }
 
   void ShowUi(const std::string& name) override {
@@ -103,13 +115,10 @@
     event_generator.MoveMouseTo(button->GetBoundsInScreen().CenterPoint());
     event_generator.ClickLeftButton();
   }
+  bool IsMigrationEnabled() const { return std::get<bool>(GetParam()); }
 
  private:
-  views::Button* GetAnchorButton() override {
-    return BrowserView::GetBrowserViewForBrowser(browser())
-        ->toolbar_button_provider()
-        ->GetIntentChipButton();
-  }
+  views::Button* GetAnchorButton() override { return GetIntentChip(browser()); }
 
   base::test::ScopedFeatureList feature_list_;
 };
@@ -122,13 +131,16 @@
 INSTANTIATE_TEST_SUITE_P(
     ,
     IntentPickerDialogGridViewTest,
+    testing::Combine(
 #if BUILDFLAG(IS_CHROMEOS)
-    testing::Values(apps::test::LinkCapturingFeatureVersion::kV1DefaultOff,
-                    apps::test::LinkCapturingFeatureVersion::kV2DefaultOff)
+        testing::Values(apps::test::LinkCapturingFeatureVersion::kV1DefaultOff,
+                        apps::test::LinkCapturingFeatureVersion::kV2DefaultOff),
 #else
-    testing::Values(apps::test::LinkCapturingFeatureVersion::kV2DefaultOn,
-                    apps::test::LinkCapturingFeatureVersion::kV2DefaultOff)
+        testing::Values(apps::test::LinkCapturingFeatureVersion::kV2DefaultOff,
+                        apps::test::LinkCapturingFeatureVersion::kV2DefaultOn),
 #endif  // BUILDFLAG(IS_CHROMEOS)
-        ,
-    [](const testing::TestParamInfo<apps::test::LinkCapturingFeatureVersion>&
-           info) { return apps::test::ToString(info.param); });
+        testing::Bool()),
+    [](const testing::TestParamInfo<
+        std::tuple<apps::test::LinkCapturingFeatureVersion, bool>>& info) {
+      return IntentChipButtonTestBase::GenerateIntentChipTestName(info);
+    });
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
index 29a661b..6ca35c8 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
@@ -1030,9 +1030,10 @@
   int range_end_offset = offsets[selection_range.end()];
 
   int left_bound =
-      display::win::ScreenWin::DIPToScreenRect(
-          HWNDForView(omnibox_view_views),
-          gfx::Rect(range_start_offset + bounds_in_screen.x(), 0, 0, 0))
+      display::win::GetScreenWin()
+          ->DIPToScreenRect(
+              HWNDForView(omnibox_view_views),
+              gfx::Rect(range_start_offset + bounds_in_screen.x(), 0, 0, 0))
           .x();
 
   // Adust `textfield_rect` to account for the border.
diff --git a/chrome/browser/ui/views/performance_controls/memory_saver_interactive_ui_test.cc b/chrome/browser/ui/views/performance_controls/memory_saver_interactive_ui_test.cc
index 50b6aa6..3dcbce9 100644
--- a/chrome/browser/ui/views/performance_controls/memory_saver_interactive_ui_test.cc
+++ b/chrome/browser/ui/views/performance_controls/memory_saver_interactive_ui_test.cc
@@ -404,6 +404,19 @@
                        index));
   }
 
+  // Sets discard usage on the active tab for deterministic UI testing.
+  auto SetTabPreDiscardMemoryUsageKb(size_t index, int64_t usage_kb) {
+    return Do(base::BindLambdaForTesting([=, this]() {
+      content::WebContents* web_contents =
+          browser()->tab_strip_model()->GetWebContentsAt(index);
+      auto* pre_discard_resource_usage =
+          performance_manager::user_tuning::UserPerformanceTuningManager::
+              PreDiscardResourceUsage::FromWebContents(web_contents);
+      pre_discard_resource_usage->UpdateDiscardInfo(
+          usage_kb, ::mojom::LifecycleUnitDiscardReason::PROACTIVE);
+    }));
+  }
+
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
 };
@@ -541,31 +554,25 @@
 
 // TODO(crbug.com/407785192): Fix and re-enable
 IN_PROC_BROWSER_TEST_P(MemorySaverChipInteractiveTest,
-                       DISABLED_BubbleCorrectlyReportingMemorySaved) {
+                       BubbleCorrectlyReportingMemorySaved) {
+  // Simulate a page larger than the threshold for showing savings UI.
+  constexpr int64_t kMemoryUsageKb = 1024 * 1024;
   RunTestSequence(
       InstrumentTab(kFirstTabContents, 0),
       NavigateWebContents(kFirstTabContents, GetURL()),
       AddInstrumentedTab(kSecondTabContents, GURL(kChromePage)),
-      ForceRefreshMemoryMetrics(), DiscardAndReloadTab(0, kFirstTabContents),
-      PressPageActionButton(),
+      DiscardAndReloadTab(0, kFirstTabContents),
+      SetTabPreDiscardMemoryUsageKb(0, kMemoryUsageKb), PressPageActionButton(),
       WaitForShow(MemorySaverResourceView::
                       kMemorySaverResourceViewMemorySavingsElementId),
-      CheckView(
-          MemorySaverResourceView::
-              kMemorySaverResourceViewMemorySavingsElementId,
-          base::BindOnce(
-              [](Browser* browser, views::Label* label) {
-                content::WebContents* web_contents =
-                    browser->tab_strip_model()->GetWebContentsAt(0);
-                auto* pre_discard_resource_usage = performance_manager::
-                    user_tuning::UserPerformanceTuningManager::
-                        PreDiscardResourceUsage::FromWebContents(web_contents);
-                int memory_estimate =
-                    pre_discard_resource_usage->memory_footprint_estimate_kb();
-                return label->GetText().find(ui::FormatBytes(
-                           memory_estimate * 1024)) != std::string::npos;
-              },
-              browser())));
+      CheckView(MemorySaverResourceView::
+                    kMemorySaverResourceViewMemorySavingsElementId,
+                [](views::Label* label) {
+                  return label->GetText().find(ui::FormatBytes(
+                             kMemoryUsageKb * 1024)) != std::string::npos;
+                })
+
+  );
 }
 
 // Memory Saver Dialog bubble should add the site it is currently on
@@ -677,16 +684,7 @@
       NavigateWebContents(kFirstTabContents, GetURL()),
       AddInstrumentedTab(kSecondTabContents, GURL(kChromePage)),
       ForceRefreshMemoryMetrics(), DiscardAndReloadTab(0, kFirstTabContents),
-      Do(base::BindLambdaForTesting([&]() {
-        content::WebContents* web_contents =
-            browser()->tab_strip_model()->GetWebContentsAt(0);
-        auto* pre_discard_resource_usage =
-            performance_manager::user_tuning::UserPerformanceTuningManager::
-                PreDiscardResourceUsage::FromWebContents(web_contents);
-        pre_discard_resource_usage->UpdateDiscardInfo(
-            135 * 1024, ::mojom::LifecycleUnitDiscardReason::PROACTIVE);
-      })),
-      PressPageActionButton(),
+      SetTabPreDiscardMemoryUsageKb(0, 135 * 1024), PressPageActionButton(),
       WaitForShow(
           MemorySaverBubbleView::kMemorySaverDialogResourceViewElementId),
       Screenshot(MemorySaverBubbleView::kMemorySaverDialogResourceViewElementId,
diff --git a/chrome/browser/ui/views/profiles/OWNERS b/chrome/browser/ui/views/profiles/OWNERS
index b8f961c6..3eaae014 100644
--- a/chrome/browser/ui/views/profiles/OWNERS
+++ b/chrome/browser/ui/views/profiles/OWNERS
@@ -2,7 +2,5 @@
 droger@chromium.org
 rhalavati@chromium.org
 
-per-file profile_menu_*=gabolvr@google.com
-
 per-file avatar_toolbar_button*=rsult@google.com
 per-file batch_upload_dialog_view*=rsult@google.com
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button_browsertest.cc b/chrome/browser/ui/views/profiles/avatar_toolbar_button_browsertest.cc
index 1e5f52a..6609bdc 100644
--- a/chrome/browser/ui/views/profiles/avatar_toolbar_button_browsertest.cc
+++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button_browsertest.cc
@@ -19,6 +19,7 @@
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/enterprise/browser_management/management_service_factory.h"
 #include "chrome/browser/enterprise/util/managed_browser_utils.h"
 #include "chrome/browser/profiles/keep_alive/profile_keep_alive_types.h"
 #include "chrome/browser/profiles/keep_alive/scoped_profile_keep_alive.h"
@@ -46,6 +47,7 @@
 #include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "components/policy/core/browser/browser_policy_connector.h"
 #include "components/policy/core/common/management/management_service.h"
+#include "components/policy/core/common/management/scoped_management_service_override_for_testing.h"
 #include "components/policy/core/common/mock_configuration_policy_provider.h"
 #include "components/policy/core/common/policy_map.h"
 #include "components/policy/policy_constants.h"
@@ -1093,11 +1095,20 @@
   }
 
   void SetUpOnMainThread() override {
+    scoped_browser_management_ =
+        std::make_unique<policy::ScopedManagementServiceOverrideForTesting>(
+            policy::ManagementServiceFactory::GetForProfile(
+                browser()->profile()),
+            policy::EnterpriseManagementAuthority::CLOUD);
     AvatarToolbarButtonBrowserTest::SetUpOnMainThread();
   }
 
+  void TearDownOnMainThread() override { scoped_browser_management_.reset(); }
+
  protected:
   testing::NiceMock<policy::MockConfigurationPolicyProvider> provider_;
+  std::unique_ptr<policy::ScopedManagementServiceOverrideForTesting>
+      scoped_browser_management_;
   base::test::ScopedFeatureList scoped_feature_list_;
 };
 
@@ -1116,12 +1127,12 @@
     EXPECT_NE(avatar_button->GetText(), work_label);
     clear_closure.RunAndReset();
     EXPECT_EQ(avatar_button->GetText(), work_label);
-    EXPECT_EQ(GetProfileAttributesEntry(browser()->profile())
-                  ->GetEnterpriseProfileLabel(),
-              work_label);
-    EXPECT_EQ(
-        GetProfileAttributesEntry(browser()->profile())->GetLocalProfileName(),
-        work_label);
+    // The profile name should be the default profile name.
+    std::u16string local_name =
+        GetProfileAttributesEntry(browser()->profile())->GetLocalProfileName();
+    EXPECT_TRUE(g_browser_process->profile_manager()
+                    ->GetProfileAttributesStorage()
+                    .IsDefaultProfileName(local_name, true));
   }
 
   {
@@ -1337,7 +1348,7 @@
 #endif
 // Tests the flow for a managed sign-in.
 IN_PROC_BROWSER_TEST_F(AvatarToolbarButtonEnterpriseBadgingBrowserTest,
-                       PRE_SignedInWithNewSessionKeepWorkBadge) {
+                       MAYBE_PRE_SignedInWithNewSessionKeepWorkBadge) {
   // Sign in.
   AvatarToolbarButton* avatar = GetAvatarToolbarButton(browser());
   std::u16string name(u"TestName");
@@ -1356,22 +1367,30 @@
   // Management is usually accepted by the time the greeting is finished. The
   // work badgge should be shown once this happens.
   enterprise_util::SetUserAcceptedAccountManagement(browser()->profile(), true);
-  EXPECT_EQ(avatar->GetText(), u"Work");
+  browser()->profile()->GetPrefs()->SetString(
+      prefs::kEnterpriseCustomLabelForProfile, "Custom Label");
+
+  EXPECT_EQ(avatar->GetText(), u"Custom Label");
 }
 
-// Test that the work badge remains upon restart for a user that has already
-// accepted management.
+// Test that the work badge remains upon restart for a user that is managed.
+// Note that we need to unset and reset UserAcceptedAccountManagement due to the
+// management service override.
 IN_PROC_BROWSER_TEST_F(AvatarToolbarButtonEnterpriseBadgingBrowserTest,
-                       SignedInWithNewSessionKeepWorkBadge) {
+                       MAYBE_SignedInWithNewSessionKeepWorkBadge) {
   signin::WaitForRefreshTokensLoaded(GetIdentityManager());
+  enterprise_util::SetUserAcceptedAccountManagement(browser()->profile(),
+                                                    false);
+  enterprise_util::SetUserAcceptedAccountManagement(browser()->profile(), true);
+
   AvatarToolbarButton* avatar = GetAvatarToolbarButton(browser());
-  EXPECT_EQ(avatar->GetText(), u"Work");
+  EXPECT_EQ(avatar->GetText(), u"Custom Label");
   EXPECT_EQ(GetProfileAttributesEntry(browser()->profile())
                 ->GetEnterpriseProfileLabel(),
-            u"Work");
+            u"Custom Label");
   EXPECT_EQ(
       GetProfileAttributesEntry(browser()->profile())->GetLocalProfileName(),
-      u"Work");
+      u"Custom Label");
   // Previously added image on signin should still be shown in the new session.
   EXPECT_TRUE(IsSignedInImageUsed());
 }
diff --git a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
index c6fa984..db64261 100644
--- a/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
+++ b/chrome/browser/ui/views/profiles/profile_menu_view_browsertest.cc
@@ -1102,7 +1102,7 @@
           std::make_unique<policy::ScopedManagementServiceOverrideForTesting>(
               policy::ManagementServiceFactory::GetForProfile(
                   browser()->profile()),
-              policy::EnterpriseManagementAuthority::COMPUTER_LOCAL);
+              policy::EnterpriseManagementAuthority::CLOUD);
   RunTest();
 }
 
diff --git a/chrome/browser/ui/views/profiles/profile_picker_ui_browsertest.cc b/chrome/browser/ui/views/profiles/profile_picker_ui_browsertest.cc
index b772707..5f57fa7 100644
--- a/chrome/browser/ui/views/profiles/profile_picker_ui_browsertest.cc
+++ b/chrome/browser/ui/views/profiles/profile_picker_ui_browsertest.cc
@@ -9,6 +9,7 @@
 #include "base/strings/strcat.h"
 #include "base/test/bind.h"
 #include "base/test/scoped_feature_list.h"
+#include "chrome/browser/enterprise/browser_management/management_service_factory.h"
 #include "chrome/browser/enterprise/util/managed_browser_utils.h"
 #include "chrome/browser/profiles/profile_attributes_storage.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -21,6 +22,7 @@
 #include "chrome/browser/ui/views/profiles/profiles_pixel_test_utils.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/webui_url_constants.h"
+#include "components/policy/core/common/management/scoped_management_service_override_for_testing.h"
 #include "components/signin/public/base/signin_buildflags.h"
 #include "components/signin/public/base/signin_switches.h"
 #include "components/signin/public/identity_manager/identity_test_utils.h"
@@ -103,7 +105,7 @@
      .use_multiple_profiles = true,
      .has_supervised_user = true,
      .show_kite_for_supervised_users = true},
-    {.pixel_test_param = {.test_suffix = "ManagedProfileHasWorkLabel"},
+    {.pixel_test_param = {.test_suffix = "ManagedProfileHasCustomWorkLabel"},
      .use_multiple_profiles = true,
      .is_enterprise_badging_enabled = true},
 #endif
@@ -259,6 +261,16 @@
           /*is_glic_version=*/true, browser()->profile()->GetPath());
     }
 
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
+    if (GetParam().is_enterprise_badging_enabled) {
+      policy::ScopedManagementServiceOverrideForTesting platform_management(
+          policy::ManagementServiceFactory::GetForProfile(browser()->profile()),
+          policy::EnterpriseManagementAuthority::CLOUD);
+      browser()->profile()->GetPrefs()->SetString(
+          prefs::kEnterpriseCustomLabelForProfile, "Work");
+    }
+#endif
+
     if (GetParam().use_multiple_profiles) {
       // In Glic mode, if `use_multiple_profiles` is set,
       // `no_glic_eligible_profiles` must be set to false.
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc
index 437cadc..74f1a15c 100644
--- a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc
+++ b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc
@@ -2523,7 +2523,7 @@
   ASSERT_NE(entry, nullptr);
   EXPECT_NE(entry->GetGAIAId(), GaiaId());
   EXPECT_FALSE(entry->IsEphemeral());
-  EXPECT_EQ(entry->GetLocalProfileName(), u"Work");
+  EXPECT_EQ(entry->GetLocalProfileName(), u"enterprise.com");
 
   syncer::SyncService* sync_service =
       SyncServiceFactory::GetForProfile(profile_being_created);
@@ -2591,7 +2591,7 @@
   ASSERT_NE(entry, nullptr);
   EXPECT_NE(entry->GetGAIAId(), GaiaId());
   EXPECT_FALSE(entry->IsEphemeral());
-  EXPECT_EQ(entry->GetLocalProfileName(), u"Work");
+  EXPECT_EQ(entry->GetLocalProfileName(), u"acme.com");
 
   syncer::SyncService* sync_service =
       SyncServiceFactory::GetForProfile(profile_being_created);
@@ -2641,7 +2641,7 @@
           .GetProfileAttributesWithPath(profile_being_created->GetPath());
   ASSERT_NE(entry, nullptr);
   EXPECT_FALSE(entry->IsEphemeral());
-  EXPECT_EQ(entry->GetLocalProfileName(), u"Work");
+  EXPECT_EQ(entry->GetLocalProfileName(), u"enterprise.com");
 
   // Sync is disabled.
   EXPECT_NE(entry->GetGAIAId(), GaiaId());
@@ -2699,7 +2699,7 @@
   ASSERT_NE(entry, nullptr);
   EXPECT_NE(entry->GetGAIAId(), GaiaId());
   EXPECT_FALSE(entry->IsEphemeral());
-  EXPECT_EQ(entry->GetLocalProfileName(), u"Work");
+  EXPECT_EQ(entry->GetLocalProfileName(), u"enterprise.com");
 
   // Sync is getting configured.
   EXPECT_TRUE(entry->IsAuthenticated());
diff --git a/chrome/browser/ui/views/tab_sharing/tab_sharing_infobar_unittest.cc b/chrome/browser/ui/views/tab_sharing/tab_sharing_infobar_unittest.cc
index fdd24ae..43f857e 100644
--- a/chrome/browser/ui/views/tab_sharing/tab_sharing_infobar_unittest.cc
+++ b/chrome/browser/ui/views/tab_sharing/tab_sharing_infobar_unittest.cc
@@ -53,26 +53,68 @@
   void OpenURL(const GURL& url, WindowOpenDisposition disposition) override {}
 };
 
-std::vector<std::u16string> GetChildTexts(
-    const TabSharingStatusMessageView& info_view) {
-  std::vector<std::u16string> texts;
-  for (const views::View* button_or_label : info_view.children()) {
-    texts.emplace_back(GetButtonOrLabelText(*button_or_label));
+struct ViewInfo {
+  ViewInfo(std::string class_name, std::u16string label_text)
+      : class_name(std::move(class_name)), label_text(std::move(label_text)) {}
+
+  bool operator==(const ViewInfo& other) const {
+    return class_name == other.class_name && label_text == other.label_text;
   }
-  return texts;
+
+  std::string class_name;
+  std::u16string label_text;
+};
+
+struct LabelInfo : ViewInfo {
+  explicit LabelInfo(std::u16string label_text)
+      : ViewInfo("Label", std::move(label_text)) {}
+};
+
+struct ButtonInfo : ViewInfo {
+  explicit ButtonInfo(std::u16string label_text)
+      : ViewInfo("MdTextButton", std::move(label_text)) {}
+};
+
+std::ostream& operator<<(std::ostream& os, const ViewInfo& info) {
+  os << "{ class_name: \"" << info.class_name << "\", label_text: \""
+     << base::UTF16ToUTF8(info.label_text) << "\" }";
+  return os;
+}
+
+ViewInfo GetViewInfo(const views::View& view) {
+  std::string_view class_name = view.GetClassName();
+  if (class_name == "MdTextButton") {
+    return ButtonInfo(std::u16string(
+        static_cast<const views::MdTextButton&>(view).GetText()));
+  } else if (class_name == "Label") {
+    return LabelInfo(
+        std::u16string(static_cast<const views::Label&>(view).GetText()));
+  }
+  NOTREACHED();
+}
+
+std::vector<ViewInfo> GetViewInfos(
+    const TabSharingStatusMessageView& info_view) {
+  std::vector<ViewInfo> child_view_infos;
+  for (const views::View* view : info_view.children()) {
+    child_view_infos.emplace_back(GetViewInfo(*view));
+  }
+  return child_view_infos;
 }
 
 void CheckStatusMessage(const TabSharingInfoBar& infobar,
-                        const std::vector<std::u16string>& message_fragments) {
+                        const std::vector<ViewInfo>& child_view_infos) {
   const views::View* view = infobar.GetStatusMessageViewForTesting();
   if (view->GetClassName() == "Label") {
-    EXPECT_EQ(static_cast<const views::Label*>(view)->GetText(),
-              std::accumulate(message_fragments.begin(),
-                              message_fragments.end(), std::u16string()));
+    std::u16string label_text;
+    for (const ViewInfo& child_view_info : child_view_infos) {
+      label_text += child_view_info.label_text;
+    }
+    EXPECT_EQ(static_cast<const views::Label*>(view)->GetText(), label_text);
   } else if (view->GetClassName() == "TabSharingStatusMessageView") {
     EXPECT_THAT(
-        GetChildTexts(static_cast<const TabSharingStatusMessageView&>(*view)),
-        testing::ElementsAreArray(message_fragments));
+        GetViewInfos(static_cast<const TabSharingStatusMessageView&>(*view)),
+        testing::ElementsAreArray(child_view_infos));
   } else {
     NOTREACHED();
   }
@@ -140,10 +182,13 @@
                      .role = TabRole::kCapturingTab});
 
   if (base::FeatureList::IsEnabled(features::kTabCaptureInfobarLinks)) {
-    CheckStatusMessage(infobar, {u"Sharing ", kSharedTabName, u" to this tab"});
+    CheckStatusMessage(infobar,
+                       {LabelInfo(u"Sharing "), ButtonInfo(kSharedTabName),
+                        LabelInfo(u" to this tab")});
   } else {
     CheckStatusMessage(infobar,
-                       {u"Sharing ", kSharedTabName, u" to ", kAppName});
+                       {LabelInfo(u"Sharing "), ButtonInfo(kSharedTabName),
+                        LabelInfo(u" to "), ButtonInfo(kAppName)});
   }
 }
 
@@ -154,7 +199,8 @@
       CreateInfobar({.shared_tab_name = std::u16string(),
                      .capturer_name = kAppName,
                      .role = TabRole::kCapturingTab});
-  CheckStatusMessage(infobar, {u"Sharing a tab to ", kAppName});
+  CheckStatusMessage(infobar,
+                     {LabelInfo(u"Sharing a tab to "), ButtonInfo(kAppName)});
 }
 
 // Test that the infobar on the shared tab has the correct text:
@@ -165,7 +211,8 @@
       CreateInfobar({.shared_tab_name = std::u16string(),
                      .capturer_name = kAppName,
                      .role = TabRole::kCapturedTab});
-  CheckStatusMessage(infobar, {u"Sharing this tab to ", kAppName});
+  CheckStatusMessage(
+      infobar, {LabelInfo(u"Sharing this tab to "), ButtonInfo(kAppName)});
 }
 
 // Test that the infobar on another not share tab has the correct text:
@@ -176,7 +223,9 @@
       CreateInfobar({.shared_tab_name = kSharedTabName,
                      .capturer_name = kAppName,
                      .role = TabRole::kOtherTab});
-  CheckStatusMessage(infobar, {u"Sharing ", kSharedTabName, u" to ", kAppName});
+  CheckStatusMessage(infobar,
+                     {LabelInfo(u"Sharing "), ButtonInfo(kSharedTabName),
+                      LabelInfo(u" to "), ButtonInfo(kAppName)});
 }
 
 // Test that if the app preferred self-capture, but the user either chose
@@ -191,7 +240,8 @@
       CreateInfobar({.shared_tab_name = std::u16string(),
                      .capturer_name = kAppName,
                      .role = TabRole::kCapturedTab});
-  CheckStatusMessage(infobar, {u"Sharing this tab to ", kAppName});
+  CheckStatusMessage(
+      infobar, {LabelInfo(u"Sharing this tab to "), ButtonInfo(kAppName)});
 }
 
 // Test that the infobar on another not cast tab has the correct text:
@@ -205,11 +255,13 @@
       .capture_type = TabSharingInfoBarDelegate::TabShareType::CAST};
   const TabSharingInfoBar& infobar = CreateInfobar(preferences);
   CheckStatusMessage(infobar,
-                     {u"Casting ", kSharedTabName, u" to ", kSinkName});
+                     {LabelInfo(u"Casting "), ButtonInfo(kSharedTabName),
+                      LabelInfo(u" to "), ButtonInfo(kSinkName)});
   // Without sink name.
   preferences.capturer_name = std::u16string();
   const TabSharingInfoBar& infobar2 = CreateInfobar(preferences);
-  CheckStatusMessage(infobar2, {u"Casting ", kSharedTabName});
+  CheckStatusMessage(infobar2,
+                     {LabelInfo(u"Casting "), ButtonInfo(kSharedTabName)});
 }
 
 // Test that the infobar on the tab being cast has the correct text:
@@ -222,10 +274,11 @@
       .role = TabRole::kCapturedTab,
       .capture_type = TabSharingInfoBarDelegate::TabShareType::CAST};
   const TabSharingInfoBar& infobar = CreateInfobar(preferences);
-  CheckStatusMessage(infobar, {u"Casting this tab to ", kSinkName});
+  CheckStatusMessage(
+      infobar, {LabelInfo(u"Casting this tab to "), ButtonInfo(kSinkName)});
 
   // Without sink name.
   preferences.capturer_name = std::u16string();
   const TabSharingInfoBar& infobar2 = CreateInfobar(preferences);
-  CheckStatusMessage(infobar2, {u"Casting this tab"});
+  CheckStatusMessage(infobar2, {LabelInfo(u"Casting this tab")});
 }
diff --git a/chrome/browser/ui/views/tabs/glic_button.cc b/chrome/browser/ui/views/tabs/glic_button.cc
index 84b67af..21eff2b 100644
--- a/chrome/browser/ui/views/tabs/glic_button.cc
+++ b/chrome/browser/ui/views/tabs/glic_button.cc
@@ -28,7 +28,7 @@
 #include "ui/views/controls/menu/menu_item_view.h"
 #include "ui/views/controls/menu/menu_model_adapter.h"
 #include "ui/views/controls/menu/menu_runner.h"
-#include "ui/views/layout/flex_layout.h"
+#include "ui/views/layout/box_layout.h"
 #include "ui/views/view_class_properties.h"
 
 namespace glic {
@@ -70,8 +70,9 @@
   SetFocusBehavior(FocusBehavior::ALWAYS);
 
   auto* const layout_manager =
-      SetLayoutManager(std::make_unique<views::FlexLayout>());
-  layout_manager->SetMainAxisAlignment(views::LayoutAlignment::kStart);
+      SetLayoutManager(std::make_unique<views::BoxLayout>());
+  layout_manager->set_main_axis_alignment(
+      views::BoxLayout::MainAxisAlignment::kStart);
 }
 
 GlicButton::~GlicButton() = default;
diff --git a/chrome/browser/ui/views/tabs/new_tab_button.cc b/chrome/browser/ui/views/tabs/new_tab_button.cc
index 1ff187d..489ec20 100644
--- a/chrome/browser/ui/views/tabs/new_tab_button.cc
+++ b/chrome/browser/ui/views/tabs/new_tab_button.cc
@@ -178,7 +178,7 @@
   // this event was not handled, it seems like things would Just Work.
   gfx::Point point = event.location();
   views::View::ConvertPointToScreen(this, &point);
-  point = display::win::ScreenWin::DIPToScreenPoint(point);
+  point = display::win::GetScreenWin()->DIPToScreenPoint(point);
   auto weak_this = weak_factory_.GetWeakPtr();
   views::ShowSystemMenuAtScreenPixelLocation(views::HWNDForView(this), point);
   if (!weak_this) {
diff --git a/chrome/browser/ui/views/tabs/tab_strip_action_container.cc b/chrome/browser/ui/views/tabs/tab_strip_action_container.cc
index f239afb..1627cb5 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_action_container.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip_action_container.cc
@@ -33,7 +33,7 @@
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/gfx/animation/tween.h"
 #include "ui/views/accessibility/view_accessibility.h"
-#include "ui/views/layout/flex_layout.h"
+#include "ui/views/layout/box_layout.h"
 #include "ui/views/mouse_watcher.h"
 #include "ui/views/mouse_watcher_view_host.h"
 #include "ui/views/view_class_properties.h"
@@ -278,9 +278,11 @@
   }
 #endif  // BUILDFLAG(ENABLE_GLIC)
   auto* const layout_manager =
-      SetLayoutManager(std::make_unique<views::FlexLayout>());
-  layout_manager->SetMainAxisAlignment(views::LayoutAlignment::kStart);
-  layout_manager->SetCrossAxisAlignment(views::LayoutAlignment::kCenter);
+      SetLayoutManager(std::make_unique<views::BoxLayout>());
+  layout_manager->set_main_axis_alignment(
+      views::BoxLayout::MainAxisAlignment::kStart);
+  layout_manager->set_cross_axis_alignment(
+      views::BoxLayout::CrossAxisAlignment::kCenter);
 }
 
 TabStripActionContainer::~TabStripActionContainer() {
diff --git a/chrome/browser/ui/views/tabs/tab_strip_nudge_button.cc b/chrome/browser/ui/views/tabs/tab_strip_nudge_button.cc
index 409dd087..c297e73 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_nudge_button.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip_nudge_button.cc
@@ -18,7 +18,7 @@
 #include "ui/views/accessibility/view_accessibility.h"
 #include "ui/views/animation/ink_drop.h"
 #include "ui/views/controls/highlight_path_generator.h"
-#include "ui/views/layout/flex_layout.h"
+#include "ui/views/layout/box_layout.h"
 #include "ui/views/view_class_properties.h"
 
 namespace {
@@ -45,8 +45,9 @@
                             Edge::kNone,
                             flat_edge) {
   auto* const layout_manager =
-      SetLayoutManager(std::make_unique<views::FlexLayout>());
-  layout_manager->SetMainAxisAlignment(views::LayoutAlignment::kEnd);
+      SetLayoutManager(std::make_unique<views::BoxLayout>());
+  layout_manager->set_main_axis_alignment(
+      views::BoxLayout::MainAxisAlignment::kEnd);
 
   SetProperty(views::kElementIdentifierKey, element_identifier);
 
diff --git a/chrome/browser/ui/views/toolbar/chrome_labs/chrome_labs_button_unittest.cc b/chrome/browser/ui/views/toolbar/chrome_labs/chrome_labs_button_unittest.cc
index e2b5082..3b79b45 100644
--- a/chrome/browser/ui/views/toolbar/chrome_labs/chrome_labs_button_unittest.cc
+++ b/chrome/browser/ui/views/toolbar/chrome_labs/chrome_labs_button_unittest.cc
@@ -129,6 +129,35 @@
   EXPECT_FALSE(browser_view()->toolbar()->GetChromeLabsButton()->GetVisible());
 }
 
+TEST_F(ChromeLabsButtonTest, ShouldButtonShowEphemerallyTest) {
+  // Reset the value set during setup to ensure the button doesn't artificially
+  // show ephemerally during this test.
+  browser_view()
+      ->toolbar()
+      ->pinned_toolbar_actions_container()
+      ->ShowActionEphemerallyInToolbar(kActionShowChromeLabs, false);
+
+  EXPECT_EQ(browser_view()->toolbar()->GetChromeLabsButton(), nullptr);
+
+  ChromeLabsCoordinator* coordinator =
+      browser_view()->browser()->GetFeatures().chrome_labs_coordinator();
+  coordinator->Show();
+
+  // Showing the bubble when the button was not previously showing should cause
+  // it to show.
+  EXPECT_TRUE(coordinator->BubbleExists());
+  EXPECT_NE(browser_view()->toolbar()->GetChromeLabsButton(), nullptr);
+  EXPECT_TRUE(browser_view()->toolbar()->GetChromeLabsButton()->GetVisible());
+
+  views::test::WidgetDestroyedWaiter destroyed_waiter(
+      coordinator->GetChromeLabsBubbleView()->GetWidget());
+  coordinator->Hide();
+  destroyed_waiter.Wait();
+
+  // Hiding the bubble should cause the ephemeral button to hide.
+  EXPECT_EQ(browser_view()->toolbar()->GetChromeLabsButton(), nullptr);
+}
+
 TEST_F(ChromeLabsButtonTest, DotIndicatorTest) {
   views::Button* labs_button = browser_view()->toolbar()->GetChromeLabsButton();
   ChromeLabsCoordinator* coordinator =
diff --git a/chrome/browser/ui/webui/management/management_ui.cc b/chrome/browser/ui/webui/management/management_ui.cc
index fbb8cfa..016d3d8f 100644
--- a/chrome/browser/ui/webui/management/management_ui.cc
+++ b/chrome/browser/ui/webui/management/management_ui.cc
@@ -170,6 +170,12 @@
        IDS_MANAGEMENT_REPORT_ANDROID_APPLICATIONS},
       {"proxyServerPrivacyDisclosure",
        IDS_MANAGEMENT_PROXY_SERVER_PRIVACY_DISCLOSURE},
+      {"deskSync", IDS_MANAGEMENT_DESK_SYNC_TITLE},
+      {"deskSyncDescription", IDS_MANAGEMENT_DESK_SYNC_DESCRIPTION},
+      {"windowSync", IDS_MANAGEMENT_DESK_SYNC_WINDOWS_NOTICE},
+      {"cookieSync", IDS_MANAGEMENT_DESK_SYNC_COOKIES_NOTICE},
+      {"deskSyncOptOut", IDS_MANAGEMENT_DESK_SYNC_OPT_OUT},
+      {"deskSyncLearnMore", IDS_MANAGEMENT_DESK_SYNC_LEARN_MORE},
       {kManagementOnFileTransferEvent, IDS_MANAGEMENT_FILE_TRANSFER_EVENT},
       {kManagementOnFileTransferVisibleData,
        IDS_MANAGEMENT_FILE_TRANSFER_VISIBLE_DATA},
diff --git a/chrome/browser/ui/webui/management/management_ui_handler_chromeos.cc b/chrome/browser/ui/webui/management/management_ui_handler_chromeos.cc
index 16c492b..c55308b 100644
--- a/chrome/browser/ui/webui/management/management_ui_handler_chromeos.cc
+++ b/chrome/browser/ui/webui/management/management_ui_handler_chromeos.cc
@@ -4,10 +4,14 @@
 
 #include "chrome/browser/ui/webui/management/management_ui_handler_chromeos.h"
 
+#include "ash/constants/ash_features.h"
 #include "base/check_is_test.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/ash/crostini/crostini_features.h"
 #include "chrome/browser/ash/crostini/crostini_pref_names.h"
+#include "chrome/browser/ash/floating_sso/floating_sso_service.h"
+#include "chrome/browser/ash/floating_sso/floating_sso_service_factory.h"
+#include "chrome/browser/ash/floating_workspace/floating_workspace_util.h"
 #include "chrome/browser/ash/net/secure_dns_manager.h"
 #include "chrome/browser/ash/plugin_vm/plugin_vm_pref_names.h"
 #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h"
@@ -38,6 +42,7 @@
 #include "chrome/browser/ui/webui/management/management_ui_handler_chromeos.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/grit/branded_strings.h"
+#include "chromeos/ash/components/browser_context_helper/browser_context_helper.h"
 #include "chromeos/ash/components/network/network_state_handler.h"
 #include "chromeos/ash/components/network/proxy/proxy_config_handler.h"
 #include "chromeos/ash/components/network/proxy/ui_proxy_config_service.h"
@@ -418,6 +423,31 @@
          dest == policy::local_user_files::FileSaveDestination::kOneDrive;
 }
 
+bool IsActiveProfile(const Profile* profile) {
+  const auto* active_user = user_manager::UserManager::Get()->GetActiveUser();
+  if (!active_user) {
+    return false;
+  }
+  auto* active_browser_context =
+      ash::BrowserContextHelper::Get()->GetBrowserContextByUser(active_user);
+  if (!active_browser_context) {
+    return false;
+  }
+  return profile == Profile::FromBrowserContext(active_browser_context);
+}
+
+bool IsFloatingSsoEnabled(Profile* profile) {
+  if (!ash::features::IsFloatingSsoAllowed()) {
+    return false;
+  }
+  ash::floating_sso::FloatingSsoService* floating_sso_service =
+      ash::floating_sso::FloatingSsoServiceFactory::GetForProfile(profile);
+  if (!floating_sso_service) {
+    return false;
+  }
+  return floating_sso_service->IsFloatingSsoEnabled();
+}
+
 }  // namespace
 
 ManagementUIHandlerChromeOS::ManagementUIHandlerChromeOS(Profile* profile)
@@ -611,6 +641,16 @@
                 showMonitoredNetworkDisclosure);
 }
 
+void ManagementUIHandlerChromeOS::AddDeskSyncNotice(
+    Profile* profile,
+    base::Value::Dict* response) {
+  const bool are_windows_synced =
+      IsActiveProfile(profile) &&
+      ash::floating_workspace_util::IsFloatingWorkspaceV2Enabled();
+  response->Set("showWindowsNoticeForDeskSync", are_windows_synced);
+  response->Set("showCookiesNoticeForDeskSync", IsFloatingSsoEnabled(profile));
+}
+
 void ManagementUIHandlerChromeOS::RegisterPrefChange(
     PrefChangeRegistrar& pref_registrar) {
   ManagementUIHandler::RegisterPrefChange(pref_registrar);
@@ -630,6 +670,7 @@
   base::Value::Dict response;
   AddUpdateRequiredEolInfo(&response);
   AddMonitoredNetworkPrivacyDisclosure(&response);
+  AddDeskSyncNotice(profile, &response);
 
   if (enterprise_manager.empty()) {
     response.Set(
diff --git a/chrome/browser/ui/webui/management/management_ui_handler_chromeos.h b/chrome/browser/ui/webui/management/management_ui_handler_chromeos.h
index 6b553237..25bc333 100644
--- a/chrome/browser/ui/webui/management/management_ui_handler_chromeos.h
+++ b/chrome/browser/ui/webui/management/management_ui_handler_chromeos.h
@@ -63,6 +63,11 @@
   // warning will be added to the transparency panel to inform the user that the
   // admin may be able to see their network traffic.
   void AddMonitoredNetworkPrivacyDisclosure(base::Value::Dict* response);
+  // Adds flags indicating whether Desk Sync feature is active for windows
+  // and/or cookies. If at least one of them is true, a dedicated section will
+  // be added to inform the user that their data is being synced across their
+  // ChromeOS devices.
+  void AddDeskSyncNotice(Profile* profile, base::Value::Dict* response);
 
   // ManagementUIHandler
   void RegisterPrefChange(PrefChangeRegistrar& pref_registrar) override;
diff --git a/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc b/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
index e17ac44..2167aea 100644
--- a/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
+++ b/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
@@ -24,11 +24,14 @@
 #include "chrome/browser/enterprise/connectors/test/deep_scanning_test_utils.h"
 #include "chrome/browser/enterprise/reporting/prefs.h"
 #include "chrome/browser/policy/dm_token_utils.h"
+#include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/prefs/browser_prefs.h"
 #include "chrome/browser/ui/webui/management/management_ui_constants.h"
 #include "chrome/common/pref_names.h"
+#include "chrome/test/base/scoped_testing_local_state.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chrome/test/base/testing_profile_manager.h"
 #include "components/content_settings/core/common/content_settings_pattern.h"
 #include "components/enterprise/browser/reporting/common_pref_names.h"
 #include "components/enterprise/browser/reporting/real_time_report_type.h"
@@ -87,7 +90,6 @@
 #include "chrome/browser/net/stub_resolver_config_reader.h"
 #include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/ui/webui/management/management_ui_handler_chromeos.h"
-#include "chrome/test/base/testing_profile_manager.h"
 #include "chromeos/ash/components/browser_context_helper/annotated_account_id.h"
 #include "chromeos/ash/components/dbus/shill/shill_service_client.h"
 #include "chromeos/ash/components/install_attributes/stub_install_attributes.h"
@@ -143,18 +145,22 @@
   std::u16string management_overview;
   std::u16string update_required_eol;
   bool show_monitored_network_privacy_disclosure;
+  bool show_windows_notice_for_desk_sync;
+  bool show_cookies_notice_for_desk_sync;
 #else
   std::u16string browser_management_notice;
 #endif  // BUILDFLAG(IS_CHROMEOS)
   bool managed;
 };
 
-#if BUILDFLAG(IS_CHROMEOS)
 namespace {
 const char kUser[] = "user@domain.com";
+#if BUILDFLAG(IS_CHROMEOS)
 const GaiaId::Literal kGaiaId("gaia_id");
+#endif  // BUILDFLAG(IS_CHROMEOS)
 }  // namespace
 
+#if BUILDFLAG(IS_CHROMEOS)
 // This class is just to mock the behaviour of the few flags we need for
 // simulating the behaviour of the policy::DeviceStatusCollector.
 // The expected flags are passed to the constructor.
@@ -227,7 +233,7 @@
 using ManagementUIHandlerBase = ManagementUIHandlerChromeOS;
 #else
 using ManagementUIHandlerBase = ManagementUIHandler;
-#endif
+#endif  // BUILDFLAG(IS_CHROMEOS)
 class TestManagementUIHandler : public ManagementUIHandlerBase {
  public:
   TestManagementUIHandler() : ManagementUIHandlerBase(/*profile=*/nullptr) {}
@@ -320,8 +326,7 @@
 // better separated.
 class ManagementUIHandlerTests :
 #if BUILDFLAG(IS_CHROMEOS)
-    public ash::DeviceSettingsTestBase,
-    public Profile::Delegate
+    public ash::DeviceSettingsTestBase
 #else
     public testing::Test
 #endif
@@ -394,10 +399,12 @@
 #if BUILDFLAG(IS_CHROMEOS)
     extracted_.management_overview = ExtractPathFromDict(data, "overview");
     extracted_.update_required_eol = ExtractPathFromDict(data, "eolMessage");
-    std::optional<bool> showProxyDisclosure =
-        data.FindBool("showMonitoredNetworkPrivacyDisclosure");
     extracted_.show_monitored_network_privacy_disclosure =
-        showProxyDisclosure.has_value() && showProxyDisclosure.value();
+        data.FindBool("showMonitoredNetworkPrivacyDisclosure").value_or(false);
+    extracted_.show_windows_notice_for_desk_sync =
+        data.FindBool("showWindowsNoticeForDeskSync").value_or(false);
+    extracted_.show_cookies_notice_for_desk_sync =
+        data.FindBool("showCookiesNoticeForDeskSync").value_or(false);
 #else
     extracted_.browser_management_notice =
         ExtractPathFromDict(data, "browserManagementNotice");
@@ -424,7 +431,7 @@
     bool crostini_report_usage;
     bool cloud_reporting_enabled;
     bool cloud_profile_reporting_enabled;
-    std::string profile_name;
+    std::string profile_name = kUser;
     bool override_policy_connector_is_managed;
     bool managed_account;
     bool managed_browser;
@@ -439,6 +446,8 @@
     base::Value::List report_website_telemetry;
     base::Value::List report_website_activity_allowlist;
     base::Value::List report_website_telemetry_allowlist;
+    bool sync_windows;
+    bool sync_cookies;
   };
 
   void ResetTestConfig() { ResetTestConfig(true); }
@@ -459,7 +468,7 @@
     setup_config_.crostini_report_usage = default_value;
     setup_config_.cloud_reporting_enabled = default_value;
     setup_config_.cloud_profile_reporting_enabled = default_value;
-    setup_config_.profile_name = "";
+    setup_config_.profile_name = kUser;
     setup_config_.override_policy_connector_is_managed = false;
     setup_config_.managed_account = true;
     setup_config_.managed_browser = true;
@@ -473,19 +482,17 @@
     setup_config_.report_website_telemetry_allowlist = base::Value::List();
     setup_config_.legacy_tech_reporting_enabled = false;
     setup_config_.real_time_url_check_connector_enabled = default_value;
-  }
-
-  void SetUpLocalState() {
-    RegisterLocalState(local_state_.registry());
-    TestingBrowserProcess::GetGlobal()->SetLocalState(&local_state_);
+    setup_config_.sync_windows = false;
+    setup_config_.sync_cookies = false;
   }
 
 #if BUILDFLAG(IS_CHROMEOS)
   void SetUp() override {
-    SetUpLocalState();
-
+    profile_manager_ = std::make_unique<TestingProfileManager>(
+        TestingBrowserProcess::GetGlobal(), &local_state_);
+    ASSERT_TRUE(profile_manager_->SetUp());
     fake_user_manager_.Reset(
-        std::make_unique<user_manager::FakeUserManager>(&local_state_));
+        std::make_unique<user_manager::FakeUserManager>(local_state_.Get()));
 
     const AccountId account_id(AccountId::FromUserEmailGaiaId(kUser, kGaiaId));
     fake_user_manager_->AddGaiaUser(account_id,
@@ -502,7 +509,7 @@
         std::make_unique<ash::NetworkHandlerTestHelper>();
     ash::NetworkMetadataStore::RegisterPrefs(user_prefs_.registry());
     stub_resolver_config_reader_ =
-        std::make_unique<StubResolverConfigReader>(&local_state_);
+        std::make_unique<StubResolverConfigReader>(local_state_.Get());
     SystemNetworkContextManager::set_stub_resolver_config_reader_for_testing(
         stub_resolver_config_reader_.get());
     // The |DeviceSettingsTestBase| setup above instantiates
@@ -518,9 +525,13 @@
     manager_.reset();
     DeviceSettingsTestBase::TearDown();
     install_attributes_.reset();
+    web_contents_.reset();
+    fake_user_manager_->OnUserProfileWillBeDestroyed(
+        AccountId::FromUserEmailGaiaId(GetTestConfig().profile_name, kGaiaId));
+    profile_ = nullptr;
+    profile_manager_.reset();
     user_ = nullptr;
     fake_user_manager_.Reset();
-    TestingBrowserProcess::GetGlobal()->SetLocalState(nullptr);
   }
 
   void SetUpConnectManager() {
@@ -530,7 +541,7 @@
             base::SingleThreadTaskRunner::GetCurrentDefault());
     manager_ = std::make_unique<TestDeviceCloudPolicyManagerAsh>(
         std::move(store), &state_keys_broker_);
-    manager_.get()->Initialize(&local_state_);
+    manager_.get()->Initialize(local_state_.Get());
   }
 
   base::Value::List SetUpForReportingInfo() {
@@ -540,7 +551,7 @@
       return {};
     }
     const TestDeviceStatusCollector status_collector(
-        &local_state_, GetTestConfig().report_activity_times,
+        local_state_.Get(), GetTestConfig().report_activity_times,
         GetTestConfig().report_nics, GetTestConfig().report_hardware_data,
         GetTestConfig().report_users, GetTestConfig().report_crash_info,
         GetTestConfig().report_app_info_and_activity);
@@ -561,8 +572,8 @@
     profile_->GetPrefs()->SetBoolean(
         crostini::prefs::kReportCrostiniUsageEnabled,
         GetTestConfig().crostini_report_usage);
-    local_state_.SetBoolean(enterprise_reporting::kCloudReportingEnabled,
-                            GetTestConfig().cloud_reporting_enabled);
+    local_state_.Get()->SetBoolean(enterprise_reporting::kCloudReportingEnabled,
+                                   GetTestConfig().cloud_reporting_enabled);
     profile_->GetPrefs()->SetInteger(
         enterprise_connectors::kEnterpriseRealTimeUrlCheckMode, 1);
     profile_->GetPrefs()->SetInteger(
@@ -616,59 +627,61 @@
     }
     return result;
   }
-
-  void OnProfileCreationStarted(Profile* profile,
-                                Profile::CreateMode create_mode) override {
-    ash::AnnotatedAccountId::Set(
-        profile, AccountId::FromUserEmailGaiaId(kUser, kGaiaId));
-  }
-
-  void OnProfileCreationFinished(Profile* profile,
-                                 Profile::CreateMode create_mode,
-                                 bool success,
-                                 bool is_new_profile) override {
-    // Do nothing.
-  }
-
 #else
-  void SetUp() override { SetUpLocalState(); }
-  void TearDown() override {
-    TestingBrowserProcess::GetGlobal()->SetLocalState(nullptr);
+  void SetUp() override {
+    profile_manager_ = std::make_unique<TestingProfileManager>(
+        TestingBrowserProcess::GetGlobal(), &local_state_);
+    ASSERT_TRUE(profile_manager_->SetUp());
   }
+  void TearDown() override {
+    web_contents_.reset();
+    profile_ = nullptr;
+    profile_manager_.reset();
+  }
+
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
   [[nodiscard]] bool SetUpProfileAndHandler() {
     if (profile_) {
       return false;
     }
-    TestingProfile::Builder builder;
-    builder.SetProfileName(GetTestConfig().profile_name);
+    profile_ =
+        profile_manager_->CreateTestingProfile(GetTestConfig().profile_name);
     if (GetTestConfig().override_policy_connector_is_managed) {
-      builder.OverridePolicyConnectorIsManagedForTesting(true);
+      profile_->GetProfilePolicyConnector()->OverrideIsManagedForTesting(true);
     }
-#if BUILDFLAG(IS_CHROMEOS)
-    builder.SetDelegate(this);
-#endif  // BUILDFLAG(IS_CHROMEOS)
-    profile_ = builder.Build();
 
 #if BUILDFLAG(IS_CHROMEOS)
-    fake_user_manager_->OnUserProfileCreated(
-        AccountId::FromUserEmailGaiaId(kUser, kGaiaId), profile_->GetPrefs());
+    const AccountId account_id =
+        AccountId::FromUserEmailGaiaId(GetTestConfig().profile_name, kGaiaId);
+    fake_user_manager_->UserLoggedIn(
+        account_id,
+        user_manager::FakeUserManager::GetFakeUsernameHash(account_id));
+    fake_user_manager_->SwitchActiveUser(account_id);
+    fake_user_manager_->OnUserProfileCreated(account_id, profile_->GetPrefs());
+    // Set Floating Workspace (responsible for syncing windows) pref.
+    profile_->GetTestingPrefService()->SetManagedPref(
+        ash::prefs::kFloatingWorkspaceV2Enabled,
+        std::make_unique<base::Value>(GetTestConfig().sync_windows));
+    // Set Floating SSO (responsible for syncing cookies) pref.
+    profile_->GetTestingPrefService()->SetManagedPref(
+        prefs::kFloatingSsoEnabled,
+        std::make_unique<base::Value>(GetTestConfig().sync_cookies));
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
     web_contents_ = content::WebContents::Create(
-        content::WebContents::CreateParams(profile_.get()));
+        content::WebContents::CreateParams(profile_));
     web_ui_.set_web_contents(web_contents_.get());
     handler_.SetAccountManagedForTesting(GetTestConfig().managed_account);
 #if BUILDFLAG(IS_CHROMEOS)
     handler_.SetDeviceManagedForTesting(GetTestConfig().managed_device);
     handler_.SetDeviceDomain(GetTestConfig().device_domain);
-    handler_.CreateSecureDnsManagerForTesting(&local_state_, *user_.get());
+    handler_.CreateSecureDnsManagerForTesting(local_state_.Get(), *user_.get());
 #else
     handler_.SetBrowserManagedForTesting(GetTestConfig().managed_browser);
 #endif
     base::Value::Dict data =
-        handler_.GetContextualManagedDataForTesting(profile_.get());
+        handler_.GetContextualManagedDataForTesting(profile_);
     ExtractContextualSourceUpdate(data);
 
     return true;
@@ -678,11 +691,8 @@
     if (profile_) {
       return false;
     }
-    TestingProfile::Builder builder_no_domain;
-#if BUILDFLAG(IS_CHROMEOS)
-    builder_no_domain.SetDelegate(this);
-#endif
-    profile_ = builder_no_domain.Build();
+    profile_ =
+        profile_manager_->CreateTestingProfile(GetTestConfig().profile_name);
     return true;
   }
 
@@ -704,6 +714,14 @@
   bool GetShowMonitoredNetworkPrivacyDisclosure() const {
     return extracted_.show_monitored_network_privacy_disclosure;
   }
+
+  bool GetShowWindowsNoticeForDeskSync() const {
+    return extracted_.show_windows_notice_for_desk_sync;
+  }
+
+  bool GetShowCookiesNoticeForDeskSync() const {
+    return extracted_.show_cookies_notice_for_desk_sync;
+  }
 #else
 
   std::u16string GetBrowserManagementNotice() const {
@@ -722,7 +740,7 @@
 
   std::u16string GetPageSubtitle() const { return extracted_.subtitle; }
 
-  TestingProfile* GetProfile() const { return profile_.get(); }
+  TestingProfile* GetProfile() const { return profile_; }
 
   TestConfig& GetTestConfig() { return setup_config_; }
 
@@ -732,8 +750,9 @@
   policy::PolicyMap empty_policy_map_;
   std::u16string device_domain_;
   ContextualManagementSourceUpdate extracted_;
-  TestingPrefServiceSimple local_state_;
+  ScopedTestingLocalState local_state_{TestingBrowserProcess::GetGlobal()};
   TestingPrefServiceSimple user_prefs_;
+  std::unique_ptr<TestingProfileManager> profile_manager_;
 #if BUILDFLAG(IS_CHROMEOS)
   user_manager::TypedScopedUserManager<user_manager::FakeUserManager>
       fake_user_manager_;
@@ -750,7 +769,7 @@
 #else
   content::BrowserTaskEnvironment task_environment_;
 #endif
-  std::unique_ptr<TestingProfile> profile_;
+  raw_ptr<TestingProfile> profile_;
   content::TestWebUI web_ui_;
   std::unique_ptr<content::WebContents> web_contents_;
 
@@ -1142,7 +1161,6 @@
 TEST_F(ManagementUIHandlerTests, ManagementContextualSourceUpdateUnmanaged) {
   const auto device_type = ui::GetChromeOSDeviceTypeResourceId();
   ResetTestConfig();
-  GetTestConfig().profile_name = "";
   GetTestConfig().managed_account = false;
   GetTestConfig().managed_browser = false;
   GetTestConfig().device_domain = "";
@@ -1484,11 +1502,11 @@
 TEST_F(ManagementUIHandlerTests,
        ShowPrivacyDisclosureForSecureDnsWithIdentifiers) {
   ResetTestConfig();
-  local_state_.SetManagedPref(prefs::kDnsOverHttpsMode,
-                              base::Value(SecureDnsConfig::kModeSecure));
-  local_state_.Set(prefs::kDnsOverHttpsSalt, base::Value("test-salt"));
-  local_state_.Set(prefs::kDnsOverHttpsTemplatesWithIdentifiers,
-                   base::Value("www.test-dns.com"));
+  local_state_.Get()->SetManagedPref(prefs::kDnsOverHttpsMode,
+                                     base::Value(SecureDnsConfig::kModeSecure));
+  local_state_.Get()->Set(prefs::kDnsOverHttpsSalt, base::Value("test-salt"));
+  local_state_.Get()->Set(prefs::kDnsOverHttpsTemplatesWithIdentifiers,
+                          base::Value("www.test-dns.com"));
 
   base::RunLoop().RunUntilIdle();
 
@@ -1522,7 +1540,7 @@
   // Set pref to use a proxy.
   PrefProxyConfigTrackerImpl::RegisterProfilePrefs(user_prefs_.registry());
   ash::NetworkHandler::Get()->InitializePrefServices(&user_prefs_,
-                                                     &local_state_);
+                                                     local_state_.Get());
   user_prefs_.SetUserPref(proxy_config::prefs::kProxy,
                           ProxyConfigDictionary::CreateAutoDetect());
   base::RunLoop().RunUntilIdle();
@@ -1538,7 +1556,7 @@
   // Simulate network disconnected state.
   PrefProxyConfigTrackerImpl::RegisterProfilePrefs(user_prefs_.registry());
   ash::NetworkHandler::Get()->InitializePrefServices(&user_prefs_,
-                                                     &local_state_);
+                                                     local_state_.Get());
   ash::NetworkStateHandler::NetworkStateList networks;
   ash::NetworkHandler::Get()->network_state_handler()->GetNetworkListByType(
       ash::NetworkTypePattern::Default(),
@@ -1567,7 +1585,7 @@
   // Set pref not to use proxy.
   PrefProxyConfigTrackerImpl::RegisterProfilePrefs(user_prefs_.registry());
   ash::NetworkHandler::Get()->InitializePrefServices(&user_prefs_,
-                                                     &local_state_);
+                                                     local_state_.Get());
   user_prefs_.SetUserPref(proxy_config::prefs::kProxy,
                           ProxyConfigDictionary::CreateDirect());
   base::RunLoop().RunUntilIdle();
@@ -1580,6 +1598,38 @@
   ash::NetworkHandler::Get()->NetworkHandler::ShutdownPrefServices();
 }
 
+TEST_F(ManagementUIHandlerTests, ShowDeskSyncWindowsNotice) {
+  ResetTestConfig();
+  GetTestConfig().managed_device = true;
+  GetTestConfig().sync_windows = true;
+  ASSERT_TRUE(SetUpProfileAndHandler());
+  EXPECT_TRUE(GetShowWindowsNoticeForDeskSync());
+}
+
+TEST_F(ManagementUIHandlerTests, HideDeskSyncWindowsNotice) {
+  ResetTestConfig();
+  GetTestConfig().managed_device = true;
+  GetTestConfig().sync_windows = false;
+  ASSERT_TRUE(SetUpProfileAndHandler());
+  EXPECT_FALSE(GetShowWindowsNoticeForDeskSync());
+}
+
+TEST_F(ManagementUIHandlerTests, ShowDeskSyncCookiesNotice) {
+  ResetTestConfig();
+  GetTestConfig().managed_device = true;
+  GetTestConfig().sync_cookies = true;
+  ASSERT_TRUE(SetUpProfileAndHandler());
+  EXPECT_TRUE(GetShowCookiesNoticeForDeskSync());
+}
+
+TEST_F(ManagementUIHandlerTests, HideDeskSyncCookiesNotice) {
+  ResetTestConfig();
+  GetTestConfig().managed_device = true;
+  GetTestConfig().sync_cookies = false;
+  ASSERT_TRUE(SetUpProfileAndHandler());
+  EXPECT_FALSE(GetShowCookiesNoticeForDeskSync());
+}
+
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
 TEST_F(ManagementUIHandlerTests, ExtensionReportingInfoNoPolicySetNoMessage) {
@@ -1595,7 +1645,8 @@
   policy::PolicyMap policies;
   EXPECT_CALL(policy_service_, GetPolicies(_))
       .WillRepeatedly(ReturnRef(policies));
-  local_state_.SetBoolean(enterprise_reporting::kCloudReportingEnabled, true);
+  local_state_.Get()->SetBoolean(enterprise_reporting::kCloudReportingEnabled,
+                                 true);
   ASSERT_TRUE(SetUpProfileAndHandler());
 
   profile_->GetPrefs()->SetInteger(
@@ -1648,7 +1699,8 @@
   policy::PolicyMap policies;
   EXPECT_CALL(policy_service_, GetPolicies(_))
       .WillRepeatedly(ReturnRef(policies));
-  local_state_.SetBoolean(enterprise_reporting::kCloudReportingEnabled, true);
+  local_state_.Get()->SetBoolean(enterprise_reporting::kCloudReportingEnabled,
+                                 true);
   profile_->GetPrefs()->SetInteger(
       enterprise_connectors::kEnterpriseRealTimeUrlCheckMode, 1);
   profile_->GetPrefs()->SetInteger(
@@ -1728,7 +1780,8 @@
   EXPECT_CALL(policy_service_,
               GetPolicies(on_prem_reporting_extension_beta_policy_namespace))
       .WillOnce(ReturnRef(on_prem_reporting_extension_beta_policies));
-  local_state_.SetBoolean(enterprise_reporting::kCloudReportingEnabled, true);
+  local_state_.Get()->SetBoolean(enterprise_reporting::kCloudReportingEnabled,
+                                 true);
   profile_->GetPrefs()->SetInteger(
       enterprise_connectors::kEnterpriseRealTimeUrlCheckMode, 1);
   profile_->GetPrefs()->SetInteger(
@@ -1753,7 +1806,7 @@
 
 TEST_F(ManagementUIHandlerTests, ManagedWebsitiesInfoNoPolicySet) {
   ASSERT_TRUE(SetUpNoDomainProfile());
-  auto info = handler_.GetManagedWebsitesInfo(profile_.get());
+  auto info = handler_.GetManagedWebsitesInfo(profile_);
   EXPECT_EQ(info.size(), 0u);
 }
 
@@ -1765,7 +1818,7 @@
   managed_websites.Append(std::move(entry));
   profile_->GetPrefs()->Set(prefs::kManagedConfigurationPerOrigin,
                             base::Value(std::move(managed_websites)));
-  auto info = handler_.GetManagedWebsitesInfo(profile_.get());
+  auto info = handler_.GetManagedWebsitesInfo(profile_);
   EXPECT_EQ(info.size(), 1u);
   EXPECT_EQ(info.begin()->GetString(), "https://example.com");
 }
@@ -1785,7 +1838,7 @@
       .WillRepeatedly(ReturnRef(chrome_policies));
 
   // When no policies are set, nothing to report.
-  auto info = handler_.GetThreatProtectionInfo(profile_.get());
+  auto info = handler_.GetThreatProtectionInfo(profile_);
   EXPECT_TRUE(info.FindList("info")->empty());
   EXPECT_EQ(
       l10n_util::GetStringUTF16(IDS_MANAGEMENT_THREAT_PROTECTION_DESCRIPTION),
@@ -1809,7 +1862,7 @@
   profile_->GetPrefs()->SetInteger(
       enterprise_connectors::kEnterpriseRealTimeUrlCheckMode, 0);
 
-  info = handler_.GetThreatProtectionInfo(profile_.get());
+  info = handler_.GetThreatProtectionInfo(profile_);
   EXPECT_TRUE(info.FindList("info")->empty());
   EXPECT_EQ(
       l10n_util::GetStringUTF16(IDS_MANAGEMENT_THREAT_PROTECTION_DESCRIPTION),
@@ -1846,7 +1899,7 @@
       enterprise_connectors::kEnterpriseRealTimeUrlCheckScope,
       policy::POLICY_SCOPE_MACHINE);
 
-  info = handler_.GetThreatProtectionInfo(profile_.get());
+  info = handler_.GetThreatProtectionInfo(profile_);
   EXPECT_TRUE(info.FindList("info")->empty());
   EXPECT_EQ(
       l10n_util::GetStringUTF16(IDS_MANAGEMENT_THREAT_PROTECTION_DESCRIPTION),
@@ -1856,7 +1909,7 @@
   // token, report them.
   policy::SetDMTokenForTesting(policy::DMToken::CreateValidToken("fake-token"));
 
-  info = handler_.GetThreatProtectionInfo(profile_.get());
+  info = handler_.GetThreatProtectionInfo(profile_);
 #if BUILDFLAG(IS_CHROMEOS)
   const size_t expected_size = 8u;
 #else
@@ -1926,12 +1979,12 @@
 TEST_F(ManagementUIHandlerTests, GetFilesUploadToCloud) {
   ResetTestConfig();
   ASSERT_TRUE(SetUpProfileAndHandler());
-  EXPECT_TRUE(handler_.GetFilesUploadToCloudInfo(profile_.get()).empty());
+  EXPECT_TRUE(handler_.GetFilesUploadToCloudInfo(profile_).empty());
   profile_->GetTestingPrefService()->SetManagedPref(
       ash::prefs::kCaptureModePolicySavePath,
       std::make_unique<base::Value>(
           policy::local_user_files::kOneDrivePolicyVariableName));
 
-  EXPECT_FALSE(handler_.GetFilesUploadToCloudInfo(profile_.get()).empty());
+  EXPECT_FALSE(handler_.GetFilesUploadToCloudInfo(profile_).empty());
 }
 #endif  // BUILDFLAG(IS_CHROMEOS)
diff --git a/chrome/browser/ui/webui/management/management_ui_unittest.cc b/chrome/browser/ui/webui/management/management_ui_unittest.cc
index 686d5ec..99536ad 100644
--- a/chrome/browser/ui/webui/management/management_ui_unittest.cc
+++ b/chrome/browser/ui/webui/management/management_ui_unittest.cc
@@ -17,7 +17,8 @@
   static const std::unordered_set<int> kHasNoLinkVersionOrNotApplicable{
       IDS_MANAGEMENT_LOG_UPLOAD_ENABLED, IDS_MANAGEMENT_LEGACY_TECH_REPORT,
       // Not applicable strings follow.
-      IDS_MANAGEMENT_PROFILE_REPORTING_LEARN_MORE};
+      IDS_MANAGEMENT_PROFILE_REPORTING_LEARN_MORE,
+      IDS_MANAGEMENT_DESK_SYNC_OPT_OUT, IDS_MANAGEMENT_DESK_SYNC_LEARN_MORE};
 
   std::vector<webui::LocalizedString> localized_strings;
   ManagementUI::GetLocalizedStrings(localized_strings, false);
@@ -33,7 +34,8 @@
 // All disclosure strings that contain a link should not be included.
 TEST_F(ManagementUITest, VerifyLinksRemoved) {
   static const std::unordered_set<int> kLinkNotApplicable{
-      IDS_MANAGEMENT_PROFILE_REPORTING_LEARN_MORE};
+      IDS_MANAGEMENT_PROFILE_REPORTING_LEARN_MORE,
+      IDS_MANAGEMENT_DESK_SYNC_OPT_OUT, IDS_MANAGEMENT_DESK_SYNC_LEARN_MORE};
   std::vector<webui::LocalizedString> localized_strings;
   ManagementUI::GetLocalizedStrings(localized_strings, true);
 
diff --git a/chrome/browser/ui/webui/profile_internals/OWNERS b/chrome/browser/ui/webui/profile_internals/OWNERS
index eab3b2a..c0741e9 100644
--- a/chrome/browser/ui/webui/profile_internals/OWNERS
+++ b/chrome/browser/ui/webui/profile_internals/OWNERS
@@ -1,3 +1 @@
 file://chrome/browser/profiles/OWNERS
-
-gabolvr@google.com
diff --git a/chrome/browser/ui/webui/signin/OWNERS b/chrome/browser/ui/webui/signin/OWNERS
index b5241c7b..570c576 100644
--- a/chrome/browser/ui/webui/signin/OWNERS
+++ b/chrome/browser/ui/webui/signin/OWNERS
@@ -9,7 +9,3 @@
 # For ChromeOS changes
 per-file inline_login_*_chromeos*=file://chromeos/ash/components/account_manager/OWNERS
 per-file signin_helper_chromeos.*=file://chromeos/ash/components/account_manager/OWNERS
-
-per-file dice_web_signin_intercept_*=gabolvr@google.com
-per-file profile_customization_*=gabolvr@google.com
-per-file sync_confirmation_*=gabolvr@google.com
diff --git a/chrome/browser/usb/android/java/src/org/chromium/chrome/browser/usb/UsbBridge.java b/chrome/browser/usb/android/java/src/org/chromium/chrome/browser/usb/UsbBridge.java
index 0520130..4695776c 100644
--- a/chrome/browser/usb/android/java/src/org/chromium/chrome/browser/usb/UsbBridge.java
+++ b/chrome/browser/usb/android/java/src/org/chromium/chrome/browser/usb/UsbBridge.java
@@ -6,11 +6,14 @@
 
 import org.jni_zero.NativeMethods;
 
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.content_public.browser.WebContents;
 
 /** Java access point for UsbBridge, allowing for querying USB state. */
+@NullMarked
 public class UsbBridge {
-    public static boolean isWebContentsConnectedToUsbDevice(WebContents webContents) {
+    public static boolean isWebContentsConnectedToUsbDevice(@Nullable WebContents webContents) {
         if (webContents == null) return false;
         return UsbBridgeJni.get().isWebContentsConnectedToUsbDevice(webContents);
     }
diff --git a/chrome/browser/usb/android/java/src/org/chromium/chrome/browser/usb/UsbNotificationManager.java b/chrome/browser/usb/android/java/src/org/chromium/chrome/browser/usb/UsbNotificationManager.java
index bdd12b1..8e45d14 100644
--- a/chrome/browser/usb/android/java/src/org/chromium/chrome/browser/usb/UsbNotificationManager.java
+++ b/chrome/browser/usb/android/java/src/org/chromium/chrome/browser/usb/UsbNotificationManager.java
@@ -7,10 +7,10 @@
 import android.content.Context;
 import android.content.Intent;
 
-import androidx.annotation.Nullable;
-
 import org.chromium.base.ContextUtils;
 import org.chromium.base.shared_preferences.SharedPreferencesManager;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
 import org.chromium.chrome.browser.notifications.NotificationWrapperBuilderFactory;
 import org.chromium.chrome.browser.notifications.channels.ChromeChannelDefinitions;
@@ -37,6 +37,7 @@
  * Creates and destroys the WebUSB notification when a website is connected
  * to a USB device.
  */
+@NullMarked
 public class UsbNotificationManager {
     private static final String NOTIFICATION_NAMESPACE = "UsbNotificationManager";
 
@@ -106,7 +107,11 @@
      * @param startId Id for the service start request
      */
     private void updateNotification(
-            int notificationId, boolean isConnected, String url, boolean isIncognito, int startId) {
+            int notificationId,
+            boolean isConnected,
+            @Nullable String url,
+            boolean isIncognito,
+            int startId) {
         destroyNotification(notificationId);
         if (isConnected) createNotification(notificationId, url, isIncognito);
         if (mNotificationIds.size() == 0) mDelegate.stopSelf(startId);
@@ -129,7 +134,7 @@
      * @param url Url of the website interacting with USB devices.
      * @param isIncognito Whether the notification comes from incognito mode.
      */
-    private void createNotification(int notificationId, String url, boolean isIncognito) {
+    private void createNotification(int notificationId, @Nullable String url, boolean isIncognito) {
         Context appContext = ContextUtils.getApplicationContext();
         NotificationWrapperBuilder builder =
                 NotificationWrapperBuilderFactory.createNotificationWrapperBuilder(
diff --git a/chrome/browser/usb/android/java/src/org/chromium/chrome/browser/usb/UsbNotificationManagerDelegate.java b/chrome/browser/usb/android/java/src/org/chromium/chrome/browser/usb/UsbNotificationManagerDelegate.java
index 5b877f5..a22852d 100644
--- a/chrome/browser/usb/android/java/src/org/chromium/chrome/browser/usb/UsbNotificationManagerDelegate.java
+++ b/chrome/browser/usb/android/java/src/org/chromium/chrome/browser/usb/UsbNotificationManagerDelegate.java
@@ -6,7 +6,10 @@
 
 import android.content.Intent;
 
+import org.chromium.build.annotations.NullMarked;
+
 /** Delegate for {@link UsbNotificationManager}. */
+@NullMarked
 public interface UsbNotificationManagerDelegate {
     /**
      * Creates an Intent to bring an Activity for a particular Tab back to the
diff --git a/chrome/browser/wallet/android/java/src/org/chromium/chrome/browser/wallet/BoardingPassBridge.java b/chrome/browser/wallet/android/java/src/org/chromium/chrome/browser/wallet/BoardingPassBridge.java
index c5a1166d..dbe44638 100644
--- a/chrome/browser/wallet/android/java/src/org/chromium/chrome/browser/wallet/BoardingPassBridge.java
+++ b/chrome/browser/wallet/android/java/src/org/chromium/chrome/browser/wallet/BoardingPassBridge.java
@@ -9,6 +9,8 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.Promise;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.content_public.browser.WebContents;
 
 import java.util.Arrays;
@@ -16,6 +18,7 @@
 
 /** Provides native methods for java code to call. */
 @JNINamespace("wallet")
+@NullMarked
 public class BoardingPassBridge {
 
     private BoardingPassBridge() {}
@@ -36,7 +39,7 @@
      * @param webContents web contents of current tab.
      * @return Detected boarding passes raw string.
      */
-    public static Promise<List<String>> detectBoardingPass(WebContents webContents) {
+    public static Promise<List<String>> detectBoardingPass(@Nullable WebContents webContents) {
         Promise<List<String>> promise = new Promise<>();
         BoardingPassBridgeJni.get()
                 .detectBoardingPass(
@@ -53,6 +56,6 @@
     public interface Natives {
         boolean shouldDetect(String url);
 
-        void detectBoardingPass(WebContents webContents, Callback<String[]> callback);
+        void detectBoardingPass(@Nullable WebContents webContents, Callback<String[]> callback);
     }
 }
diff --git a/chrome/browser/wallet/android/java/src/org/chromium/chrome/browser/wallet/BoardingPassController.java b/chrome/browser/wallet/android/java/src/org/chromium/chrome/browser/wallet/BoardingPassController.java
index 491ae24..e0694679 100644
--- a/chrome/browser/wallet/android/java/src/org/chromium/chrome/browser/wallet/BoardingPassController.java
+++ b/chrome/browser/wallet/android/java/src/org/chromium/chrome/browser/wallet/BoardingPassController.java
@@ -6,6 +6,7 @@
 
 import org.chromium.base.Log;
 import org.chromium.base.supplier.ObservableSupplier;
+import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.tab.CurrentTabObserver;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
@@ -14,6 +15,7 @@
 import java.util.List;
 
 /** Controls the whole flow of boarding pass detection. */
+@NullMarked
 public class BoardingPassController {
     private static final String TAG = "BoardingPassCtrl";
 
diff --git a/chrome/browser/web_applications/web_install_service_impl.cc b/chrome/browser/web_applications/web_install_service_impl.cc
index d946fcf..0224f0c 100644
--- a/chrome/browser/web_applications/web_install_service_impl.cc
+++ b/chrome/browser/web_applications/web_install_service_impl.cc
@@ -18,6 +18,7 @@
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/permission_request_description.h"
 #include "content/public/browser/web_contents.h"
 #include "third_party/blink/public/common/permissions/permission_utils.h"
@@ -146,7 +147,6 @@
   }
 
   // Check if the permission status is already set.
-  std::vector<blink::PermissionType> permission_requests;
   content::PermissionResult permission_status =
       permission_controller->GetPermissionResultForCurrentDocument(
           blink::PermissionType::WEB_APP_INSTALLATION, &render_frame_host());
@@ -162,7 +162,6 @@
     case PermissionStatus::ASK:
       break;
   }
-  permission_requests.push_back(blink::PermissionType::WEB_APP_INSTALLATION);
 
   GURL requesting_origin =
       render_frame_host().GetLastCommittedOrigin().GetURL();
@@ -170,7 +169,10 @@
   permission_controller->RequestPermissionsFromCurrentDocument(
       &render_frame_host(),
       content::PermissionRequestDescription(
-          permission_requests, /*user_gesture=*/true, requesting_origin),
+          content::PermissionDescriptorUtil::
+              CreatePermissionDescriptorForPermissionType(
+                  blink::PermissionType::WEB_APP_INSTALLATION),
+          /*user_gesture=*/true, requesting_origin),
       std::move(callback));
 }
 
diff --git a/chrome/browser/webauthn/chrome_webauthn_autofill_interactive_uitest.cc b/chrome/browser/webauthn/chrome_webauthn_autofill_interactive_uitest.cc
index c340a6e..1e17006 100644
--- a/chrome/browser/webauthn/chrome_webauthn_autofill_interactive_uitest.cc
+++ b/chrome/browser/webauthn/chrome_webauthn_autofill_interactive_uitest.cc
@@ -43,7 +43,7 @@
 #include "components/sync_device_info/fake_device_info_sync_service.h"
 #include "components/sync_device_info/fake_device_info_tracker.h"
 #include "components/trusted_vault/proto/vault.pb.h"
-#include "components/trusted_vault/test/mock_trusted_vault_connection.h"
+#include "components/trusted_vault/test/mock_trusted_vault_throttling_connection.h"
 #include "components/trusted_vault/trusted_vault_connection.h"
 #include "components/webauthn/core/browser/test_passkey_model.h"
 #include "content/public/browser/render_frame_host.h"
@@ -180,10 +180,8 @@
 
     // ChromeAuthenticatorRequestDelegate::TestObserver:
     void Created(ChromeAuthenticatorRequestDelegate* delegate) override {
-      std::unique_ptr<
-          testing::NiceMock<trusted_vault::MockTrustedVaultConnection>>
-          connection = std::make_unique<
-              testing::NiceMock<trusted_vault::MockTrustedVaultConnection>>();
+      auto connection = std::make_unique<testing::NiceMock<
+          trusted_vault::MockTrustedVaultThrottlingConnection>>();
       ON_CALL(*connection, DownloadAuthenticationFactorsRegistrationState(
                                testing::_, testing::_, testing::_))
           .WillByDefault(
diff --git a/chrome/browser/webauthn/chrome_webauthn_browsertest.cc b/chrome/browser/webauthn/chrome_webauthn_browsertest.cc
index 4549aab8..ec7bccd 100644
--- a/chrome/browser/webauthn/chrome_webauthn_browsertest.cc
+++ b/chrome/browser/webauthn/chrome_webauthn_browsertest.cc
@@ -1830,7 +1830,7 @@
         kRequestWithPasswordTemplate, {request_password},
         /*offsets=*/nullptr);
     const auto& result = content::EvalJs(web_contents, script);
-    EXPECT_THAT(result.ExtractString(), testing::HasSubstr("NotFoundError"));
+    EXPECT_THAT(result.ExtractString(), testing::HasSubstr("NotAllowedError"));
   }
 }
 
@@ -1847,7 +1847,7 @@
         kRequestWithPasswordTemplate, {request_password},
         /*offsets=*/nullptr);
     const auto& result = content::EvalJs(web_contents, script);
-    EXPECT_THAT(result.ExtractString(), testing::HasSubstr("NotFoundError"));
+    EXPECT_THAT(result.ExtractString(), testing::HasSubstr("NotAllowedError"));
   }
 }
 
diff --git a/chrome/browser/webauthn/enclave_authenticator_browsertest.cc b/chrome/browser/webauthn/enclave_authenticator_browsertest.cc
index 5687ccd2..e706a92 100644
--- a/chrome/browser/webauthn/enclave_authenticator_browsertest.cc
+++ b/chrome/browser/webauthn/enclave_authenticator_browsertest.cc
@@ -85,7 +85,7 @@
 #include "components/sync/service/sync_service_impl.h"
 #include "components/sync/test/fake_server_network_resources.h"
 #include "components/trusted_vault/securebox.h"
-#include "components/trusted_vault/test/mock_trusted_vault_connection.h"
+#include "components/trusted_vault/test/mock_trusted_vault_throttling_connection.h"
 #include "components/trusted_vault/trusted_vault_connection.h"
 #include "components/trusted_vault/trusted_vault_server_constants.h"
 #include "components/webauthn/core/browser/passkey_model.h"
@@ -140,7 +140,7 @@
 
 namespace {
 
-using trusted_vault::MockTrustedVaultConnection;
+using trusted_vault::MockTrustedVaultThrottlingConnection;
 
 constexpr int32_t kSecretVersion = 417;
 constexpr uint8_t kSecurityDomainSecret[32] = {};
@@ -1016,8 +1016,8 @@
   void SetMockVaultConnectionOnRequestDelegate(
       trusted_vault::DownloadAuthenticationFactorsRegistrationStateResult
           result) {
-    std::unique_ptr<testing::NiceMock<MockTrustedVaultConnection>> connection =
-        std::make_unique<testing::NiceMock<MockTrustedVaultConnection>>();
+    auto connection = std::make_unique<
+        testing::NiceMock<MockTrustedVaultThrottlingConnection>>();
     EXPECT_CALL(*connection, DownloadAuthenticationFactorsRegistrationState(
                                  testing::_, testing::_, testing::_))
         .WillOnce(
@@ -1044,8 +1044,8 @@
   }
 
   void SetVaultConnectionToTimeout() {
-    std::unique_ptr<testing::NiceMock<MockTrustedVaultConnection>> connection =
-        std::make_unique<testing::NiceMock<MockTrustedVaultConnection>>();
+    auto connection = std::make_unique<
+        testing::NiceMock<MockTrustedVaultThrottlingConnection>>();
     EXPECT_CALL(*connection, DownloadAuthenticationFactorsRegistrationState(
                                  testing::_, testing::_, testing::_))
         .WillOnce(
@@ -1070,8 +1070,8 @@
   }
 
   void CheckRegistrationStateNotRequested() {
-    std::unique_ptr<testing::NiceMock<MockTrustedVaultConnection>> connection =
-        std::make_unique<testing::NiceMock<MockTrustedVaultConnection>>();
+    auto connection = std::make_unique<
+        testing::NiceMock<MockTrustedVaultThrottlingConnection>>();
     EXPECT_CALL(*connection, DownloadAuthenticationFactorsRegistrationState(
                                  testing::_, testing::_, testing::_))
         .WillRepeatedly(
@@ -2090,8 +2090,8 @@
   base::OnceCallback<void(
       trusted_vault::DownloadAuthenticationFactorsRegistrationStateResult)>
       connection_cb;
-  std::unique_ptr<testing::NiceMock<MockTrustedVaultConnection>> connection =
-      std::make_unique<testing::NiceMock<MockTrustedVaultConnection>>();
+  auto connection = std::make_unique<
+      testing::NiceMock<MockTrustedVaultThrottlingConnection>>();
   EXPECT_CALL(*connection, DownloadAuthenticationFactorsRegistrationState(
                                testing::_, testing::_, testing::_))
       .WillOnce(
@@ -2312,8 +2312,8 @@
   base::OnceCallback<void(
       trusted_vault::DownloadAuthenticationFactorsRegistrationStateResult)>
       connection_cb;
-  std::unique_ptr<testing::NiceMock<MockTrustedVaultConnection>> connection =
-      std::make_unique<testing::NiceMock<MockTrustedVaultConnection>>();
+  auto connection = std::make_unique<
+      testing::NiceMock<MockTrustedVaultThrottlingConnection>>();
   EXPECT_CALL(*connection, DownloadAuthenticationFactorsRegistrationState(
                                testing::_, testing::_, testing::_))
       .WillOnce(
@@ -2514,8 +2514,8 @@
       trusted_vault::DownloadAuthenticationFactorsRegistrationStateResult)>
       connection_cb;
   base::RepeatingClosure keep_alive_cb;
-  std::unique_ptr<testing::NiceMock<MockTrustedVaultConnection>> connection =
-      std::make_unique<testing::NiceMock<MockTrustedVaultConnection>>();
+  auto connection = std::make_unique<
+      testing::NiceMock<MockTrustedVaultThrottlingConnection>>();
   EXPECT_CALL(*connection, DownloadAuthenticationFactorsRegistrationState(
                                testing::_, testing::_, testing::_))
       .WillOnce(
@@ -2578,8 +2578,8 @@
   base::OnceCallback<void(
       trusted_vault::DownloadAuthenticationFactorsRegistrationStateResult)>
       connection_cb;
-  std::unique_ptr<testing::NiceMock<MockTrustedVaultConnection>> connection =
-      std::make_unique<testing::NiceMock<MockTrustedVaultConnection>>();
+  auto connection = std::make_unique<
+      testing::NiceMock<MockTrustedVaultThrottlingConnection>>();
   EXPECT_CALL(*connection, DownloadAuthenticationFactorsRegistrationState(
                                testing::_, testing::_, testing::_))
       .WillOnce(
diff --git a/chrome/browser/win/taskbar_manager.cc b/chrome/browser/win/taskbar_manager.cc
index 65c2375..542adc3 100644
--- a/chrome/browser/win/taskbar_manager.cc
+++ b/chrome/browser/win/taskbar_manager.cc
@@ -82,6 +82,20 @@
                               : PinResultMetric::kPinCurrentAppFailed);
 }
 
+// This helper splits `callback` three ways for use with `PostAsyncHandlers`,
+// which has three separate paths to outcomes: invoke a success callback, invoke
+// an error callback, or return an error.
+template <typename... Args>
+std::tuple<base::OnceCallback<void(Args...)>,
+           base::OnceCallback<void(Args...)>,
+           base::OnceCallback<void(Args...)>>
+SplitOnceCallbackIntoThree(base::OnceCallback<void(Args...)> callback) {
+  auto first_split = base::SplitOnceCallback(std::move(callback));
+  auto second_split = base::SplitOnceCallback(std::move(first_split.first));
+  return {std::move(first_split.second), std::move(second_split.first),
+          std::move(second_split.second)};
+}
+
 void OnIsCurrentAppPinnedResult(ComPtr<ITaskbarManager> taskbar_manager,
                                 bool check_only,
                                 ResultMetricCallback callback,
@@ -103,24 +117,20 @@
     return;
   }
 
-  auto first_split = base::SplitOnceCallback(std::move(callback));
-  auto second_split = base::SplitOnceCallback(std::move(first_split.first));
-  auto success_callback = std::move(first_split.second);
-  auto failure_callback = std::move(second_split.first);
-  auto post_async_failed_callback = std::move(second_split.second);
+  auto split_callback = SplitOnceCallbackIntoThree(std::move(callback));
 
   hr = base::win::PostAsyncHandlers(
       request_pin_operation.Get(),
       base::BindOnce(&PinnedRequestResult, std::move(taskbar_manager),
-                     std::move(success_callback)),
+                     std::move(std::get<0>(split_callback))),
       base::BindOnce(
           [](base::OnceCallback<void(PinResultMetric)> pin_callback) {
             std::move(pin_callback)
                 .Run(PinResultMetric::kPostAsyncResultsFailed);
           },
-          std::move(failure_callback)));
+          std::move(std::get<1>(split_callback))));
   if (FAILED(hr)) {
-    std::move(post_async_failed_callback)
+    std::move(std::get<2>(split_callback))
         .Run(PinResultMetric::kPostAsyncResultsFailed);
   }
 }
@@ -153,10 +163,21 @@
     std::move(callback).Run(PinResultMetric::kTaskbarManagerError);
     return;
   }
-  hr = base::win::PostAsyncResults(
-      std::move(is_pinned_operation),
+  auto split_callback = SplitOnceCallbackIntoThree(std::move(callback));
+  hr = base::win::PostAsyncHandlers(
+      is_pinned_operation.Get(),
       base::BindOnce(&OnIsCurrentAppPinnedResult, std::move(taskbar_manager),
-                     check_only, std::move(callback)));
+                     check_only, std::move(std::get<0>(split_callback))),
+      base::BindOnce(
+          [](base::OnceCallback<void(PinResultMetric)> pin_callback) {
+            std::move(pin_callback)
+                .Run(PinResultMetric::kPostAsyncResultsFailed);
+          },
+          std::move(std::get<1>(split_callback))));
+  if (FAILED(hr)) {
+    std::move(std::get<2>(split_callback))
+        .Run(PinResultMetric::kPostAsyncResultsFailed);
+  }
 }
 
 // Attempts to pin a shortcut with AUMI `app_user_model_id` to the taskbar.
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index c160045..3a54e55 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1744005534-094211da694cc3946b845d59c34952e28d13b054-dc700a742c4808149fb7c6c326a7cbc3f24d2899.profdata
+chrome-android32-main-1744027037-926670ded2fb33e529ab1d3426230000fb365854-b1f3fd44213da2ace27fa16878446d0197e54f0f.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index 9535cd91..4b5afe62 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1744011474-21c4fb6cb24770779ed08cc6e3631d0b425e2543-263dfbfdf4c26ef4019db0895b844ff2feeb1949.profdata
+chrome-android64-main-1744037444-563ed695d1fdc36369f6e9bf28588bc50408fda5-fa7e352f809f702de6de6495c42dd2294a3d3979.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index e2cf228..bd26b8d 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1744005534-4b847c80d1208cd53d5c16240c44963f4a76922b-dc700a742c4808149fb7c6c326a7cbc3f24d2899.profdata
+chrome-linux-main-1744027037-3d21438a38621460416bee845916c1efa82126a2-b1f3fd44213da2ace27fa16878446d0197e54f0f.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 1904d80..611b811e 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1744012775-9c4f24a8f10a429d1ebb0339cbd291e9fbfe4de2-f028b1d44f6d97148a780579d9e9ce23d9395d71.profdata
+chrome-mac-arm-main-1744041557-557bde7c5c224ba3f4529f1d4594033afeee4912-bc16abbc25d71745fc414c65df8046bd87aa2197.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index f1708ef..1d8df4a 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1744005534-76336af53e0140c521d3bb96e6516b7417ab7090-dc700a742c4808149fb7c6c326a7cbc3f24d2899.profdata
+chrome-mac-main-1744027037-9b7b56a223482bf3e5e0b4c9e1fe797c824e38cb-b1f3fd44213da2ace27fa16878446d0197e54f0f.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index 6b1d542a..5e31328 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1744005534-d327599aaf101e439003e90a720caa2d18f2ff6d-dc700a742c4808149fb7c6c326a7cbc3f24d2899.profdata
+chrome-win-arm64-main-1744027037-b129fdcd57930d9331ed5093c1d951ab99be60d7-b1f3fd44213da2ace27fa16878446d0197e54f0f.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index c28dc83..a8d3e0f 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1743994480-2247d71616a36780e72cf983efb58d232a118c26-8de52e4202dc4c64df300e247229d16408377622.profdata
+chrome-win32-main-1744016320-86018eff961a3c6f1c867f24e858368cf2218270-6c693ba714627222c6361ef2cf94a43bd92d5f1a.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 6e951b3..9a855ef 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1743972679-f0a280b437df7732b47cd3eb081964c8f004ae8c-072582da3a443aa45a7e314dc45f8c3173574962.profdata
+chrome-win64-main-1744016320-6311cc51409eb3a81fd434d24da46f2e290d5edd-6c693ba714627222c6361ef2cf94a43bd92d5f1a.profdata
diff --git a/chrome/common/extensions/api/tab_groups.json b/chrome/common/extensions/api/tab_groups.json
index b78f070..dbd21601 100644
--- a/chrome/common/extensions/api/tab_groups.json
+++ b/chrome/common/extensions/api/tab_groups.json
@@ -21,7 +21,8 @@
           "collapsed": {"type": "boolean", "description": "Whether the group is collapsed. A collapsed group is one whose tabs are hidden."},
           "color": {"$ref": "Color", "description": "The group's color."},
           "title": {"type": "string", "optional": true, "description": "The title of the group."},
-          "windowId": {"type": "integer", "minimum": 0, "description": "The ID of the window that contains the group."}
+          "windowId": {"type": "integer", "minimum": 0, "description": "The ID of the window that contains the group."},
+          "shared": {"nodoc": true, "type": "boolean", "description": "Whether the group is shared."}
         }
       }
     ],
@@ -74,6 +75,12 @@
                 "optional": true,
                 "description": "Match group titles against a pattern."
               },
+              "shared": {
+                "nodoc": true,
+                "type": "boolean",
+                "optional": true,
+                "description": "Whether the group is shared."
+              },
               "windowId": {
                 "type": "integer",
                 "optional": true,
diff --git a/chrome/release_scripts b/chrome/release_scripts
index 0f06c99..ebacc43 160000
--- a/chrome/release_scripts
+++ b/chrome/release_scripts
@@ -1 +1 @@
-Subproject commit 0f06c99991724564da4c9b7e19335c6485818cd4
+Subproject commit ebacc4377d49ec15f4d19e061d5d9ed344cffc1e
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index cd81c160..f040b43 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1564,6 +1564,23 @@
       ]
     }
   }
+
+  if (enable_devtools_frontend) {
+    sources += [ "../browser/devtools/devtools_browsertest.cc" ]
+    deps += [
+      ":sync_integration_test_support",
+      "//chrome/browser/devtools:test_support",
+      "//chrome/browser/ui/autofill",
+      "//components/infobars/content",
+      "//components/javascript_dialogs",
+      "//components/language/core/browser",
+      "//components/variations/service",
+      "//ui/compositor",
+    ]
+    if (!is_android) {
+      deps += [ "//chrome/browser/ui/browser_window" ]
+    }
+  }
 }
 
 if (is_android) {
@@ -2940,7 +2957,6 @@
       "../browser/devtools/device/devtools_android_bridge_browsertest.cc",
       "../browser/devtools/device/port_forwarding_browsertest.cc",
       "../browser/devtools/device/usb/android_usb_browsertest.cc",
-      "../browser/devtools/devtools_browsertest.cc",
       "../browser/devtools/global_confirm_info_bar_browsertest.cc",
       "../browser/devtools/protocol/devtools_autofill_browsertest.cc",
       "../browser/devtools/protocol/devtools_extensions_browsertest.cc",
@@ -6542,6 +6558,7 @@
     "//chrome/browser/optimization_guide:unit_tests",
     "//chrome/browser/payments:unittests",
     "//chrome/browser/permissions",
+    "//chrome/browser/permissions:test_support",
     "//chrome/browser/permissions:unit_tests",
     "//chrome/browser/persisted_state_db:persisted_state_db",
     "//chrome/browser/picture_in_picture",
diff --git a/chrome/test/chromedriver/chrome/chrome.h b/chrome/test/chromedriver/chrome/chrome.h
index 83ec2d9..899a6e4 100644
--- a/chrome/test/chromedriver/chrome/chrome.h
+++ b/chrome/test/chromedriver/chrome/chrome.h
@@ -74,6 +74,11 @@
                            bool w3c_compliant,
                            std::string* window_handle) = 0;
 
+  // Makes new hidden target.
+  virtual Status NewHiddenTarget(const std::string& target_id,
+                                 bool w3c_compliant,
+                                 std::string* window_handle) = 0;
+
   // Gets the rect of the specified WebView
   virtual Status GetWindowRect(const std::string& id, WindowRect* rect) = 0;
 
diff --git a/chrome/test/chromedriver/chrome/chrome_impl.cc b/chrome/test/chromedriver/chrome/chrome_impl.cc
index c6bdc01..1e9a6ac 100644
--- a/chrome/test/chromedriver/chrome/chrome_impl.cc
+++ b/chrome/test/chromedriver/chrome/chrome_impl.cc
@@ -280,6 +280,52 @@
   return Status(kOk);
 }
 
+Status ChromeImpl::NewHiddenTarget(const std::string& target_id,
+                                   bool w3c_compliant,
+                                   std::string* window_handle) {
+  WebView* tab = nullptr;
+  Status status = GetWebViewById(target_id, &tab);
+  if (status.IsError()) {
+    return Status(kNoSuchWindow);
+  }
+
+  base::Value::Dict params;
+  params.Set("url", "about:blank");
+  params.Set("hidden", true);
+
+  base::Value::Dict result;
+  status = devtools_websocket_client_->SendCommandAndGetResult(
+      "Target.createTarget", params, &result);
+  if (status.IsError()) {
+    return status;
+  }
+
+  const std::string* target_id_str = result.FindString("targetId");
+  if (!target_id_str) {
+    return Status(kUnknownError, "no targetId from createTarget");
+  }
+
+  // Refresh ChromeDriver's internal tab list to capture the newly created
+  // tab.
+  std::list<std::string> tab_view_ids;
+  // Hidden targets are only supported in W3C mode.
+  status = GetTopLevelWebViewIds(&tab_view_ids, w3c_compliant);
+  if (status.IsError()) {
+    return status;
+  }
+
+  WebView* new_page = nullptr;
+  status = GetActivePageByWebViewId(*target_id_str, &new_page,
+                                    /*wait_for_page=*/true);
+  if (status.IsError()) {
+    return status;
+  }
+
+  *window_handle = new_page->GetId();
+
+  return Status(kOk);
+}
+
 Status ChromeImpl::NewWindow(const std::string& target_id,
                              WindowType type,
                              bool is_background,
diff --git a/chrome/test/chromedriver/chrome/chrome_impl.h b/chrome/test/chromedriver/chrome/chrome_impl.h
index 87601ac..51fbd73 100644
--- a/chrome/test/chromedriver/chrome/chrome_impl.h
+++ b/chrome/test/chromedriver/chrome/chrome_impl.h
@@ -72,6 +72,9 @@
   Status GetActivePageByWebViewId(const std::string& id,
                                   WebView** active_page_view,
                                   bool wait_for_page) override;
+  Status NewHiddenTarget(const std::string& target_id,
+                         bool w3c_compliant,
+                         std::string* window_handle) override;
   Status NewWindow(const std::string& target_id,
                    WindowType type,
                    bool is_background,
diff --git a/chrome/test/chromedriver/chrome/devtools_client_impl.cc b/chrome/test/chromedriver/chrome/devtools_client_impl.cc
index 63737198..3ec0699 100644
--- a/chrome/test/chromedriver/chrome/devtools_client_impl.cc
+++ b/chrome/test/chromedriver/chrome/devtools_client_impl.cc
@@ -828,7 +828,7 @@
   if (tunnel_session_id_.empty()) {
     return Status{
         kUnknownError,
-        "uanble to send BiDi commands without BiDi server session id"};
+        "unable to send BiDi commands without BiDi server session id"};
   }
   if (!channel.empty()) {
     command.Set("goog:channel", std::move(channel));
diff --git a/chrome/test/chromedriver/chrome/stub_chrome.cc b/chrome/test/chromedriver/chrome/stub_chrome.cc
index 259f6ac..0549ed5 100644
--- a/chrome/test/chromedriver/chrome/stub_chrome.cc
+++ b/chrome/test/chromedriver/chrome/stub_chrome.cc
@@ -46,6 +46,12 @@
   return Status(kOk);
 }
 
+Status StubChrome::NewHiddenTarget(const std::string& target_id,
+                                   bool w3c_compliant,
+                                   std::string* window_handle) {
+  return Status(kOk);
+}
+
 Status StubChrome::NewWindow(const std::string& target_id,
                              WindowType type,
                              bool is_background,
diff --git a/chrome/test/chromedriver/chrome/stub_chrome.h b/chrome/test/chromedriver/chrome/stub_chrome.h
index b71e22b..1a65474 100644
--- a/chrome/test/chromedriver/chrome/stub_chrome.h
+++ b/chrome/test/chromedriver/chrome/stub_chrome.h
@@ -32,6 +32,9 @@
   Status GetActivePageByWebViewId(const std::string& id,
                                   WebView** web_view,
                                   bool wait_for_page) override;
+  Status NewHiddenTarget(const std::string& target_id,
+                         bool w3c_compliant,
+                         std::string* window_handle) override;
   Status NewWindow(const std::string& target_id,
                    WindowType type,
                    bool is_background,
diff --git a/chrome/test/chromedriver/server/chromedriver_server.cc b/chrome/test/chromedriver/server/chromedriver_server.cc
index d574b61..013ff0fc 100644
--- a/chrome/test/chromedriver/server/chromedriver_server.cc
+++ b/chrome/test/chromedriver/server/chromedriver_server.cc
@@ -347,8 +347,10 @@
         "add readable timestamps to log",
         "enable-chrome-logs",
         "show logs from the browser (overrides other logging options)",
-        "bidi-mapper-path",
+        "bidi-mapper-path=PATH",
         "custom bidi mapper path",
+        "debug-bidi-mapper",
+        "(experimental) run bidi mapper in a visible tab for debugging purposes",
 #if BUILDFLAG(IS_LINUX)
         "disable-dev-shm-usage",
         "do not use /dev/shm "
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc
index a6726ef..c4f986b 100644
--- a/chrome/test/chromedriver/session_commands.cc
+++ b/chrome/test/chromedriver/session_commands.cc
@@ -356,37 +356,59 @@
   }
 
   if (session->web_socket_url) {
-    WebView* web_view = nullptr;
-    status = session->GetTargetWindow(&web_view);
-    if (status.IsError())
-      return status;
-    session->bidi_mapper_web_view_id = web_view->GetId();
+    // The webview that will be visible to the user as the initial one.
+    WebView* initial_web_view = nullptr;
+    // The webview that will be used for running BiDi mapper. Can be either
+    // a hidden target or a visible tab.
+    WebView* bidi_mapper_web_view = nullptr;
 
-    // Create a new tab because the default one will be occupied by the
-    // mapper. The new tab is activated and focused.
-    std::string web_view_id;
-    status =
-        session->chrome->NewWindow(session->window, Chrome::WindowType::kTab,
-                                   false, session->w3c_compliant, &web_view_id);
-
+    // Get the currently open web view.
+    status = session->GetTargetWindow(&initial_web_view);
     if (status.IsError()) {
       return status;
     }
 
-    std::unique_ptr<base::Value> result;
-    base::Value::Dict body;
-    body.Set("handle", web_view_id);
-
-    // Even though the new tab is already activated the explicit switch to the
-    // new tab is needed to update the internal state of ChromeDriver properly.
-    status = ExecuteSwitchToWindow(session, body, &result);
+    // Navigate the initial page to `about:blank` to align with the html spec:
+    // https://html.spec.whatwg.org/multipage/document-sequences.html#creating-a-new-browsing-context
+    Timeout timeout(session->page_load_timeout);
+    status = initial_web_view->Load("about:blank", &timeout);
+    if (status.IsError()) {
+      return status;
+    }
+    // Wait until the currently open web view's navigation is over.
+    status = initial_web_view->WaitForPendingNavigations(
+        session->GetCurrentFrameId(), Timeout(session->page_load_timeout),
+        true);
     if (status.IsError()) {
       return status;
     }
 
-    // Wait until the default page navigation is over to prevent the mapper
-    // from being evicted by the navigation.
-    status = web_view->WaitForPendingNavigations(
+    base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
+    // Create a target fot BiDi-CDP mapper. It should be either a visible tab
+    // or a hidden target based on the `--debug-bidi-mapper` switch.
+    if (cmd_line->HasSwitch("debug-bidi-mapper")) {
+      // Create a visible tab.
+      status = session->chrome->NewWindow(session->window,
+        Chrome::WindowType::kTab, true,
+        session->w3c_compliant, &session->bidi_mapper_web_view_id);
+
+    } else {
+      // Create a hidden target.
+      status = session->chrome->NewHiddenTarget(
+          session->window, session->w3c_compliant,
+          &session->bidi_mapper_web_view_id);
+    }
+    if (status.IsError()) {
+      return status;
+    }
+
+    // Set the BiDi mapper web view to the new target.
+    session->chrome->GetWebViewById(session->bidi_mapper_web_view_id,
+                                    &bidi_mapper_web_view);
+
+    // Wait until the initial navigation is over to prevent the mapper from
+    // being evicted by the navigation.
+    status = bidi_mapper_web_view->WaitForPendingNavigations(
         session->GetCurrentFrameId(), Timeout(session->page_load_timeout),
         true);
     if (status.IsError()) {
@@ -394,7 +416,6 @@
     }
 
     // Start the mapper.
-    base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
     base::FilePath bidi_mapper_path =
         cmd_line->GetSwitchValuePath("bidi-mapper-path");
 
@@ -412,8 +433,8 @@
 
     bool enable_unsafe_extension_debugging =
         capabilities.switches.HasSwitch("enable-unsafe-extension-debugging");
-    status = web_view->StartBidiServer(mapper_script,
-                                       enable_unsafe_extension_debugging);
+    status = bidi_mapper_web_view->StartBidiServer(
+        mapper_script, enable_unsafe_extension_debugging);
     if (status.IsError()) {
       return status;
     }
@@ -425,7 +446,7 @@
     bidi_cmd.Set("params", params.Clone());
     bidi_cmd.Set("method", "session.new");
     base::Value::Dict bidi_response;
-    status = web_view->SendBidiCommand(
+    status = bidi_mapper_web_view->SendBidiCommand(
         std::move(bidi_cmd), Timeout(base::Seconds(20)), bidi_response);
     if (status.IsError()) {
       return status;
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index 4ab70ca..627b0fc8 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -7583,7 +7583,7 @@
       options['excludeSwitches'] = ['--enable-logging']
     if chrome_binary is not None:
       options['binary'] = chrome_binary
-    if _MINIDUMP_PATH:
+    if '_MINIDUMP_PATH' in globals() and _MINIDUMP_PATH:
       options['minidumpPath'] =  _MINIDUMP_PATH
     capabilities = {
       'alwaysMatch': {
@@ -8729,13 +8729,13 @@
 
     # We test for a success by expecting a custom error from the
     # custom mapper.
-    self.assertRaisesRegex(Exception,
-                           'unknown error: ' +
-                           'Failed to initialize BiDi Mapper: Error: ' +
-                           'custom bidi mapper error from test_bidi_mapper.js',
-                           self.CreateDriver,
-                           bidi_mapper_path=bidi_mapper_path,
-                           chrome_switches=['--enable-unsafe-extension-debugging'])
+    self.assertRaisesRegex(
+      Exception,
+      'unknown error: Failed to initialize BiDi Mapper: Error: custom bidi' +
+      ' mapper error from test_bidi_mapper.js',
+      self.CreateDriver,
+      bidi_mapper_path=bidi_mapper_path,
+      chrome_switches=['--enable-unsafe-extension-debugging'])
 
 class ClassicTest(ChromeDriverBaseTestWithWebServer):
 
@@ -9499,6 +9499,11 @@
       type=int,
       default=None,
       help='Maximum amount of failed attempts until the test is deemed failed')
+  parser.add_argument(
+      '--debug-bidi-mapper',
+      action='store_true',
+      default=False,
+      help='Run bidi mapper in a visible tab')
 
   ##############################################################################
   # Note for other Chromium based browsers!!!
@@ -9548,6 +9553,8 @@
   additional_args = []
   if options.disable_build_check:
     additional_args.append('--disable-build-check')
+  if options.debug_bidi_mapper:
+    additional_args.append('--debug-bidi-mapper')
 
   global chromedriver_server
   chromedriver_server = server.Server(
diff --git a/chrome/test/data/devtools/dom_warnings_page.html b/chrome/test/data/devtools/dom_warnings_page.html
deleted file mode 100644
index 6b82025..0000000
--- a/chrome/test/data/devtools/dom_warnings_page.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<form>
-  <input id="dup" type="text" autocomplete="username">
-  <input id="dup" type="password" autocomplete="current-password">
-</form>
\ No newline at end of file
diff --git a/chrome/test/data/variations/http_server/css/default.css b/chrome/test/data/variations/http_server/css/default.css
new file mode 100644
index 0000000..f5e97263
--- /dev/null
+++ b/chrome/test/data/variations/http_server/css/default.css
@@ -0,0 +1,407 @@
+/* This is a snapshot of css style from
+https://www.chromium.org/_stylesheets/default.css.
+Its source is available here:
+https://source.chromium.org/chromium/chromium/src/+/main:docs/website/site/_stylesheets/default.scss
+which is CC-Attribute Licensed, but it is actually based on the MIT-licensed
+Andy Bell's "modern reset" https://github.com/hankchizljaw/modern-css-reset
+*/
+
+*,
+*::before,
+*::after {
+  box-sizing: border-box;
+}
+
+body,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+figure,
+blockquote,
+dl,
+dd,
+pre {
+  margin: 0;
+}
+
+body {
+  min-height: 100vh;
+}
+
+ul[role=list],
+ol[role=list] {
+  list-style: none;
+}
+
+ul,
+ol {
+  list-style-position: inside;
+}
+
+a:not([class]) {
+  text-decoration-skip-ink: auto;
+}
+
+img {
+  display: block;
+  height: auto;
+  max-width: 100%;
+}
+
+p img {
+  display: inline-block;
+  vertical-align: sub;
+}
+
+input,
+button,
+textarea,
+select {
+  font: inherit;
+  letter-spacing: inherit;
+  word-spacing: inherit;
+}
+
+iframe {
+  border: 0;
+}
+
+img:not([alt]) {
+  filter: blur(10px);
+}
+
+hr {
+  height: 1px;
+  margin: 0;
+}
+
+@media (prefers-reduced-motion: reduce) {
+  * {
+    animation-duration: 0.01s !important;
+    animation-iteration-count: 1 !important;
+    scroll-behavior: auto !important;
+    transition-duration: 0.01s !important;
+  }
+}
+/* fonts */
+/* colors */
+/* page-wide settings */
+a {
+  color: rgb(0, 102, 204);
+}
+a.disabled {
+  color: rgb(102, 102, 102);
+  text-decoration: none;
+}
+
+b {
+  font-weight: 700;
+}
+
+body {
+  background-color: rgb(247, 247, 247);
+  color: rgb(0, 0, 0);
+  font-family: Arial, Verdana, sans-serif;
+}
+
+code {
+  background: rgb(239, 239, 239);
+  color: rgb(0, 96, 0);
+  font-family: monospace;
+}
+
+em,
+i {
+  font-style: italic;
+}
+
+pre {
+  background: rgb(239, 239, 239);
+  border: 1px solid rgb(211, 211, 211);
+  margin: 1em;
+  padding: 0.5em 1em 0.5em 1em;
+}
+
+header {
+  align-items: center;
+  display: flex;
+  justify-content: space-between;
+  margin: 5px 5px 5px 10px;
+}
+header a {
+  align-items: center;
+  color: rgb(0, 102, 204);
+  display: flex;
+  text-decoration: none;
+}
+header a h2 {
+  width: 100%;
+}
+header img {
+  display: block;
+  margin-right: 10px;
+}
+
+/* main panel */
+#main-wrapper {
+  display: flex;
+}
+
+#sidebar-left {
+  flex: 0 auto;
+  font-size: 12px;
+  line-height: 1.33em;
+  min-width: 160px;
+  width: 160px;
+}
+#sidebar-left section {
+  background-color: rgb(255, 255, 255);
+  margin: 0 5px 6px 5px;
+  padding: 0 0 0 5px;
+}
+#sidebar-left a {
+  color: rgb(0, 102, 204);
+  display: block;
+  text-decoration: none;
+}
+#sidebar-left a.selected {
+  color: black;
+  font-weight: bold;
+}
+#sidebar-left h4 {
+  color: rgb(72, 72, 72);
+  font-weight: 700;
+  font-size: 13px;
+  margin-bottom: 1px;
+  padding: 3px 0 2px 0;
+}
+#sidebar-left #license {
+  background-color: rgb(255, 255, 255);
+  color: rgb(94, 106, 114);
+  font-size: 10px;
+  line-height: normal;
+  margin: 0 5px 6px 5px;
+  padding: 11px 5px 5px 5px;
+}
+#sidebar-left #license a {
+  display: inline;
+  text-decoration: underline;
+}
+#sidebar-left a#edit-this-page {
+  background-color: rgb(3, 25, 79);
+  border: 1px solid rgb(192, 192, 192);
+  color: rgb(255, 255, 255);
+  display: block;
+  font-size: 14px;
+  font-weight: 700;
+  margin: 20px auto;
+  padding: 6px 12px;
+  text-align: center;
+  text-decoration: none;
+  width: 90%;
+}
+
+main {
+  background-color: rgb(255, 255, 255);
+  border: 1px solid rgb(211, 211, 211);
+  flex: 1 100%;
+  font-family: Arial, Verdana, sans-serif;
+  font-size: 13.333px;
+  line-height: 1.3;
+  margin-right: 5px;
+  padding: 20px;
+  /* Rules for particular extensions */
+}
+main a:visited {
+  color: rgb(71, 18, 100);
+}
+main a.header-anchor {
+  color: inherit;
+  text-decoration: inherit;
+}
+main blockquote {
+  background-color: rgb(255, 253, 231);
+  border-left: 0.2em solid rgb(250, 183, 0);
+  color: rgb(0, 0, 0);
+  margin-bottom: 1em;
+  padding: 0.2em 1em;
+}
+main del {
+  background-color: rgb(244, 204, 204);
+  text-decoration: inherit;
+}
+main h1 {
+  font-size: 22px;
+  font-weight: 700;
+  margin: 10px 0 1.4em;
+}
+main h1 a {
+  color: rgb(0, 102, 204);
+}
+main h2 {
+  font-size: 20px;
+  font-weight: 700;
+  margin: 1.2em 0 0.8em 0;
+}
+main h3 {
+  font-size: 16px;
+  font-weight: 700;
+  margin: 1.2em 0 0.7em 0;
+}
+main h4 {
+  font-weight: 700;
+  margin: 1.2em 0 0.6em 0;
+}
+main h4 a {
+  color: rgb(0, 102, 204);
+}
+main h4 i a {
+  color: rgb(0, 102, 204);
+  font-weight: 400;
+}
+main ins {
+  background-color: rgb(217, 234, 211);
+  text-decoration: inherit;
+}
+main p {
+  margin-bottom: 13.33px;
+  margin-top: 1.4em;
+}
+main pre {
+  white-space: break-spaces;
+  word-break: break-all;
+}
+main #title-crumbs {
+  padding: 6px 0 0 10px;
+}
+main #title-crumbs + h3 {
+  margin-top: 6px;
+}
+main ul {
+  display: block;
+  list-style-position: outside;
+  list-style-type: disc;
+  margin-bottom: 1em;
+  margin-top: 1em;
+  padding-left: 40px;
+}
+main ul li {
+  margin-bottom: 5px;
+  margin-top: 5px;
+}
+main ul li > p:first-of-type {
+  display: inline;
+}
+main ul ul {
+  list-style-type: circle;
+  margin-bottom: 0;
+  margin-top: 0;
+}
+main ul ul ul {
+  list-style-type: square;
+}
+main ol {
+  list-style-position: outside;
+  list-style-type: decimal;
+  padding-left: 40px;
+  margin: 1em 0;
+}
+main ol li {
+  margin: 5px 0;
+}
+main ol li p {
+  margin: 0.5em 0;
+}
+main ol li > p:first-of-type {
+  display: inline;
+}
+main ol ul {
+  list-style-type: circle;
+  margin-bottom: 0;
+  margin-top: 0;
+}
+main table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  border-width: 1px solid rgb(217, 217, 217);
+  margin: 1.3em 0 1.3em 0;
+}
+main table td,
+main table th {
+  border: 1px solid rgb(217, 217, 217);
+  padding: 5px 10px 5px 10px;
+  vertical-align: top;
+}
+main nav.subpage-listing {
+  background-color: rgb(241, 241, 241);
+  border: 1px solid rgb(211, 211, 211);
+}
+main nav.subpage-listing details {
+  margin-left: -1em;
+}
+main nav.subpage-listing h4 {
+  margin: inherit;
+  padding: 0.5em 0 0 0.5em;
+}
+main nav.subpage-listing li {
+  font-weight: normal;
+  list-style: none;
+  list-style-image: none;
+  margin-left: 1.2em;
+  padding-left: 1.3em;
+}
+main nav.subpage-listing li a {
+  text-decoration: none;
+}
+main nav.subpage-listing ul {
+  padding-left: 0px;
+}
+main nav.subpage-listing > ul {
+  margin: 0.5em 0 0.5em 0;
+}
+main nav.subpage-listing > ul > li {
+  border-top: 1px solid white;
+  font-weight: bold;
+  margin: 3px 0 3px 0;
+  padding: 2px 0 2px 1.3em;
+}
+main .table-of-contents {
+  border: 1px solid rgb(211, 211, 211);
+  background-color: rgb(241, 241, 241);
+  display: table;
+  font-size: 12px;
+  margin-left: 1em;
+  padding: 1em 2em 1em 1em;
+}
+main .table-of-contents a {
+  text-decoration: none;
+}
+main .table-of-contents > ol::before {
+  content: "Contents";
+  display: block;
+  font-weight: 700;
+  margin: 0 0 0.5em -1em;
+}
+main .table-of-contents ol {
+  line-height: 1.1em;
+  margin: 0;
+  padding-left: 1.2em;
+}
+main .table-of-contents ol li {
+  list-style-type: none;
+}
+main .two-column-container {
+  align-items: flex-start;
+  display: flex;
+}
+main .two-column-container > div.column {
+  flex: 50%;
+  margin: 0;
+  padding-right: 30px;
+}
+
+/*# sourceMappingURL=default.css.map */
diff --git a/chrome/test/data/variations/http_server/favicon.ico b/chrome/test/data/variations/http_server/favicon.ico
new file mode 100644
index 0000000..555715a
--- /dev/null
+++ b/chrome/test/data/variations/http_server/favicon.ico
Binary files differ
diff --git a/chrome/test/data/variations/http_server/index.html b/chrome/test/data/variations/http_server/index.html
index 1a18ecf..7ca6a8a 100644
--- a/chrome/test/data/variations/http_server/index.html
+++ b/chrome/test/data/variations/http_server/index.html
@@ -1,297 +1,81 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" itemscope="" itemtype="http://schema.org/WebPage">
+
+<!DOCTYPE html>
 <head>
-<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
-<meta http-equiv="X-UA-Compatible" content="chrome=1" />
-<script type="text/javascript">/* Copyright 2008 Google. */ (function() { /*
-
-Copyright The Closure Library Authors.
-SPDX-License-Identifier: Apache-2.0
-*/
-(function(){function e(g){this.t={};this.tick=function(h,k,f){this.t[h]=[void 0!=f?f:(new Date).getTime(),k];if(void 0==f)try{window.console.timeStamp("CSI/"+h)}catch(m){}};this.getStartTickTime=function(){return this.t.start[0]};this.tick("start",null,g)}var a;if(window.performance)var d=(a=window.performance.timing)&&a.responseStart;var l=0<d?new e(d):new e;window.jstiming={Timer:e,load:l};if(a){var b=a.navigationStart;0<b&&d>=b&&(window.jstiming.srt=d-b)}if(a){var c=window.jstiming.load;0<b&&d>=
-b&&(c.tick("_wtsrt",void 0,b),c.tick("wtsrt_","_wtsrt",d),c.tick("tbsd_","wtsrt_"))}try{a=null,window.chrome&&window.chrome.csi&&(a=Math.floor(window.chrome.csi().pageT),c&&0<b&&(c.tick("_tbnd",void 0,window.chrome.csi().startE),c.tick("tbnd_","_tbnd",b))),null==a&&window.gtbExternal&&(a=window.gtbExternal.pageT()),null==a&&window.external&&(a=window.external.pageT,c&&0<b&&(c.tick("_tbnd",void 0,window.external.startE),c.tick("tbnd_","_tbnd",b))),a&&(window.jstiming.pt=a)}catch(g){}})(); })()
-</script>
-<link rel="shortcut icon" href="/_/rsrc/1354323194313/favicon.ico" type="image/x-icon" />
-<link rel="apple-touch-icon" href="/_/rsrc/1484148948583/apple-touch-icon.png" type="image/png" />
-<script type="text/javascript">/* Copyright 2008 Google. */ (function() { function d(a){return document.getElementById(a)}window.byId=d;function g(a){return a.replace(/^\s+|\s+$/g,"")}window.trim=g;var h=[],k=0;window.JOT_addListener=function(a,b,c){var f=new String(k++);a={eventName:a,handler:b,compId:c,key:f};h.push(a);return f};window.JOT_removeListenerByKey=function(a){for(var b=0;b<h.length;b++)if(h[b].key==a){h.splice(b,1);break}};window.JOT_removeAllListenersForName=function(a){for(var b=0;b<h.length;b++)h[b].eventName==a&&h.splice(b,1)};
-window.JOT_postEvent=function(a,b,c){var f={eventName:a,eventSrc:b||{},payload:c||{}};if(window.JOT_fullyLoaded)for(b=h.length,c=0;c<b&&c<h.length;c++){var e=h[c];e&&e.eventName==a&&(f.listenerCompId=e.compId||"",(e="function"==typeof e.handler?e.handler:window[e.handler])&&e(f))}else window.JOT_delayedEvents.push({eventName:a,eventSrc:b,payload:c})};window.JOT_delayedEvents=[];window.JOT_fullyLoaded=!1;
-window.JOT_formatRelativeToNow=function(a,b){a=((new Date).getTime()-a)/6E4;if(1440<=a||0>a)return null;var c=0;60<=a&&(a/=60,c=2);2<=a&&c++;return b?window.JOT_siteRelTimeStrs[c].replace("__duration__",Math.floor(a)):window.JOT_userRelTimeStrs[c].replace("__duration__",Math.floor(a))}; })()
-</script>
-<script type="text/javascript">
-                window.jstiming.load.tick('scl');
-              </script>
-<meta name="title" content="The Chromium Projects" />
-<meta itemprop="name" content="The Chromium Projects" />
-<meta property="og:title" content="The Chromium Projects" />
-<meta name="description" content="Home of the Chromium Open Source Project" />
-<meta itemprop="description" content="Home of the Chromium Open Source Project" />
-<meta id="meta-tag-description" property="og:description" content="Home of the Chromium Open Source Project" />
-<style type="text/css">
-</style>
-<link rel="stylesheet" type="text/css" href="https://ssl.gstatic.com/sites/p/8ef4a1/system/app/themes/beigeandblue/standard-css-beigeandblue-ltr-ltr.css" />
-<link rel="stylesheet" type="text/css" href="/_/rsrc/1638433988000/system/app/css/overlay.css?cb=beigeandblueundefineda100%25%25150goog-ws-leftthemedefaultstandard" />
-<link rel="stylesheet" type="text/css" href="/_/rsrc/1638433988000/system/app/css/camelot/allthemes-view.css" />
-<!--[if IE]>
-          <link rel="stylesheet" type="text/css" href="/system/app/css/camelot/allthemes%2die.css" />
-        <![endif]-->
-<title>The Chromium Projects</title>
-<meta itemprop="image" content="image/logo_chrome_color_1x_web_32dp.png" />
-<meta property="og:image" content="image/logo_chrome_color_1x_web_32dp.png" />
-<script type="text/javascript">
-                window.jstiming.load.tick('cl');
-              </script>
+  <meta charset="utf-8">
+  <title>Home</title>
+  <link rel="stylesheet" href="/css/default.css">
 </head>
-<body xmlns="http://www.google.com/ns/jotspot" id="body" class=" en            ">
-<div id="sites-page-toolbar" class="sites-header-divider">
-<div xmlns="http://www.w3.org/1999/xhtml" id="sites-status" class="sites-status" style="display:none;"><div id="sites-notice" class="sites-notice" role="status" aria-live="assertive"> </div></div>
-</div>
-<div id="sites-chrome-everything-scrollbar">
-<div id="sites-chrome-everything" class="">
-<div id="sites-chrome-page-wrapper" style="direction: ltr">
-<div id="sites-chrome-page-wrapper-inside">
-<div xmlns="http://www.w3.org/1999/xhtml" id="sites-chrome-header-wrapper" style="height:auto;">
-<table id="sites-chrome-header" class="sites-layout-hbox" cellspacing="0" style="height:auto;">
-<tr class="sites-header-primary-row" id="sites-chrome-userheader">
-<td id="sites-header-title" class="" role="banner"><div class="sites-header-cell-buffer-wrapper"><a href="https://www.chromium.org/" id="sites-chrome-userheader-logo"><img id="logo-img-id" src="images/icon-chromium-96.png" alt="The Chromium Projects" class="sites-logo  " /></a><h2><a href="https://www.chromium.org/" dir="ltr" id="sites-chrome-userheader-title">The Chromium Projects</a></h2></div></td><td class="sites-layout-searchbox  "><div class="sites-header-cell-buffer-wrapper"><form id="sites-searchbox-form" action="/system/app/pages/search" role="search"><input type="hidden" id="sites-searchbox-scope" name="scope" value="search-site" /><input type="text" id="jot-ui-searchInput" name="q" size="20" value="" aria-label="Search this site" /><div id="sites-searchbox-button-set" class="goog-inline-block"><div role="button" id="sites-searchbox-search-button" class="goog-inline-block jfk-button jfk-button-standard" tabindex="0">Search this site</div></div></form></div></td>
-</tr>
-<tr class="sites-header-secondary-row" id="sites-chrome-horizontal-nav">
-<td colspan="2" id="sites-chrome-header-horizontal-nav-container" role="navigation">
-</td>
-</tr>
-</table>
-</div>
-<div id="sites-chrome-main-wrapper">
-<div id="sites-chrome-main-wrapper-inside">
-<table id="sites-chrome-main" class="sites-layout-hbox" cellspacing="0" cellpadding="{scmCellpadding}" border="0">
-<tr>
-<td id="sites-chrome-sidebar-left" class="sites-layout-sidebar-left initial" style="width:150px">
-<div xmlns="http://www.w3.org/1999/xhtml" id="COMP_7648876402527094" class="sites-embed" role="navigation">
-  <div class="sites-embed-content sites-sidebar-nav">
-    <ul role="navigation" jotId="navList">
-      <li class="nav-first ">
-        <div class="current-bg" jotId="wuid:gx:10ae433dadbbab13" dir="ltr" style="padding-left: 5px;">Home</div>
-      </li>
-      <li class="">
-        <div dir="ltr" style="padding-left: 5px;"><a href="/Home" jotId="wuid:gx:43582b9d2029d3af"
-            class="sites-navigation-link">Chromium</a></div>
-      </li>
-      <li class="">
-        <div dir="ltr" style="padding-left: 5px;"><a href="/chromium-os" jotId="wuid:gx:83df2ab1f8880ba"
-            class="sites-navigation-link">ChromiumOS</a></div>
-      </li>
-    </ul>
-  </div>
-</div>
-<div xmlns="http://www.w3.org/1999/xhtml" id="COMP_14720868319272995" class="sites-embed" role="navigation"><h4 class="sites-embed-title">Quick links</h4><div class="sites-embed-content sites-sidebar-nav"><ul role="navigation" jotId="navList"><li class="nav-first "><div dir="ltr" style="padding-left: 5px;"><a href="https://www.chromium.org/for-testers/bug-reporting-guidelines" class="sites-navigation-link">Report bugs</a></div></li><li class=""><div dir="ltr" style="padding-left: 5px;"><a href="https://www.chromium.org/developers/discussion-groups" class="sites-navigation-link">Discuss</a></div></li><li class=""><div dir="ltr" style="padding-left: 5px;"><a href="/system/app/pages/sitemap/hierarchy" jotId="wuid:gx:c638c2cb1e1732c" class="sites-navigation-link">Sitemap</a></div></li></ul></div></div>
-<div xmlns="http://www.w3.org/1999/xhtml" id="COMP_19690813310444355" class="sites-embed" role="navigation"><h4 class="sites-embed-title">Other sites</h4><div class="sites-embed-content sites-sidebar-nav"><ul role="navigation" jotId="navList"><li class="nav-first "><div dir="ltr" style="padding-left: 5px;"><a href="https://blog.chromium.org/" class="sites-navigation-link">Chromium Blog</a></div></li><li class=""><div dir="ltr" style="padding-left: 5px;"><a href="https://developer.chrome.com/extensions" class="sites-navigation-link">Google Chrome Extensions</a></div></li></ul></div></div>
-<div xmlns="http://www.w3.org/1999/xhtml" id="COMP_19695218559354544" class="sites-embed" role="complementary"><h4 class="sites-embed-title"></h4><div class="sites-embed-content sites-embed-content-sidebar-textbox"><div dir="ltr"><span style="font-size:x-small">Except as otherwise </span><a href="https://developers.google.com/site-policies.html#restrictions"><span style="font-size:x-small">noted</span></a><span style="font-size:x-small">, the content of this page is licensed under a </span><a href="https://creativecommons.org/licenses/by/2.5/"><span style="font-size:x-small">Creative Commons Attribution 2.5 license</span></a><span style="font-size:x-small">, and examples are licensed under the </span><a href="https://chromium.googlesource.com/chromium/src/+/master/LICENSE" target="_blank"><span style="font-size:x-small">BSD License</span></a><span style="font-size:x-small">.<br /></span></div></div></div>
-</td>
-<td id="sites-canvas-wrapper">
-<div id="sites-canvas" role="main">
-<div id="goog-ws-editor-toolbar-container"> </div>
-<div xmlns="http://www.w3.org/1999/xhtml" id="title-crumbs" style="display: none;">
-</div>
-<h3 xmlns="http://www.w3.org/1999/xhtml" id="sites-page-title-header" style="display: none;" align="left">
-<span id="sites-page-title" dir="ltr" tabindex="-1" style="outline: none">Home</span>
-</h3>
-<div id="sites-canvas-main" class="sites-canvas-main">
-<div id="sites-canvas-main-content">
-<div xmlns="http://www.w3.org/1999/xhtml" class="sites-layout-name-two-column-hf sites-layout-vbox">
-  <div class="sites-layout-tile sites-tile-name-header">
-    <div dir="ltr">The Chromium projects include Chromium and ChromiumOS, the open-source projects behind the <a
-        href="https://www.google.com/chrome">Google Chrome</a> browser and Google ChromeOS, respectively. This site
-      houses the documentation and code related to the Chromium projects and is intended for developers interested in
-      learning about and contributing to the open-source projects.<br /></div>
-  </div>
-  <table cellspacing="0" class="sites-layout-hbox">
-    <tbody>
-      <tr>
-        <td class="sites-layout-tile sites-tile-name-content-1">
-          <div dir="ltr"><b><a href="https://www.chromium.org/Home"><span
-                  style="font-size:large">Chromium</span></a><span style="font-size:large"> </span></b><br />
-Chromium is an open-source browser project that aims to build a
-safer, faster, and more stable way for all users to experience
-the web. This site contains design documents, architecture overviews,
-testing information, and more to help you learn to build and work with
-the Chromium source code.
-<div><br />
-</div>
-<div>
-<table border="0" cellspacing="0" style="border-width:0px;border-collapse:collapse">
-<tbody>
-<tr>
-<td style="width:622px;height:55px" valign="bottom">
-<table border="0" cellspacing="0" style="border-width:0px;border-collapse:collapse">
-<tbody>
-<tr>
-<td><a href="https://www.google.com/chrome" imageanchor="1" style="font-size:13.3333px;background-color:rgb(255,255,255)"><img alt="https://www.google.com/chrome" border="0" src="images/logo_chrome_color_1x_web_32dp.png" /></a></td>
-<td style="padding:5px"><div style="display:block;text-align:left"><span style="font-size:10pt;background-color:transparent">Looking for Google Chrome?</span></div>
-<br />
-<a href="https://www.google.com/chrome">Download Google Chrome</a></td>
-</tr>
-</tbody>
-</table>
-</td>
-</tr>
-</tbody>
-</table>
-</div>
-</div>
-</td>
-<td class="sites-layout-tile sites-tile-name-content-2">
-  <div dir="ltr"><b><a href="https://www.chromium.org/chromium-os"><span
-          style="font-size:large">ChromiumOS</span></a></b>
-    <div>ChromiumOS is an open-source project that aims to provide a fast, simple, and more secure computing experience
-      for people who spend most of their time on the web. Learn more about the <a
-        href="https://googleblog.blogspot.com/2009/11/releasing-chromium-os-open-source.html">project goals</a>, obtain
-      the latest build, and learn how you can get involved, submit code, and file bugs.</div>
-<div><br />
-</div>
-<div>
-<table border="0" cellspacing="0" style="border-width:0px;border-collapse:collapse">
-<tbody>
-<tr>
-<td style="width:619px;height:55px" valign="bottom">
-<table border="0" cellspacing="0" style="border-width:0px;border-collapse:collapse" width="100%">
-<tbody>
-<tr>
-<td valign="bottom" width="50%">
-<table border="0" cellspacing="0" style="border-width:0px;border-collapse:collapse">
-<tbody>
-<tr>
-<td><div style="display:block;text-align:left"><a href="https://www.google.com/chromeos" imageanchor="1"><img alt="https://www.google.com/chromeos" border="0" src="images/logo_chrome_color_1x_web_32dp.png" /></a></div>
-</td>
-<td style="padding:5px">Looking for Google ChromeOS devices?<br />
-<br />
-<a href="https://www.google.com/chromeos">Visit the Google ChromeOS site</a></td>
-</tr>
-</tbody>
-</table>
-</td>
-</tr>
-</tbody>
-</table>
-</td>
-</tr>
-</tbody>
-</table>
-</div></div></td></tr></tbody></table><div class="sites-layout-tile sites-tile-name-footer sites-layout-empty-tile"><div dir="ltr"><br /></div></div></div>
-</div>
-</div>
-<div id="sites-canvas-bottom-panel">
-<div id="sites-attachments-container">
-</div>
-</div>
-</div>
-</td>
-</tr>
-</table>
-</div>
-</div>
-<div id="sites-chrome-footer-wrapper">
-<div id="sites-chrome-footer-wrapper-inside">
-<div id="sites-chrome-footer">
-</div>
-</div>
-</div>
-</div>
-</div>
-<div id="sites-chrome-adminfooter-container">
-<div xmlns="http://www.w3.org/1999/xhtml" class="sites-adminfooter" role="navigation"><p><a class="sites-system-link" href="https://accounts.google.com/ServiceLogin?continue=https://sites.google.com/a/chromium.org/dev/chromium-projects&amp;service=jotspot">Sign in</a><span aria-hidden="true">|</span><a class="sites-system-link" href="/system/app/pages/recentChanges">Recent Site Activity</a><span aria-hidden="true">|</span><a class="sites-system-link" href="https://sites.google.com/a/chromium.org/dev/system/app/pages/reportAbuse" target="_blank">Report Abuse</a><span aria-hidden="true">|</span><a class="sites-system-link" href="javascript:;" onclick="window.open(webspace.printUrl)">Print Page</a><span aria-hidden="true">|</span><span class="sites-system-link">Powered By</span> <b class="powered-by"><a href="http://sites.google.com/site">Google Sites</a></b></p></div>
-</div>
-</div>
-</div>
-<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
-    window.jstiming.load.tick('sjl');
-  </script>
-<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
-    window.jstiming.load.tick('jl');
-  </script>
-<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
-                    sites.Searchbox.initialize(
-                        'sites-searchbox-search-button',
-                        {"object":[]}['object'],
-                        'search-site',
-                        {"label":"Configure search options...","url":"/system/app/pages/admin/settings"});
-                  </script>
-<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
-      gsites.HoverPopupMenu.createSiteDropdownMenus('sites-header-nav-dropdown', false);
-    </script>
-<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript" defer="true">
-            JOT_setupNav("7648876402527094", "Navigation", false);
-            JOT_addListener('titleChange', 'JOT_NAVIGATION_titleChange', 'COMP_7648876402527094');
-          </script>
-<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript" defer="true">
-            JOT_setupNav("14720868319272995", "Quick links", false);
-            JOT_addListener('titleChange', 'JOT_NAVIGATION_titleChange', 'COMP_14720868319272995');
-          </script>
-<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript" defer="true">
-            JOT_setupNav("19690813310444355", "Other sites", false);
-            JOT_addListener('titleChange', 'JOT_NAVIGATION_titleChange', 'COMP_19690813310444355');
-          </script>
-<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
-  setTimeout(function() {
-    var fingerprint = gsites.date.TimeZone.getFingerprint([1109635200000, 1128902400000, 1130657000000, 1143333000000, 1143806400000, 1145000000000, 1146380000000, 1152489600000, 1159800000000, 1159500000000, 1162095000000, 1162075000000, 1162105500000]);
-    gsites.Xhr.send('https://www.chromium.org/_/tz', null, null, 'GET', null, null, { afjstz: fingerprint });
-  }, 500);
-</script>
-<script xmlns="http://www.w3.org/1999/xhtml">
-                    window.onload = function() {
-                      if (false) {
-                        JOT_setMobilePreview();
-                      }
-                      var loadTimer = window.jstiming.load;
-                      loadTimer.tick("ol");
-                      loadTimer["name"] = "load," + webspace.page.type + ",user_page";
-                      window.jstiming.report(loadTimer, {}, 'https://gg.google.com/csi');
-                    }
-                  </script>
-<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
-        JOT_insertAnalyticsCode(false,
-            false);
-      </script>
-<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
-    var maestroRunner = new gsites.pages.view.SitesMaestroRunner(
-        webspace, "en");
-    maestroRunner.initListeners();
-    maestroRunner.installEditRender();
-  </script>
-<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript" defer="true">
-  //<![CDATA[
-    // Decorate any fastUI buttons on the page with a class of 'goog-button'.
-    if (webspace.user.hasWriteAccess) {
-      JOT_decorateButtons();
-    }
 
-    // Fires delayed events.
-    (function() {
-      JOT_fullyLoaded = true;
-      var delayedEvents = JOT_delayedEvents;
-      for (var x = 0; x < delayedEvents.length; x++) {
-        var event = delayedEvents[x];
-        JOT_postEvent(event.eventName, event.eventSrc, event.payload);
-      }
-      JOT_delayedEvents = null;
-      JOT_postEvent('pageLoaded');
-    })();
-  //]]>
-</script>
-<script xmlns="http://www.w3.org/1999/xhtml" type="text/javascript">
-    JOT_postEvent('decorateGvizCharts');
-  </script>
-<script type="text/javascript">
-          JOT_setupPostRenderingManager();
-        </script>
-<script type="text/javascript">
-          JOT_postEvent('renderPlus', null, 'sites-chrome-main');
-        </script>
-<script type="text/javascript">
-          sites.codeembed.init();
-        </script>
-<div id="server-timer-div" style="display:none"> </div>
-<script type="text/javascript">
-          window.jstiming.load.tick('render');
-          JOT_postEvent('usercontentrendered', this);
-        </script>
-</body>
-</html>
+<header>
+  <a href="/">
+    <img alt="the Chromium logo" src="images/icon-chromium-96.png" width="48" height="48">
+    <h2>The Chromium Projects</h2>
+  </a>
+  <div id="search"></div>
+</header>
+
+<div id="main-wrapper">
+  <nav id="sidebar-left">
+    <section>
+      <a class="selected" href="/chromium-projects">Home</a>
+      <a href="/Home">Chromium</a>
+      <a href="/chromium-os">ChromiumOS</a>
+    </section>
+    <section>
+      <h4>Quick links</h4>
+      <a href="/for-testers/bug-reporting-guidelines">Report bugs</a>
+      <a href="/developers/discussion-groups">Discuss</a>
+    </section>
+    <section>
+      <h4>Other sites</h4>
+      <a href="https://blog.chromium.org/">Chromium Blog</a>
+      <a href="https://developer.chrome.com/extensions">Google Chrome Extensions</a>
+    </section>
+    <section id="license" role="complementary">
+      Except as otherwise
+      <a href="https://developers.google.com/site-policies.html#restrictions">noted</a>,
+      the content of this page is licensed under a
+      <a href="https://creativecommons.org/licenses/by/2.5/">Creative Commons Attribution 2.5 license</a>,
+      and examples are licensed under the
+      <a href="https://chromium.googlesource.com/chromium/src/+/HEAD/LICENSE">BSD License</a>.
+    </section>
+    <section id="privacy" role="complementary">
+      <a href="https://policies.google.com/privacy">Privacy</a>
+    </section>
+    <a id="edit-this-page" href="https://edit.chromium.org/edit?repo=chromium/website/main&file=site/chromium-projects/index.md&cloneRepo=chromium/website:refs/heads/main&fullPath=chromium/site/chromium-projects/index.md">Edit this page</a>
+  </nav>
+  <main>
+    <div class="breadcrumbs">
+    </div>
+  <p>The Chromium projects include Chromium and ChromiumOS, the open-source projects
+behind the <a href="https://www.google.com/chrome">Google Chrome</a> browser and Google
+ChromeOS, respectively. This site houses the documentation and code related to
+the Chromium projects and is intended for developers interested in learning
+about and contributing to the open-source projects.</p>
+<div class="two-column-container">
+<div class="column">
+<h2 id="chromium" tabindex="-1"><a class="header-anchor" href="#chromium"><a href="/Home">Chromium</a></a></h2>
+<p>Chromium is an open-source browser project that aims to build a safer, faster,
+and more stable way for all users to experience the web. This site contains
+design documents, architecture overviews, testing information, and more to help
+you learn to build and work with the Chromium source code.</p>
+<p><a href="https://www.google.com/chrome"><img src="images/logo_chrome_color_1x_web_32dp.png" alt=""></a></p>
+<p>Looking for Google Chrome?</p>
+<p><a href="https://www.google.com/chrome">Download Google Chrome</a></p>
+</div>
+<div class="column">
+<h2 id="chromiumos" tabindex="-1"><a class="header-anchor" href="#chromiumos"><a href="/chromium-os">ChromiumOS</a></a></h2>
+<p>ChromiumOS is an open-source project that aims to provide a fast, simple, and
+more secure computing experience for people who spend most of their time on the
+web. Learn more about the <a href="https://googleblog.blogspot.com/2009/11/releasing-chromium-os-open-source.html">project
+goals</a>,
+obtain the latest build, and learn how you can get involved, submit code, and
+file bugs.</p>
+<p><a href="https://www.google.com/chrome"><img src="images/logo_chrome_color_1x_web_32dp.png" alt=""></a></p>
+<p>Looking for Google ChromeOS devices?</p>
+<p><a href="https://www.google.com/chromeos">Visit the Google ChromeOS site</a></p>
+</div>
+</div>
+
+  </main>
+</div>
\ No newline at end of file
diff --git a/chrome/test/data/webui/glic/api_test.ts b/chrome/test/data/webui/glic/api_test.ts
index 3818397..facb5f0 100644
--- a/chrome/test/data/webui/glic/api_test.ts
+++ b/chrome/test/data/webui/glic/api_test.ts
@@ -520,6 +520,31 @@
     await this.advanceToNextStep(minSize);
   }
 
+  async testOpenOsMediaPermissionSettings() {
+    assertTrue(!!this.host.openOsPermissionSettingsMenu);
+    this.host.openOsPermissionSettingsMenu('media');
+  }
+
+  async testOpenOsGeoPermissionSettings() {
+    assertTrue(!!this.host.openOsPermissionSettingsMenu);
+    this.host.openOsPermissionSettingsMenu('geolocation');
+  }
+
+  async testIncompatiblePermissionWithOsPermissionSettings() {
+    assertTrue(!!this.host.openOsPermissionSettingsMenu);
+    this.host.openOsPermissionSettingsMenu('notifications');
+  }
+
+  async testGetOsMicrophonePermissionStatusAllowed() {
+    assertTrue(!!this.host.getOsMicrophonePermissionStatus);
+    assertTrue(await this.host.getOsMicrophonePermissionStatus());
+  }
+
+  async testGetOsMicrophonePermissionStatusNotAllowed() {
+    assertTrue(!!this.host.getOsMicrophonePermissionStatus);
+    assertFalse(await this.host.getOsMicrophonePermissionStatus());
+  }
+
   private async waitForPanelState(kind: PanelStateKind): Promise<void> {
     assertTrue(!!this.host.getPanelState);
     await observeSequence(this.host.getPanelState())
@@ -825,4 +850,3 @@
 }
 
 main();
-
diff --git a/chromecast/browser/cast_permission_manager.cc b/chromecast/browser/cast_permission_manager.cc
index 22b9c53..93df38c 100644
--- a/chromecast/browser/cast_permission_manager.cc
+++ b/chromecast/browser/cast_permission_manager.cc
@@ -139,9 +139,10 @@
     base::OnceCallback<void(const std::vector<blink::mojom::PermissionStatus>&)>
         callback) {
   std::vector<blink::mojom::PermissionStatus> permission_statuses;
-  for (auto permission : request_description.permissions) {
+  for (const auto& permission : request_description.permissions) {
     permission_statuses.push_back(GetPermissionStatusInternal(
-        permission, render_frame_host, request_description.requesting_origin));
+        blink::PermissionDescriptorToPermissionType(permission),
+        render_frame_host, request_description.requesting_origin));
   }
   std::move(callback).Run(permission_statuses);
 }
@@ -156,9 +157,10 @@
     base::OnceCallback<void(const std::vector<blink::mojom::PermissionStatus>&)>
         callback) {
   std::vector<blink::mojom::PermissionStatus> permission_statuses;
-  for (auto permission : request_description.permissions) {
+  for (const auto& permission : request_description.permissions) {
     permission_statuses.push_back(GetPermissionStatusInternal(
-        permission, render_frame_host,
+        blink::PermissionDescriptorToPermissionType(permission),
+        render_frame_host,
         render_frame_host->GetLastCommittedOrigin().GetURL()));
   }
   std::move(callback).Run(permission_statuses);
diff --git a/chromeos/ash/components/boca/babelorca/BUILD.gn b/chromeos/ash/components/boca/babelorca/BUILD.gn
index 24b64f8e6a..58786f82 100644
--- a/chromeos/ash/components/boca/babelorca/BUILD.gn
+++ b/chromeos/ash/components/boca/babelorca/BUILD.gn
@@ -117,6 +117,7 @@
 
   deps = [
     ":babelorca",
+    "//ash/constants",
     "//base",
     "//components/live_caption",
     "//components/live_caption:constants",
@@ -124,8 +125,10 @@
     "//components/live_caption:utils",
     "//components/prefs",
     "//components/prefs:test_support",
+    "//components/soda",
     "//media/mojo/mojom:speech_recognition",
     "//net/traffic_annotation",
+    "//testing/gmock",
     "//third_party/protobuf:protobuf_lite",
     "//ui/native_theme",
   ]
diff --git a/chromeos/ash/components/boca/babelorca/soda_installer_unittest.cc b/chromeos/ash/components/boca/babelorca/soda_installer_unittest.cc
index 5623bbd..408917d 100644
--- a/chromeos/ash/components/boca/babelorca/soda_installer_unittest.cc
+++ b/chromeos/ash/components/boca/babelorca/soda_installer_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/functional/callback_helpers.h"
 #include "base/test/bind.h"
 #include "base/test/scoped_feature_list.h"
+#include "chromeos/ash/components/boca/babelorca/testing_utils.h"
 #include "components/live_caption/pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "components/prefs/testing_pref_service.h"
@@ -30,34 +31,6 @@
 constexpr char kTeacherSetting[] = "teacher";
 }  // namespace
 
-class MockSodaInstaller : public speech::SodaInstaller {
- public:
-  MockSodaInstaller() = default;
-  ~MockSodaInstaller() override = default;
-
-  MOCK_METHOD(base::FilePath, GetSodaBinaryPath, (), (const, override));
-  MOCK_METHOD(base::FilePath,
-              GetLanguagePath,
-              (const std::string& language),
-              (const, override));
-  MOCK_METHOD(void,
-              InstallLanguage,
-              (const std::string& language, PrefService* global_prefs),
-              (override));
-  MOCK_METHOD(void,
-              UninstallLanguage,
-              (const std::string& language, PrefService* global_prefs),
-              (override));
-  MOCK_METHOD(void, InstallSoda, (PrefService * global_prefs), (override));
-  MOCK_METHOD(std::vector<std::string>,
-              GetAvailableLanguages,
-              (),
-              (const, override));
-
- protected:
-  MOCK_METHOD(void, UninstallSoda, (PrefService * global_prefs), (override));
-};
-
 class BabelOrcaSodaInstallerTest : public testing::Test {
  public:
   BabelOrcaSodaInstallerTest() {
@@ -76,18 +49,10 @@
     speech::SodaInstaller::GetInstance()->RegisterLocalStatePrefs(
         global_prefs_.registry());
 
-    // During Soda installer's init method it checks these prefs, if none are
-    // enabled and `kClassManagementToolsAvailabilitySetting` is not set to
-    // teacher then it will not install SODA.  By setting everything except for
-    // the classroom management setting to false we ensure that SODA will
-    // install even if just school tools teacher is enabled on the current
-    // profile.
-    profile_prefs_.registry()->RegisterBooleanPref(::prefs::kLiveCaptionEnabled,
-                                                   false);
-    profile_prefs_.registry()->RegisterBooleanPref(
-        ash::prefs::kAccessibilityDictationEnabled, false);
-    profile_prefs_.registry()->RegisterBooleanPref(
-        ash::prefs::kProjectorCreationFlowEnabled, false);
+    RegisterSodaPrefsForTesting(&profile_prefs_);
+    // this is set here because the SessionManager test registers this
+    // preference and both tests depend on the RegisterSodaPrefsForTesting
+    // method.
     profile_prefs_.registry()->RegisterStringPref(
         ash::prefs::kClassManagementToolsAvailabilitySetting, kTeacherSetting);
 
@@ -354,7 +319,6 @@
           SodaInstaller::InstallationStatus available) {
         speech_recognition_available = available;
       }));
-  ASSERT_TRUE(speech_recognition_available.has_value());
   EXPECT_EQ(speech_recognition_available,
             SodaInstaller::InstallationStatus::kLanguageUnavailable);
 }
diff --git a/chromeos/ash/components/boca/babelorca/testing_utils.cc b/chromeos/ash/components/boca/babelorca/testing_utils.cc
index c8efdf0..2e5ddf0 100644
--- a/chromeos/ash/components/boca/babelorca/testing_utils.cc
+++ b/chromeos/ash/components/boca/babelorca/testing_utils.cc
@@ -4,6 +4,7 @@
 
 #include "chromeos/ash/components/boca/babelorca/testing_utils.h"
 
+#include "ash/constants/ash_pref_names.h"
 #include "chromeos/ash/components/boca/babelorca/pref_names.h"
 #include "components/live_caption/pref_names.h"
 #include "components/prefs/pref_registry_simple.h"
@@ -32,4 +33,22 @@
       kTranslationTargetLocale);
 }
 
+void RegisterSodaPrefsForTesting(TestingPrefServiceSimple* pref_service) {
+  // During Soda installer's init method it checks these prefs, if none are
+  // enabled and `kClassManagementToolsAvailabilitySetting` is not set to
+  // teacher then it will not install SODA.  By setting everything except for
+  // the classroom management setting to false we ensure that SODA will
+  // install even if just school tools teacher is enabled on the current
+  // profile.
+  pref_service->registry()->RegisterBooleanPref(::prefs::kLiveCaptionEnabled,
+                                                false);
+  pref_service->registry()->RegisterBooleanPref(
+      ::ash::prefs::kAccessibilityDictationEnabled, false);
+  pref_service->registry()->RegisterBooleanPref(
+      ::ash::prefs::kProjectorCreationFlowEnabled, false);
+}
+
+MockSodaInstaller::MockSodaInstaller() = default;
+MockSodaInstaller::~MockSodaInstaller() = default;
+
 }  // namespace ash::babelorca
diff --git a/chromeos/ash/components/boca/babelorca/testing_utils.h b/chromeos/ash/components/boca/babelorca/testing_utils.h
index aaea3efb..e88048d 100644
--- a/chromeos/ash/components/boca/babelorca/testing_utils.h
+++ b/chromeos/ash/components/boca/babelorca/testing_utils.h
@@ -5,6 +5,9 @@
 #ifndef CHROMEOS_ASH_COMPONENTS_BOCA_BABELORCA_TESTING_UTILS_H_
 #define CHROMEOS_ASH_COMPONENTS_BOCA_BABELORCA_TESTING_UTILS_H_
 
+#include "components/soda/soda_installer.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
 class TestingPrefServiceSimple;
 
 namespace ash::babelorca {
@@ -20,6 +23,36 @@
 
 void RegisterPrefsForTesting(TestingPrefServiceSimple* pref_service);
 
+void RegisterSodaPrefsForTesting(TestingPrefServiceSimple* pref_service);
+
+class MockSodaInstaller : public speech::SodaInstaller {
+ public:
+  MockSodaInstaller();
+  ~MockSodaInstaller() override;
+
+  MOCK_METHOD(base::FilePath, GetSodaBinaryPath, (), (const, override));
+  MOCK_METHOD(base::FilePath,
+              GetLanguagePath,
+              (const std::string& language),
+              (const, override));
+  MOCK_METHOD(void,
+              InstallLanguage,
+              (const std::string& language, PrefService* global_prefs),
+              (override));
+  MOCK_METHOD(void,
+              UninstallLanguage,
+              (const std::string& language, PrefService* global_prefs),
+              (override));
+  MOCK_METHOD(void, InstallSoda, (PrefService * global_prefs), (override));
+  MOCK_METHOD(std::vector<std::string>,
+              GetAvailableLanguages,
+              (),
+              (const, override));
+
+ protected:
+  MOCK_METHOD(void, UninstallSoda, (PrefService * global_prefs), (override));
+};
+
 }  // namespace ash::babelorca
 
 #endif  // CHROMEOS_ASH_COMPONENTS_BOCA_BABELORCA_TESTING_UTILS_H_
diff --git a/chromeos/crosapi/mojom/account_manager.mojom b/chromeos/crosapi/mojom/account_manager.mojom
index 720faf9..cbb8546d 100644
--- a/chromeos/crosapi/mojom/account_manager.mojom
+++ b/chromeos/crosapi/mojom/account_manager.mojom
@@ -7,7 +7,7 @@
 // versioning. Bump this value before making a change to any of the following
 // interfaces / enums.
 //
-// Next MinVersion: 17
+// Next MinVersion: 18
 
 module crosapi.mojom;
 
@@ -91,13 +91,14 @@
     kCredentialsMissing = 3,
   };
 
-  // Next value: 5
+  // Next value: 6
   enum ScopeLimitedUnrecoverableErrorReason {
     kInvalidGrantRaptError = 0,
     kInvalidScope = 1,
     kRestrictedClient = 2,
     kAdminPolicyEnforced = 3,
     kRemoteConsentResolutionRequired = 4,
+    kAccessDenied = 5,
   };
 
   State state@0;
diff --git a/chromeos/strings/chromeos_strings_af.xtb b/chromeos/strings/chromeos_strings_af.xtb
index 70e3a1bd..a9437ac 100644
--- a/chromeos/strings/chromeos_strings_af.xtb
+++ b/chromeos/strings/chromeos_strings_af.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Portaalstatus</translation>
 <translation id="5763838252932650682">Herbegin en dateer <ph name="APP_NAME" /> tans op</translation>
 <translation id="576835345334454681">Verhoog skermhelderheid</translation>
-<translation id="5775340474232476653">Jou onderwyser het die klas geëindig</translation>
 <translation id="5779818640587041940">Hou skerm aan wanneer opname gedoen word</translation>
 <translation id="57838592816432529">Demp</translation>
 <translation id="5784136236926853061">Hoë HTTP-traagheid</translation>
diff --git a/chromeos/strings/chromeos_strings_am.xtb b/chromeos/strings/chromeos_strings_am.xtb
index be3eb40..864ecf44 100644
--- a/chromeos/strings/chromeos_strings_am.xtb
+++ b/chromeos/strings/chromeos_strings_am.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">የመተላለፊያ ሁኔታ</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" />ን እንደገና በመጀመር እና በማዘመን ላይ</translation>
 <translation id="576835345334454681">የማሳያ ብሩህነት መጨመሪያ</translation>
-<translation id="5775340474232476653">መምህርዎ ክፍሉ እንዲያበቃ አድርገዋል</translation>
 <translation id="5779818640587041940">በሚቀዱበት ጊዜ ማያ ገጹን እንደበራ ያቆዩ</translation>
 <translation id="57838592816432529">ድምፅ ይዝጉ</translation>
 <translation id="5784136236926853061">ከፍተኛ የኤችቲቲፒ የስርዓተ ምላሽ ጊዜ</translation>
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb
index a635487..1dd7376 100644
--- a/chromeos/strings/chromeos_strings_ar.xtb
+++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -351,6 +351,7 @@
 <translation id="2438248248625638801">جارٍ إنشاء عناوين التسجيلات</translation>
 <translation id="2446553403094072641">دقة النقطة العائمة</translation>
 <translation id="2448312741937722512">النوع</translation>
+<translation id="2448857983905133469">أدوات الدراسة</translation>
 <translation id="2468124392950503650">اختَر طلبًا لإنشاء الصور أو اطّلِع على <ph name="BEGIN_LINK_PROMPTING_GUIDE" />دليل الطلبات<ph name="END_LINK_PROMPTING_GUIDE" /></translation>
 <translation id="2472215337771558851">‏حسِّن نصًا سبقت كتابته أو أنشئ مسوّدة باستخدام ميزة "مساعدة في الكتابة" التي تستند إلى تكنولوجيات الذكاء الاصطناعي من Google</translation>
 <translation id="2475982808118771221">حدث خطأ</translation>
@@ -449,6 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> ميلي أمبير</translation>
 <translation id="3056720590588772262">نقطة النهاية</translation>
 <translation id="3060579846059757016">المخططات</translation>
+<translation id="3060798442805232711">الميكروفون مُستخدَم حاليًا بواسطة "أدوات الدراسة"</translation>
 <translation id="3061850252076394168">تفعيل ميزة "سماع الاختيار"</translation>
 <translation id="3066772729299747758">يوم الثلاثاء</translation>
 <translation id="3069085583900247081">تعذّر إجراء اختبار</translation>
@@ -910,6 +912,7 @@
 <translation id="5170568018924773124">العرض في المجلد</translation>
 <translation id="517075088756846356">عليك فصل كابل الطاقة الخاص بجهاز "<ph name="DEVICE_NAME" />" عن مصدر الطاقة وإعادة توصيله لمواصلة عملية التحديث</translation>
 <translation id="5180108905184566358">أشجار الباوباب</translation>
+<translation id="5180431943345994173">أزال المُعلّم المحتوى في "أدوات الدراسة"</translation>
 <translation id="5180712487038406644">معبِّر</translation>
 <translation id="5190187232518914472">‏استرجِع ذكرياتك المفضّلة. ولإضافة أي ألبومات أو تعديلها، انتقِل إلى <ph name="LINK_BEGIN" />صور Google<ph name="LINK_END" />.</translation>
 <translation id="5212593641110061691">Tabloid</translation>
@@ -1003,6 +1006,7 @@
 <translation id="5628106863521633649">اللغات المتاحة</translation>
 <translation id="5630438231335788050">فن الباوهاوس</translation>
 <translation id="5631759159893697722">نبذة مختصرة</translation>
+<translation id="5655084389678168978">أضاف المُعلّم محتوى جديدًا في "أدوات الدراسة"</translation>
 <translation id="5655283760733841251">زيادة سطوع لوحة المفاتيح</translation>
 <translation id="5655296450510165335">تسجيل الجهاز</translation>
 <translation id="5655776422854483175">ما مِن مهام طباعة</translation>
@@ -1026,7 +1030,6 @@
 <translation id="5760715441271661976">حالة المدخل</translation>
 <translation id="5763838252932650682">إعادة تشغيل "<ph name="APP_NAME" />" وتحديثه</translation>
 <translation id="576835345334454681">زيادة سطوع الشاشة</translation>
-<translation id="5775340474232476653">أنهى مُعلّمك الصف</translation>
 <translation id="5779818640587041940">إبقاء الشاشة مشغَّلة أثناء التسجيل</translation>
 <translation id="57838592816432529">كتم الصوت</translation>
 <translation id="5784136236926853061">‏وقت استجابة بروتوكول HTTP طويل.</translation>
@@ -1529,6 +1532,7 @@
 <translation id="7971535376154084247">عناصر التحكّم العامة</translation>
 <translation id="7977800524392185497">للانضمام إلى شبكة <ph name="NETWORK_NAME" />، انتقِل إلى "الإعدادات".</translation>
 <translation id="7978412674231730200">مفتاح خاص</translation>
+<translation id="7979468455552394856">الطلاب متّصلون حاليًا بجلسة "أدوات الدراسة"</translation>
 <translation id="7982789257301363584">الشبكة</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{تم بدء تشغيل "<ph name="APP_NAME_1" />" تلقائيًا}zero{تم بدء تشغيل # تطبيق تلقائيًا}two{تم بدء تشغيل تطبيقَين تلقائيًا}few{تم بدء تشغيل # تطبيقات تلقائيًا}many{تم بدء تشغيل # تطبيقًا تلقائيًا}other{تم بدء تشغيل # تطبيق تلقائيًا}}</translation>
 <translation id="7994702968232966508">‏طريقة EAP</translation>
diff --git a/chromeos/strings/chromeos_strings_as.xtb b/chromeos/strings/chromeos_strings_as.xtb
index 91c7f199..f4ca1b535 100644
--- a/chromeos/strings/chromeos_strings_as.xtb
+++ b/chromeos/strings/chromeos_strings_as.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">প’ৰ্টেল ষ্টে’ট</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> ৰিষ্টাৰ্ট কৰি আপডে’ট কৰি থকা হৈছে</translation>
 <translation id="576835345334454681">ডিছপ্লে’ৰ উজ্জ্বলতা আপ</translation>
-<translation id="5775340474232476653">আপোনাৰ শিক্ষকে ক্লাছটো শেষ কৰিছে</translation>
 <translation id="5779818640587041940">ৰেকৰ্ড কৰোঁতে স্ক্ৰীন অন ৰাখক</translation>
 <translation id="57838592816432529">মিউট কৰক</translation>
 <translation id="5784136236926853061">HTTPৰ উচ্চ বিলম্বতা</translation>
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb
index 15d1957..9eca66c 100644
--- a/chromeos/strings/chromeos_strings_az.xtb
+++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Portal Vəziyyəti</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> yenidən başladılır və güncəllənir</translation>
 <translation id="576835345334454681">Displey parlaqlığını artırın</translation>
-<translation id="5775340474232476653">Müəllim dərsi sonlandırıb</translation>
 <translation id="5779818640587041940">Qeydə alarkən ekranı yanılı saxlayın</translation>
 <translation id="57838592816432529">Səssiz</translation>
 <translation id="5784136236926853061">Yüksək HTTP gecikməsi</translation>
diff --git a/chromeos/strings/chromeos_strings_be.xtb b/chromeos/strings/chromeos_strings_be.xtb
index ec875b2..47af344 100644
--- a/chromeos/strings/chromeos_strings_be.xtb
+++ b/chromeos/strings/chromeos_strings_be.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Стан партала</translation>
 <translation id="5763838252932650682">Перазапуск і абнаўленне праграмы "<ph name="APP_NAME" />"</translation>
 <translation id="576835345334454681">Павялічыць яркасць дысплэя</translation>
-<translation id="5775340474232476653">Занятак па курсе скончаны выкладчыкам</translation>
 <translation id="5779818640587041940">Захоўваць экран уключаным падчас запісу</translation>
 <translation id="57838592816432529">Выключыць</translation>
 <translation id="5784136236926853061">Вялікая затрымка HTTP-запытаў</translation>
diff --git a/chromeos/strings/chromeos_strings_bg.xtb b/chromeos/strings/chromeos_strings_bg.xtb
index da67fa7..6534fda 100644
--- a/chromeos/strings/chromeos_strings_bg.xtb
+++ b/chromeos/strings/chromeos_strings_bg.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Състояние на портала</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> се рестартира и актуализира</translation>
 <translation id="576835345334454681">Увеличаване на яркостта на дисплея</translation>
-<translation id="5775340474232476653">Преподавателят ви е приключил урока</translation>
 <translation id="5779818640587041940">Предотвратяване на изключването на екрана по време на запис</translation>
 <translation id="57838592816432529">Заглушаване</translation>
 <translation id="5784136236926853061">Голямо забавяне на HTTP</translation>
diff --git a/chromeos/strings/chromeos_strings_bn.xtb b/chromeos/strings/chromeos_strings_bn.xtb
index 7353877..3558070 100644
--- a/chromeos/strings/chromeos_strings_bn.xtb
+++ b/chromeos/strings/chromeos_strings_bn.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">পোর্টালের স্থিতি</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> রিস্টার্ট ও আপডেট করা হচ্ছে</translation>
 <translation id="576835345334454681">ডিসপ্লের উজ্জ্বলতা বাড়ানোর বোতাম</translation>
-<translation id="5775340474232476653">আপনার শিক্ষক ক্লাস করানো শেষ করেছেন</translation>
 <translation id="5779818640587041940">রেকর্ডিংয়ের সময় স্ক্রিন চালু রাখুন</translation>
 <translation id="57838592816432529">মিউট করুন</translation>
 <translation id="5784136236926853061">HTTP লেটেন্সি বেশি</translation>
diff --git a/chromeos/strings/chromeos_strings_bs.xtb b/chromeos/strings/chromeos_strings_bs.xtb
index 94418b96..6d6277539 100644
--- a/chromeos/strings/chromeos_strings_bs.xtb
+++ b/chromeos/strings/chromeos_strings_bs.xtb
@@ -450,7 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> mA</translation>
 <translation id="3056720590588772262">Krajnja tačka</translation>
 <translation id="3060579846059757016">Konture</translation>
-<translation id="3060798442805232711">Alati za predmet upotrebljavaju vaš mikrofon</translation>
+<translation id="3060798442805232711">Alati za predmet koriste vaš mikrofon</translation>
 <translation id="3061850252076394168">omogućavanje funkcije Odaberite za govor</translation>
 <translation id="3066772729299747758">u utorak</translation>
 <translation id="3069085583900247081">Test nije uspio</translation>
@@ -912,7 +912,7 @@
 <translation id="5170568018924773124">Prikaži u folderu</translation>
 <translation id="517075088756846356">Iskopčajte kabl za napajanje uređaja <ph name="DEVICE_NAME" /> i ponovo ga priključite da nastavite postupak ažuriranja</translation>
 <translation id="5180108905184566358">stabla baobaba</translation>
-<translation id="5180431943345994173">Vaš je nastavnik uklonio sadržaj u alatima za predmet</translation>
+<translation id="5180431943345994173">Nastavnik je uklonio sadržaj iz alata za predmet</translation>
 <translation id="5180712487038406644">Izražajno</translation>
 <translation id="5190187232518914472">Ponovo doživite omiljene uspomene. Da dodate ili uredite albume, idite u <ph name="LINK_BEGIN" />Google Fotografije<ph name="LINK_END" />.</translation>
 <translation id="5212593641110061691">Tabloid</translation>
@@ -1006,7 +1006,7 @@
 <translation id="5628106863521633649">Dostupni jezici</translation>
 <translation id="5630438231335788050">bauhaus</translation>
 <translation id="5631759159893697722">sažetak</translation>
-<translation id="5655084389678168978">Vaš je nastavnik dodao novi sadržaj u alate za predmet</translation>
+<translation id="5655084389678168978">Nastavnik je dodao novi sadržaj u alate za predmet</translation>
 <translation id="5655283760733841251">Pojačavanje osvjetljenja tastature</translation>
 <translation id="5655296450510165335">Prijava uređaja</translation>
 <translation id="5655776422854483175">Nema nijednog zadatka štampanja</translation>
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">Stanje portala</translation>
 <translation id="5763838252932650682">Ponovno pokretanje i ažuriranje aplikacije <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Pojačavanje osvjetljenja ekrana</translation>
-<translation id="5775340474232476653">Nastavnik je završio predmet</translation>
 <translation id="5779818640587041940">Ostavi uključen ekran prilikom snimanja</translation>
 <translation id="57838592816432529">Isključi zvuk</translation>
 <translation id="5784136236926853061">Visoka HTTP latentnost</translation>
@@ -1533,7 +1532,7 @@
 <translation id="7971535376154084247">Opće kontrole</translation>
 <translation id="7977800524392185497">Da se pridružite <ph name="NETWORK_NAME" /> mreži, idite u Postavke</translation>
 <translation id="7978412674231730200">Privatni ključ</translation>
-<translation id="7979468455552394856">Alati za predmet povezani su s učenicima</translation>
+<translation id="7979468455552394856">Alati za predmet su povezani s učenicima</translation>
 <translation id="7982789257301363584">Mreža</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{Aplikacija "<ph name="APP_NAME_1" />" je automatski pokrenuta}one{# aplikacija je automatski pokrenuta}few{# aplikacije su automatski pokrenute}other{# aplikacija je automatski pokrenuto}}</translation>
 <translation id="7994702968232966508">EAP metoda</translation>
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb
index 151b9dd..a114530 100644
--- a/chromeos/strings/chromeos_strings_ca.xtb
+++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Estat del portal</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> s'està reiniciant i actualitzant</translation>
 <translation id="576835345334454681">Augmenta la brillantor de la pantalla</translation>
-<translation id="5775340474232476653">El professor ha finalitzat la classe</translation>
 <translation id="5779818640587041940">Mantén la pantalla activada durant la gravació</translation>
 <translation id="57838592816432529">Silencia</translation>
 <translation id="5784136236926853061">La latència d'HTTP és alta</translation>
diff --git a/chromeos/strings/chromeos_strings_cs.xtb b/chromeos/strings/chromeos_strings_cs.xtb
index c41115b..5b24af9 100644
--- a/chromeos/strings/chromeos_strings_cs.xtb
+++ b/chromeos/strings/chromeos_strings_cs.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Stav portálu</translation>
 <translation id="5763838252932650682">Restartování a aktualizace aplikace <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Zvýšit jas displeje</translation>
-<translation id="5775340474232476653">Učitel ukončil výuku</translation>
 <translation id="5779818640587041940">Při nahrávání nechat zapnutou obrazovku</translation>
 <translation id="57838592816432529">Ztlumit</translation>
 <translation id="5784136236926853061">Vysoká latence požadavků HTTP</translation>
diff --git a/chromeos/strings/chromeos_strings_cy.xtb b/chromeos/strings/chromeos_strings_cy.xtb
index 4a8d2a5..8dc39c8 100644
--- a/chromeos/strings/chromeos_strings_cy.xtb
+++ b/chromeos/strings/chromeos_strings_cy.xtb
@@ -351,6 +351,7 @@
 <translation id="2438248248625638801">Creu teitlau recordiadau</translation>
 <translation id="2446553403094072641">Cywirdeb pwynt rhydd</translation>
 <translation id="2448312741937722512">Math</translation>
+<translation id="2448857983905133469">Offer Dosbarth</translation>
 <translation id="2468124392950503650">Dewiswch anogwr i greu neu weld y <ph name="BEGIN_LINK_PROMPTING_GUIDE" />canllaw anogwr<ph name="END_LINK_PROMPTING_GUIDE" /></translation>
 <translation id="2472215337771558851">Defnyddiwch Helpu fi i ysgrifennu i greu drafft neu fireinio gwaith sy'n bodoli eisoes, wedi'i bweru gan AI Google</translation>
 <translation id="2475982808118771221">Bu gwall</translation>
@@ -449,6 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" />mA</translation>
 <translation id="3056720590588772262">Diweddbwynt</translation>
 <translation id="3060579846059757016">Amlinelliadau</translation>
+<translation id="3060798442805232711">Mae Offer Dosbarth yn defnyddio eich meicroffon</translation>
 <translation id="3061850252076394168">galluogi dewis i siarad</translation>
 <translation id="3066772729299747758">ar ddydd Mawrth</translation>
 <translation id="3069085583900247081">Gwnaeth y prawf fethu</translation>
@@ -910,6 +912,7 @@
 <translation id="5170568018924773124">Dangos yn y ffolder</translation>
 <translation id="517075088756846356">Dadblygiwch ac ail-blygiwch y cebl pŵer <ph name="DEVICE_NAME" /> i barhau â'r broses ddiweddaru</translation>
 <translation id="5180108905184566358">coed baobab</translation>
+<translation id="5180431943345994173">Mae eich athro wedi tynnu cynnwys yn Offer Dosbarth</translation>
 <translation id="5180712487038406644">Mynegiannol</translation>
 <translation id="5190187232518914472">Ail-fyw eich hoff atgofion. I ychwanegu neu olygu albymau, ewch i <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation>
 <translation id="5212593641110061691">Tabloid</translation>
@@ -1003,6 +1006,7 @@
 <translation id="5628106863521633649">Ieithoedd sydd ar gael</translation>
 <translation id="5630438231335788050">bauhaus</translation>
 <translation id="5631759159893697722">crynodeb</translation>
+<translation id="5655084389678168978">Mae eich athro wedi ychwanegu cynnwys newydd yn Offer Dosbarth</translation>
 <translation id="5655283760733841251">Disgleirdeb y bysellfwrdd i fyny</translation>
 <translation id="5655296450510165335">Cofrestru dyfais</translation>
 <translation id="5655776422854483175">Dim tasgau argraffu</translation>
@@ -1026,7 +1030,6 @@
 <translation id="5760715441271661976">Cyflwr y Porth</translation>
 <translation id="5763838252932650682">Ailgychwyn a diweddaru <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Disgleirdeb y sgrîn i fyny</translation>
-<translation id="5775340474232476653">Mae eich athro wedi gorffen dosbarth</translation>
 <translation id="5779818640587041940">Cadw'r sgrîn ymlaen wrth recordio</translation>
 <translation id="57838592816432529">Distewi</translation>
 <translation id="5784136236926853061">Cuddni HTTP uchel</translation>
@@ -1529,6 +1532,7 @@
 <translation id="7971535376154084247">Rheolyddion cyffredinol</translation>
 <translation id="7977800524392185497">I ymuno â rhwydwaith <ph name="NETWORK_NAME" />, ewch i'r Gosodiadau</translation>
 <translation id="7978412674231730200">Allwedd breifat</translation>
+<translation id="7979468455552394856">Mae Offer Dosbarth yn gysylltiedig â myfyrwyr</translation>
 <translation id="7982789257301363584">Rhwydwaith</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{Dechreuwyd ‘<ph name="APP_NAME_1" />' yn awtomatig}zero{Dechreuwyd # apiau yn awtomatig}two{Dechreuwyd # ap yn awtomatig}few{Dechreuwyd # ap yn awtomatig}many{Dechreuwyd # ap yn awtomatig}other{Dechreuwyd # ap yn awtomatig}}</translation>
 <translation id="7994702968232966508">Dull EAP</translation>
diff --git a/chromeos/strings/chromeos_strings_da.xtb b/chromeos/strings/chromeos_strings_da.xtb
index a41eaf2a..346527716 100644
--- a/chromeos/strings/chromeos_strings_da.xtb
+++ b/chromeos/strings/chromeos_strings_da.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Tilstand for portal</translation>
 <translation id="5763838252932650682">Genstarter og opdaterer <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Øg skærmens lysstyrke</translation>
-<translation id="5775340474232476653">Din underviser har afsluttet lektionen</translation>
 <translation id="5779818640587041940">Sørg for, at skærmen er tændt, mens du optager</translation>
 <translation id="57838592816432529">Slå lyden fra</translation>
 <translation id="5784136236926853061">Stor HTTP-forsinkelse</translation>
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb
index a8f11e2..11f36694 100644
--- a/chromeos/strings/chromeos_strings_de.xtb
+++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">Portal-Status</translation>
 <translation id="5763838252932650682">„<ph name="APP_NAME" />“ neu starten und aktualisieren</translation>
 <translation id="576835345334454681">Displayhelligkeit erhöhen</translation>
-<translation id="5775340474232476653">Deine Lehrkraft hat den Kurs beendet</translation>
 <translation id="5779818640587041940">Bildschirm bei Aufnahme anlassen</translation>
 <translation id="57838592816432529">Stummschalten</translation>
 <translation id="5784136236926853061">Hohe HTTP-Latenz</translation>
diff --git a/chromeos/strings/chromeos_strings_el.xtb b/chromeos/strings/chromeos_strings_el.xtb
index 19b1fe0..3748985 100644
--- a/chromeos/strings/chromeos_strings_el.xtb
+++ b/chromeos/strings/chromeos_strings_el.xtb
@@ -351,6 +351,7 @@
 <translation id="2438248248625638801">Δημιουργία τίτλων εγγραφής</translation>
 <translation id="2446553403094072641">Ακρίβεια κινητής υποδιαστολής</translation>
 <translation id="2448312741937722512">Τύπος</translation>
+<translation id="2448857983905133469">Εργαλεία για την τάξη</translation>
 <translation id="2468124392950503650">Επιλέξτε μια οδηγία για δημιουργία ή δείτε τον <ph name="BEGIN_LINK_PROMPTING_GUIDE" />οδηγό οδηγιών<ph name="END_LINK_PROMPTING_GUIDE" /></translation>
 <translation id="2472215337771558851">Χρησιμοποιήστε τη λειτουργία Βοήθησέ με να γράψω, για να δημιουργήσετε ένα πρόχειρο ή να τελειοποιήσετε μια υπάρχουσα εργασία, με την υποστήριξη του Google AI</translation>
 <translation id="2475982808118771221">Παρουσιάστηκε σφάλμα</translation>
@@ -449,6 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> mA</translation>
 <translation id="3056720590588772262">Σημείο λήξης</translation>
 <translation id="3060579846059757016">Βασικά σημεία</translation>
+<translation id="3060798442805232711">Τα Εργαλεία για την τάξη χρησιμοποιούν το μικρόφωνό σας</translation>
 <translation id="3061850252076394168">ενεργοποίηση λειτουργίας Επιλέξτε για αυτόματη ανάγνωση</translation>
 <translation id="3066772729299747758">την Τρίτη</translation>
 <translation id="3069085583900247081">Αποτυχία δοκιμής</translation>
@@ -910,6 +912,7 @@
 <translation id="5170568018924773124">Εμφάνιση στο φάκελο</translation>
 <translation id="517075088756846356">Αποσυνδέστε και επανασυνδέστε το καλώδιο τροφοδοσίας <ph name="DEVICE_NAME" /> για να συνεχίσετε τη διαδικασία ενημέρωσης</translation>
 <translation id="5180108905184566358">δέντρα μπαομπάμπ</translation>
+<translation id="5180431943345994173">Ο καθηγητής σας έχει καταργήσει περιεχόμενο στα Εργαλεία για την τάξη</translation>
 <translation id="5180712487038406644">Εκφραστικός</translation>
 <translation id="5190187232518914472">Ξαναζήστε τις αγαπημένες σας αναμνήσεις. Για προσθήκη ή επεξεργασία λευκωμάτων, μεταβείτε στις <ph name="LINK_BEGIN" />Φωτογραφίες Google<ph name="LINK_END" />.</translation>
 <translation id="5212593641110061691">Tabloid</translation>
@@ -1003,6 +1006,7 @@
 <translation id="5628106863521633649">Διαθέσιμες γλώσσες</translation>
 <translation id="5630438231335788050">μπάουχαους</translation>
 <translation id="5631759159893697722">περίληψη</translation>
+<translation id="5655084389678168978">Ο καθηγητής σας πρόσθεσε νέο περιεχόμενο στα Εργαλεία για την τάξη</translation>
 <translation id="5655283760733841251">Αύξηση φωτεινότητας πληκτρολογίου</translation>
 <translation id="5655296450510165335">Εγγραφή συσκευής</translation>
 <translation id="5655776422854483175">Δεν υπάρχουν εργασίες εκτύπωσης</translation>
@@ -1026,7 +1030,6 @@
 <translation id="5760715441271661976">Κατάσταση πύλης</translation>
 <translation id="5763838252932650682">Επανεκκίνηση και ενημέρωση της εφαρμογής <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Αύξηση φωτεινότητας οθόνης</translation>
-<translation id="5775340474232476653">Ο καθηγητής σας ολοκλήρωσε το μάθημα</translation>
 <translation id="5779818640587041940">Διατήρηση ενεργοποίησης οθόνης κατά την εγγραφή</translation>
 <translation id="57838592816432529">Σίγαση</translation>
 <translation id="5784136236926853061">Υψηλός λανθάνων χρόνος HTTP</translation>
@@ -1529,6 +1532,7 @@
 <translation id="7971535376154084247">Γενικοί έλεγχοι</translation>
 <translation id="7977800524392185497">Για να συμμετάσχετε σε ένα δίκτυο <ph name="NETWORK_NAME" />, μεταβείτε στις Ρυθμίσεις.</translation>
 <translation id="7978412674231730200">Ιδιωτικό κλειδί</translation>
+<translation id="7979468455552394856">Τα Εργαλεία για την τάξη είναι συνδεδεμένα με τους φοιτητές/μαθητές</translation>
 <translation id="7982789257301363584">Δίκτυο</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{Η εφαρμογή <ph name="APP_NAME_1" /> ξεκίνησε αυτόματα}other{# εφαρμογές ξεκίνησαν αυτόματα}}</translation>
 <translation id="7994702968232966508">Μέθοδος EAP</translation>
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb
index e0750c2..aaa8c86 100644
--- a/chromeos/strings/chromeos_strings_en-GB.xtb
+++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Portal state</translation>
 <translation id="5763838252932650682">Restarting and updating <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Display brightness up</translation>
-<translation id="5775340474232476653">Your teacher has ended class</translation>
 <translation id="5779818640587041940">Keep screen on when recording</translation>
 <translation id="57838592816432529">Mute</translation>
 <translation id="5784136236926853061">High HTTP latency</translation>
diff --git a/chromeos/strings/chromeos_strings_es-419.xtb b/chromeos/strings/chromeos_strings_es-419.xtb
index 76b62ee..9664d6e 100644
--- a/chromeos/strings/chromeos_strings_es-419.xtb
+++ b/chromeos/strings/chromeos_strings_es-419.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Estado del portal</translation>
 <translation id="5763838252932650682">Se está reiniciando y actualizando <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Aumentar el brillo de la pantalla</translation>
-<translation id="5775340474232476653">El profesor finalizó la clase</translation>
 <translation id="5779818640587041940">Mantener la pantalla encendida durante la grabación</translation>
 <translation id="57838592816432529">Silenciar</translation>
 <translation id="5784136236926853061">Latencia de HTTP alta</translation>
diff --git a/chromeos/strings/chromeos_strings_es.xtb b/chromeos/strings/chromeos_strings_es.xtb
index ba47d8c..ded543b5 100644
--- a/chromeos/strings/chromeos_strings_es.xtb
+++ b/chromeos/strings/chromeos_strings_es.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Estado de portal</translation>
 <translation id="5763838252932650682">Reiniciando y actualizando <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Aumentar el brillo de la pantalla</translation>
-<translation id="5775340474232476653">Tu profesor ha terminado la clase</translation>
 <translation id="5779818640587041940">Mantener la pantalla encendida al grabar</translation>
 <translation id="57838592816432529">Silenciar</translation>
 <translation id="5784136236926853061">Latencia de HTTP alta</translation>
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb
index d137d91..a8994b9 100644
--- a/chromeos/strings/chromeos_strings_et.xtb
+++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Portaali olek</translation>
 <translation id="5763838252932650682">Rakenduse <ph name="APP_NAME" /> taaskäivitamine ja värskendamine</translation>
 <translation id="576835345334454681">Ekraanikuva ereduse suurendamine</translation>
-<translation id="5775340474232476653">Õpetaja lõpetas tunni</translation>
 <translation id="5779818640587041940">Hoidke salvestamise ajal ekraan sees</translation>
 <translation id="57838592816432529">Vaigista</translation>
 <translation id="5784136236926853061">Pikk HTTP latentsusaeg</translation>
diff --git a/chromeos/strings/chromeos_strings_eu.xtb b/chromeos/strings/chromeos_strings_eu.xtb
index cb790c5d..7cc52e5 100644
--- a/chromeos/strings/chromeos_strings_eu.xtb
+++ b/chromeos/strings/chromeos_strings_eu.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Atariaren egoera</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> berrabiarazten eta eguneratzen</translation>
 <translation id="576835345334454681">Pantailaren distira igotzeko tekla</translation>
-<translation id="5775340474232476653">Irakasleak klasea amaitu du</translation>
 <translation id="5779818640587041940">Mantendu pantaila piztuta grabaketa abian den bitartean</translation>
 <translation id="57838592816432529">Desaktibatu audioa</translation>
 <translation id="5784136236926853061">HTTP eskaeren latentzia luzea da</translation>
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb
index f14bc1f..9f71b39 100644
--- a/chromeos/strings/chromeos_strings_fa.xtb
+++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -351,6 +351,7 @@
 <translation id="2438248248625638801">درحال ایجاد عنوان‌های ضبط</translation>
 <translation id="2446553403094072641">دقت نقطه شناور</translation>
 <translation id="2448312741937722512">نوع</translation>
+<translation id="2448857983905133469">ابزارهای کلاسی</translation>
 <translation id="2468124392950503650">پیام‌واره موردنظر را برای ایجاد کردن انتخاب کنید یا <ph name="BEGIN_LINK_PROMPTING_GUIDE" />راهنمای پیام‌واره‌ها<ph name="END_LINK_PROMPTING_GUIDE" /> را مشاهده کنید</translation>
 <translation id="2472215337771558851">‏بااستفاده از «کمک به نوشتن»، پیش‌نویس تهیه کنید یا کار موجود را پالایش کنید؛ از هوش مصنوعی Google بهره می‌گیرد</translation>
 <translation id="2475982808118771221">یک خطا روی داد</translation>
@@ -449,6 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> میلی‌آمپر</translation>
 <translation id="3056720590588772262">نقطه پایان</translation>
 <translation id="3060579846059757016">رئوس مطالب</translation>
+<translation id="3060798442805232711">«ابزارهای کلاسی» درحال استفاده کردن از میکروفون شما است</translation>
 <translation id="3061850252076394168">فعال کردن «انتخاب برای شنیدن»</translation>
 <translation id="3066772729299747758">در روز سه‌شنبه</translation>
 <translation id="3069085583900247081">آزمایش ناموفق بود</translation>
@@ -910,6 +912,7 @@
 <translation id="5170568018924773124">نمایش در پوشه</translation>
 <translation id="517075088756846356">برای ادامه فرایند به‌روزرسانی، کابل برق <ph name="DEVICE_NAME" /> را جدا و دوباره وصل کنید</translation>
 <translation id="5180108905184566358">درختان بائوباب</translation>
+<translation id="5180431943345994173">معلم شما محتوایی را از «ابزارهای کلاسی» برداشته است</translation>
 <translation id="5180712487038406644">زنده</translation>
 <translation id="5190187232518914472">‏خاطرات دلخواهتان را دوباره زنده کنید. برای افزودن یا ویرایش کردن آلبوم‌ها، به <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> بروید.</translation>
 <translation id="5212593641110061691">Tabloid</translation>
@@ -1003,6 +1006,7 @@
 <translation id="5628106863521633649">زبان‌های دردسترس</translation>
 <translation id="5630438231335788050">باوهاوس</translation>
 <translation id="5631759159893697722">انتزاعی</translation>
+<translation id="5655084389678168978">معلم شما محتوای جدیدی به «ابزارهای کلاسی» اضافه کرده است</translation>
 <translation id="5655283760733841251">افزایش روشنایی صفحه‌کلید</translation>
 <translation id="5655296450510165335">ثبت‌نام دستگاه</translation>
 <translation id="5655776422854483175">هیچ کار چاپی وجود ندارد</translation>
@@ -1026,7 +1030,6 @@
 <translation id="5760715441271661976">وضعیت درگاه</translation>
 <translation id="5763838252932650682">درحال بازراه‌اندازی و به‌روزرسانی <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">افزایش روشنایی نمایشگر</translation>
-<translation id="5775340474232476653">معلم شما کلاس را تمام کرد</translation>
 <translation id="5779818640587041940">روشن ماندن صفحه‌نمایش درحین ضبط</translation>
 <translation id="57838592816432529">بی‌صدا کردن</translation>
 <translation id="5784136236926853061">‏تأخیر زیاد HTTP</translation>
@@ -1529,6 +1532,7 @@
 <translation id="7971535376154084247">کنترل‌های عمومی</translation>
 <translation id="7977800524392185497">برای پیوستن به <ph name="NETWORK_NAME" />، به «تنظیمات» بروید</translation>
 <translation id="7978412674231730200">کلید خصوصی</translation>
+<translation id="7979468455552394856">«ابزارهای کلاسی» به محصلان متصل است</translation>
 <translation id="7982789257301363584">شبکه</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{«<ph name="APP_NAME_1" />» به‌طور خودکار اجرا شد}one{# برنامه به‌طور خودکار اجرا شد}other{# برنامه به‌طور خودکار اجرا شد}}</translation>
 <translation id="7994702968232966508">‏روش EAP</translation>
diff --git a/chromeos/strings/chromeos_strings_fi.xtb b/chromeos/strings/chromeos_strings_fi.xtb
index 70b7ae6..a5e9ca49 100644
--- a/chromeos/strings/chromeos_strings_fi.xtb
+++ b/chromeos/strings/chromeos_strings_fi.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Portaalitila</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> käynnistetään uudelleen ja päivitetään</translation>
 <translation id="576835345334454681">Lisää näytön kirkkautta</translation>
-<translation id="5775340474232476653">Opettaja on päättänyt oppitunnin</translation>
 <translation id="5779818640587041940">Pidä näyttö päällä tallennuksen aikana</translation>
 <translation id="57838592816432529">Mykistä</translation>
 <translation id="5784136236926853061">Suuri HTTP-viive</translation>
diff --git a/chromeos/strings/chromeos_strings_fil.xtb b/chromeos/strings/chromeos_strings_fil.xtb
index 302f5ae..7c38ec1 100644
--- a/chromeos/strings/chromeos_strings_fil.xtb
+++ b/chromeos/strings/chromeos_strings_fil.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">Status ng Portal</translation>
 <translation id="5763838252932650682">Nire-restart at ina-update ang <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Taasan ang liwanag ng display</translation>
-<translation id="5775340474232476653">Tinapos na ng iyong guro ang klase</translation>
 <translation id="5779818640587041940">Panatilihing naka-on ang screen kapag nagre-record</translation>
 <translation id="57838592816432529">I-mute</translation>
 <translation id="5784136236926853061">Mataas na latency ng HTTP</translation>
diff --git a/chromeos/strings/chromeos_strings_fr-CA.xtb b/chromeos/strings/chromeos_strings_fr-CA.xtb
index 2617265..254da445 100644
--- a/chromeos/strings/chromeos_strings_fr-CA.xtb
+++ b/chromeos/strings/chromeos_strings_fr-CA.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">État du portail</translation>
 <translation id="5763838252932650682">Redémarrage et mise à jour de l'application <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Augmenter la luminosité de l'écran</translation>
-<translation id="5775340474232476653">Votre enseignant a terminé la classe</translation>
 <translation id="5779818640587041940">Garder l'écran allumé lors de l'enregistrement</translation>
 <translation id="57838592816432529">Désactiver le son</translation>
 <translation id="5784136236926853061">Latence HTTP élevée</translation>
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb
index 1b586b8..ccc282d 100644
--- a/chromeos/strings/chromeos_strings_fr.xtb
+++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">État du portail</translation>
 <translation id="5763838252932650682">Redémarrage et mise à jour de <ph name="APP_NAME" />…</translation>
 <translation id="576835345334454681">Augmenter la luminosité de l'écran</translation>
-<translation id="5775340474232476653">Votre enseignant a mis fin au cours</translation>
 <translation id="5779818640587041940">Garder l'écran allumé pendant l'enregistrement</translation>
 <translation id="57838592816432529">Couper le son</translation>
 <translation id="5784136236926853061">Latence HTTP élevée</translation>
diff --git a/chromeos/strings/chromeos_strings_gl.xtb b/chromeos/strings/chromeos_strings_gl.xtb
index 557e114..3d3f787 100644
--- a/chromeos/strings/chromeos_strings_gl.xtb
+++ b/chromeos/strings/chromeos_strings_gl.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Estado do portal</translation>
 <translation id="5763838252932650682">Reiniciando e actualizando <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Aumentar brillo da pantalla</translation>
-<translation id="5775340474232476653">A persoa que dá a clase finalizouna</translation>
 <translation id="5779818640587041940">Manter pantalla activada durante a gravación</translation>
 <translation id="57838592816432529">Silenciar</translation>
 <translation id="5784136236926853061">Latencia de HTTP alta</translation>
diff --git a/chromeos/strings/chromeos_strings_gu.xtb b/chromeos/strings/chromeos_strings_gu.xtb
index 41869e3..8c69fac 100644
--- a/chromeos/strings/chromeos_strings_gu.xtb
+++ b/chromeos/strings/chromeos_strings_gu.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">પોર્ટલની સ્થિતિ</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" />ને ફરી શરૂ અને અપડેટ કરી રહ્યાં છીએ</translation>
 <translation id="576835345334454681">ડિસ્પ્લેનું બ્રાઇટનેસ વધારવાની કી</translation>
-<translation id="5775340474232476653">તમારા શિક્ષકે ક્લાસ સમાપ્ત કર્યો છે</translation>
 <translation id="5779818640587041940">રેકોર્ડ કરતી વખતે સ્ક્રીન ચાલુ રાખો</translation>
 <translation id="57838592816432529">અવાજ બંધ કરો</translation>
 <translation id="5784136236926853061">HTTPની ઉચ્ચ વિલંબતા</translation>
diff --git a/chromeos/strings/chromeos_strings_hi.xtb b/chromeos/strings/chromeos_strings_hi.xtb
index 904a594..35e381c 100644
--- a/chromeos/strings/chromeos_strings_hi.xtb
+++ b/chromeos/strings/chromeos_strings_hi.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">पोर्टल की स्थिति</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> को रीस्टार्ट और अपडेट किया जा रहा है</translation>
 <translation id="576835345334454681">डिसप्ले की रोशनी बढ़ाने वाला बटन</translation>
-<translation id="5775340474232476653">आपके शिक्षक ने क्लास खत्म कर दी है</translation>
 <translation id="5779818640587041940">रिकॉर्डिंग करते समय स्क्रीन चालू रखें</translation>
 <translation id="57838592816432529">म्यूट करें</translation>
 <translation id="5784136236926853061">एचटीटीपी अनुरोधों में इंतज़ार का समय ज़्यादा है</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb
index 78e76754..6541d1d 100644
--- a/chromeos/strings/chromeos_strings_hr.xtb
+++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">Stanje portala</translation>
 <translation id="5763838252932650682">Ponovno pokretanje i ažuriranje aplikacije <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Pojačavanje svjetline zaslona</translation>
-<translation id="5775340474232476653">Nastavnik je završio nastavu</translation>
 <translation id="5779818640587041940">Ostavi zaslon uključen tijekom snimanja</translation>
 <translation id="57838592816432529">Isključi zvuk</translation>
 <translation id="5784136236926853061">Visoka latencija HTTP-a</translation>
diff --git a/chromeos/strings/chromeos_strings_hu.xtb b/chromeos/strings/chromeos_strings_hu.xtb
index e4cbe34..e55c5d86 100644
--- a/chromeos/strings/chromeos_strings_hu.xtb
+++ b/chromeos/strings/chromeos_strings_hu.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">Portál állapota</translation>
 <translation id="5763838252932650682">A(z) <ph name="APP_NAME" /> újraindítása és frissítése…</translation>
 <translation id="576835345334454681">Kijelző fényerejének növelése</translation>
-<translation id="5775340474232476653">A tanár befejezte az órát</translation>
 <translation id="5779818640587041940">Képernyő bekapcsolva tartása felvétel készítése közben</translation>
 <translation id="57838592816432529">Némítás</translation>
 <translation id="5784136236926853061">Hosszú HTTP várakozási idő</translation>
diff --git a/chromeos/strings/chromeos_strings_hy.xtb b/chromeos/strings/chromeos_strings_hy.xtb
index d0afa43..f9139e0 100644
--- a/chromeos/strings/chromeos_strings_hy.xtb
+++ b/chromeos/strings/chromeos_strings_hy.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Պորտալի վիճակը</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> հավելվածը վերագործարկվում և թարմացվում է</translation>
 <translation id="576835345334454681">Էկրանի պայծառության ավելացում</translation>
-<translation id="5775340474232476653">Ուսուցիչն ավարտել է դասը</translation>
 <translation id="5779818640587041940">Ձայնագրության ժամանակ էկրանը միացրած պահել</translation>
 <translation id="57838592816432529">Անջատել ձայնը</translation>
 <translation id="5784136236926853061">HTTP-ի բարձր հապաղում</translation>
diff --git a/chromeos/strings/chromeos_strings_id.xtb b/chromeos/strings/chromeos_strings_id.xtb
index 929ef78..bbab7b96 100644
--- a/chromeos/strings/chromeos_strings_id.xtb
+++ b/chromeos/strings/chromeos_strings_id.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Status Portal</translation>
 <translation id="5763838252932650682">Memulai ulang dan mengupdate <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Tingkatkan kecerahan layar</translation>
-<translation id="5775340474232476653">Pengajar telah mengakhiri kelas</translation>
 <translation id="5779818640587041940">Biarkan layar tetap aktif saat merekam</translation>
 <translation id="57838592816432529">Bisukan</translation>
 <translation id="5784136236926853061">Latensi HTTP tinggi</translation>
diff --git a/chromeos/strings/chromeos_strings_is.xtb b/chromeos/strings/chromeos_strings_is.xtb
index 50dc04ef..02048876 100644
--- a/chromeos/strings/chromeos_strings_is.xtb
+++ b/chromeos/strings/chromeos_strings_is.xtb
@@ -351,6 +351,7 @@
 <translation id="2438248248625638801">Býr til titla á upptökur</translation>
 <translation id="2446553403094072641">Nákvæmni hlaupakommu</translation>
 <translation id="2448312741937722512">Gerð</translation>
+<translation id="2448857983905133469">Hjálpargögn bekkjar</translation>
 <translation id="2468124392950503650">Veldu skipun til að búa til mynd eða skoðaðu <ph name="BEGIN_LINK_PROMPTING_GUIDE" />leiðbeiningar um skipanir<ph name="END_LINK_PROMPTING_GUIDE" /></translation>
 <translation id="2472215337771558851">Notaðu rithjálp til að búa til drög eða fínpússa fyrirliggjandi skrif með aðstoð gervigreindar Google</translation>
 <translation id="2475982808118771221">Villa kom upp</translation>
@@ -449,6 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" />mA</translation>
 <translation id="3056720590588772262">Endastaður</translation>
 <translation id="3060579846059757016">Útlínur</translation>
+<translation id="3060798442805232711">Hjálpargögn bekkjar eru að nota hljóðnemann þinn</translation>
 <translation id="3061850252076394168">kveikja á textaupplestri</translation>
 <translation id="3066772729299747758">á þriðjudaginn</translation>
 <translation id="3069085583900247081">Próf mistókst</translation>
@@ -910,6 +912,7 @@
 <translation id="5170568018924773124">Sýna í möppu</translation>
 <translation id="517075088756846356">Taktu rafmagnssnúru <ph name="DEVICE_NAME" /> úr sambandi og settu hana aftur í samband til að halda uppfærsluferlinu áfram</translation>
 <translation id="5180108905184566358">apabrauðstrjám</translation>
+<translation id="5180431943345994173">Kennarinn þinn fjarlægði efni úr hjálpargögnum bekkjar</translation>
 <translation id="5180712487038406644">Tjáningarríkur</translation>
 <translation id="5190187232518914472">Upplifðu uppáhaldsstundirnar aftur. Opnaðu <ph name="LINK_BEGIN" />Google-myndir<ph name="LINK_END" /> til að bæta við eða breyta albúmum.</translation>
 <translation id="5212593641110061691">Tabloid</translation>
@@ -1003,6 +1006,7 @@
 <translation id="5628106863521633649">Tiltæk tungumál</translation>
 <translation id="5630438231335788050">bauhausstíl</translation>
 <translation id="5631759159893697722">ágrip</translation>
+<translation id="5655084389678168978">Kennarinn þinn bætti nýju efni við hjálpargögn bekkjar</translation>
 <translation id="5655283760733841251">Auka birtustig lyklaborðs</translation>
 <translation id="5655296450510165335">Skráning tækis</translation>
 <translation id="5655776422854483175">Engin prentverk</translation>
@@ -1026,7 +1030,6 @@
 <translation id="5760715441271661976">Vefgáttarstaða</translation>
 <translation id="5763838252932650682">Endurræsir og uppfærir <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Auka birtustig skjás</translation>
-<translation id="5775340474232476653">Kennarinn þinn hefur lokið tímanum</translation>
 <translation id="5779818640587041940">Hafa kveikt á skjá á meðan á upptöku stendur</translation>
 <translation id="57838592816432529">Þagga</translation>
 <translation id="5784136236926853061">Langur HTTP-biðtími</translation>
@@ -1529,6 +1532,7 @@
 <translation id="7971535376154084247">Almennar stýringar</translation>
 <translation id="7977800524392185497">Opnaðu stillingarnar til að tengjast <ph name="NETWORK_NAME" /> netkerfi</translation>
 <translation id="7978412674231730200">Einkalykill</translation>
+<translation id="7979468455552394856">Hjálpargögn bekkjar eru tengd við nemendur</translation>
 <translation id="7982789257301363584">Net</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{„<ph name="APP_NAME_1" />“ var ræst sjálfkrafa}one{# forrit var ræst sjálfkrafa}other{# forrit voru ræst sjálfkrafa}}</translation>
 <translation id="7994702968232966508">EAP-aðferð</translation>
diff --git a/chromeos/strings/chromeos_strings_it.xtb b/chromeos/strings/chromeos_strings_it.xtb
index 63ae72d..0724736 100644
--- a/chromeos/strings/chromeos_strings_it.xtb
+++ b/chromeos/strings/chromeos_strings_it.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Stato portale</translation>
 <translation id="5763838252932650682">Riavvio e aggiornamento di <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Aumenta la luminosità del display</translation>
-<translation id="5775340474232476653">L'insegnante ha terminato il corso</translation>
 <translation id="5779818640587041940">Mantieni lo schermo attivo durante la registrazione</translation>
 <translation id="57838592816432529">Disattiva audio</translation>
 <translation id="5784136236926853061">Latenza HTTP elevata</translation>
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb
index fd4e2f60..1edddab 100644
--- a/chromeos/strings/chromeos_strings_iw.xtb
+++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">מצב הפורטל</translation>
 <translation id="5763838252932650682">המערכת מפעילה מחדש ומעדכנת את <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">הגברה של בהירות התצוגה</translation>
-<translation id="5775340474232476653">המורה סיים את השיעור</translation>
 <translation id="5779818640587041940">השארת המסך פועל בזמן ההקלטה</translation>
 <translation id="57838592816432529">השתקה</translation>
 <translation id="5784136236926853061">‏משך זמן ההמתנה ל-HTTP ארוך</translation>
diff --git a/chromeos/strings/chromeos_strings_ja.xtb b/chromeos/strings/chromeos_strings_ja.xtb
index eb5ed87..144126d 100644
--- a/chromeos/strings/chromeos_strings_ja.xtb
+++ b/chromeos/strings/chromeos_strings_ja.xtb
@@ -351,6 +351,7 @@
 <translation id="2438248248625638801">録音のタイトルを作成しています</translation>
 <translation id="2446553403094072641">浮動小数点数精度</translation>
 <translation id="2448312741937722512">種類</translation>
+<translation id="2448857983905133469">授業用ツール</translation>
 <translation id="2468124392950503650">プロンプトを選択して作成するか、<ph name="BEGIN_LINK_PROMPTING_GUIDE" />プロンプト ガイド<ph name="END_LINK_PROMPTING_GUIDE" />をご覧ください</translation>
 <translation id="2472215337771558851">文書作成サポートを使用すると、Google AI の活用により文章の下書きを作成したり既存の文章を改良したりできます</translation>
 <translation id="2475982808118771221">エラーが発生しました</translation>
@@ -449,6 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> mA</translation>
 <translation id="3056720590588772262">エンドポイント</translation>
 <translation id="3060579846059757016">アウトライン</translation>
+<translation id="3060798442805232711">授業用ツールでマイクを使用しています</translation>
 <translation id="3061850252076394168">「選択して読み上げ」を有効にする</translation>
 <translation id="3066772729299747758">火曜日</translation>
 <translation id="3069085583900247081">テストに失敗しました</translation>
@@ -910,6 +912,7 @@
 <translation id="5170568018924773124">フォルダを開く</translation>
 <translation id="517075088756846356">更新プロセスを続行するには、<ph name="DEVICE_NAME" /> の電源ケーブルを取り外してから、もう一度差し込んでください</translation>
 <translation id="5180108905184566358">バオバブの木々</translation>
+<translation id="5180431943345994173">教師が授業用ツールのコンテンツを削除しました</translation>
 <translation id="5180712487038406644">Expressive</translation>
 <translation id="5190187232518914472">いつでも思い出の写真を。アルバムを追加または編集するには、<ph name="LINK_BEGIN" />Google フォト<ph name="LINK_END" />にアクセスしてください。</translation>
 <translation id="5212593641110061691">タブロイド</translation>
@@ -1003,6 +1006,7 @@
 <translation id="5628106863521633649">対応言語</translation>
 <translation id="5630438231335788050">バウハウス</translation>
 <translation id="5631759159893697722">概要</translation>
+<translation id="5655084389678168978">教師が授業用ツールに新しいコンテンツを追加しました</translation>
 <translation id="5655283760733841251">キーボードの明るさを上げる</translation>
 <translation id="5655296450510165335">デバイスの登録</translation>
 <translation id="5655776422854483175">印刷ジョブなし</translation>
@@ -1026,7 +1030,6 @@
 <translation id="5760715441271661976">ポータル状態</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> を更新して再起動しています</translation>
 <translation id="576835345334454681">ディスプレイの明るさを上げる</translation>
-<translation id="5775340474232476653">教師がクラスを終了しました</translation>
 <translation id="5779818640587041940">録音中は常に画面を表示する</translation>
 <translation id="57838592816432529">ミュート</translation>
 <translation id="5784136236926853061">HTTP レイテンシが高くなっています</translation>
@@ -1529,6 +1532,7 @@
 <translation id="7971535376154084247">一般設定</translation>
 <translation id="7977800524392185497"><ph name="NETWORK_NAME" /> ネットワークに接続するには、[設定] に移動します</translation>
 <translation id="7978412674231730200">秘密鍵</translation>
+<translation id="7979468455552394856">授業用ツールを学生に接続しています</translation>
 <translation id="7982789257301363584">ネットワーク</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{「<ph name="APP_NAME_1" />」が自動的に起動されました}other{# 個のアプリが自動的に起動されました}}</translation>
 <translation id="7994702968232966508">EAP 方式</translation>
diff --git a/chromeos/strings/chromeos_strings_ka.xtb b/chromeos/strings/chromeos_strings_ka.xtb
index 848a1f9b..fd8712b2 100644
--- a/chromeos/strings/chromeos_strings_ka.xtb
+++ b/chromeos/strings/chromeos_strings_ka.xtb
@@ -351,6 +351,7 @@
 <translation id="2438248248625638801">მიმდინარეობს ჩანაწერების სათაურების შექმნა</translation>
 <translation id="2446553403094072641">მოლივლივე წერტილის სიზუსტე</translation>
 <translation id="2448312741937722512">ტიპი</translation>
+<translation id="2448857983905133469">საკლასო ხელსაწყოები</translation>
 <translation id="2468124392950503650">აირჩიეთ მოთხოვნა, რომ შექმნათ ან ნახოთ <ph name="BEGIN_LINK_PROMPTING_GUIDE" />მოთხოვნის სახელმძღვანელო<ph name="END_LINK_PROMPTING_GUIDE" /></translation>
 <translation id="2472215337771558851">ისარგებლეთ დაწერაში დახმარებით, რომ Google-ის ხელოვნური ინტელექტის მეშვეობით შექმნათ მონახაზი, ან დახვეწოთ არსებული ნამუშევარი.</translation>
 <translation id="2475982808118771221">შეცდომა მოხდა</translation>
@@ -449,6 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> მა</translation>
 <translation id="3056720590588772262">საბოლოო წერტილი</translation>
 <translation id="3060579846059757016">კონტურები</translation>
+<translation id="3060798442805232711">საკლასო ხელსაწყოები იყენებს თქვენს მიკროფონს</translation>
 <translation id="3061850252076394168">ჩართეთ „მონიშვნა წარმოსათქმელად“</translation>
 <translation id="3066772729299747758">სამშაბათს</translation>
 <translation id="3069085583900247081">ტესტი წარუმატებლად დასრულდა</translation>
@@ -910,6 +912,7 @@
 <translation id="5170568018924773124">საქაღალდეში ჩვენება</translation>
 <translation id="517075088756846356">გამოაერთეთ და ისევ შეაერთეთ <ph name="DEVICE_NAME" />-ის ელკვების კაბელი, რომ განახლება განაგრძოთ</translation>
 <translation id="5180108905184566358">ბაობაბები</translation>
+<translation id="5180431943345994173">თქვენმა მასწავლებელმა ამოშალა კონტენტი საკლასო ხელსაწყოებიდან</translation>
 <translation id="5180712487038406644">ექსპრესიული</translation>
 <translation id="5190187232518914472">გააცოცხლეთ თქვენი ყველაზე თბილი მოგონებები. ალბომების დასამატებლად ან რედაქტირებისთვის გადადით <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />-ზე.</translation>
 <translation id="5212593641110061691">Tabloid</translation>
@@ -1003,6 +1006,7 @@
 <translation id="5628106863521633649">ხელმისაწვდომი ენები</translation>
 <translation id="5630438231335788050">ბაუჰაუსი</translation>
 <translation id="5631759159893697722">რეზიუმე</translation>
+<translation id="5655084389678168978">თქვენმა მასწავლებელმა დაამატა ახალი კონტენტი საკლასო ხელსაწყოებში</translation>
 <translation id="5655283760733841251">კლავიატურის სიკაშკაშის მომატება</translation>
 <translation id="5655296450510165335">მოწყობილობის რეგისტრაცია</translation>
 <translation id="5655776422854483175">ბეჭდვის დავალებები არ არის</translation>
@@ -1026,7 +1030,6 @@
 <translation id="5760715441271661976">პორტალის მდგომარეობა</translation>
 <translation id="5763838252932650682">მიმდინარეობს <ph name="APP_NAME" />-ის გადატვირთვა და განახლება</translation>
 <translation id="576835345334454681">ეკრანის სიკაშკაშის მომატება</translation>
-<translation id="5775340474232476653">თქვენმა მასწავლებელმა დაასრულა გაკვეთილი</translation>
 <translation id="5779818640587041940">ეკრანის ჩართულად დატოვება ჩაწერისას</translation>
 <translation id="57838592816432529">დადუმება</translation>
 <translation id="5784136236926853061">HTTP რეაგირების დრო დიდია</translation>
@@ -1529,6 +1532,7 @@
 <translation id="7971535376154084247">მართვის ზოგადი საშუალებები</translation>
 <translation id="7977800524392185497"><ph name="NETWORK_NAME" /> ქსელთან მისაერთებლად გადადით პარამეტრებზე</translation>
 <translation id="7978412674231730200">პირადი გასაღები</translation>
+<translation id="7979468455552394856">საკლასო ხელსაწყოები დაკავშირებულია სტუდენტებთან</translation>
 <translation id="7982789257301363584">ქსელი</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{„<ph name="APP_NAME_1" />“ ავტომატურად გაეშვა}other{# აპი ავტომატურად გაეშვა}}</translation>
 <translation id="7994702968232966508">EAP მეთოდი</translation>
diff --git a/chromeos/strings/chromeos_strings_kk.xtb b/chromeos/strings/chromeos_strings_kk.xtb
index 4b0db45..4e81106 100644
--- a/chromeos/strings/chromeos_strings_kk.xtb
+++ b/chromeos/strings/chromeos_strings_kk.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Портал күйі</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> қайта іске қосылып, жаңартылып жатыр</translation>
 <translation id="576835345334454681">Дисплей жарықтығын арттыру</translation>
-<translation id="5775340474232476653">Мұғаліміңіз сабақ сеансын аяқтады.</translation>
 <translation id="5779818640587041940">Жазған кезде экранды өшірмеу</translation>
 <translation id="57838592816432529">Дыбысын өшіру</translation>
 <translation id="5784136236926853061">HTTP кідірісі жоғары.</translation>
@@ -1117,7 +1116,7 @@
 <translation id="6149015141270619212">Интернетке қосылу мүмкін емес</translation>
 <translation id="6156030503438652198">қошқыл қызыл және қызғылт</translation>
 <translation id="6163318050265152852">Атаулар жасалмады. Қысқалау транскрипция қолданып көріңіз.</translation>
-<translation id="6165508094623778733">Толығырақ</translation>
+<translation id="6165508094623778733">Толық ақпарат</translation>
 <translation id="6184793017104303157">B4</translation>
 <translation id="6185263894115593524">Басқалардың микрофон мен камераны пайдалануын тоқтату үшін бастапқы күйге қайтарыңыз. Тек сенімді сайттарға рұқсат беріңіз.</translation>
 <translation id="6188737759358894319"><ph name="DATE" /> күні жасалды.</translation>
diff --git a/chromeos/strings/chromeos_strings_km.xtb b/chromeos/strings/chromeos_strings_km.xtb
index 0c273d4..28c7755 100644
--- a/chromeos/strings/chromeos_strings_km.xtb
+++ b/chromeos/strings/chromeos_strings_km.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">ស្ថានភាពច្រក</translation>
 <translation id="5763838252932650682">កំពុង​ចាប់ផ្ដើមឡើងវិញ និងដំឡើងកំណែ <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">គ្រាប់ចុចព្រួញឡើងលើសម្រាប់បង្កើនពន្លឺផ្ទាំងអេក្រង់</translation>
-<translation id="5775340474232476653">គ្រូ​របស់អ្នក​បានបញ្ចប់​ថ្នាក់ហើយ</translation>
 <translation id="5779818640587041940">បន្តបើក​អេក្រង់នៅពេលថត</translation>
 <translation id="57838592816432529">បិទសម្លេង</translation>
 <translation id="5784136236926853061">ការពន្យារ HTTP ខ្ពស់</translation>
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb
index 9d782b9..fed076ac 100644
--- a/chromeos/strings/chromeos_strings_kn.xtb
+++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">ಪೋರ್ಟಲ್ ಸ್ಥಿತಿ</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ ಹಾಗೂ ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation>
 <translation id="576835345334454681">ಡಿಸ್‌ಪ್ಲೇ ಪ್ರಖರತೆಯನ್ನು ಹೆಚ್ಚಿಸಿ</translation>
-<translation id="5775340474232476653">ಕ್ಲಾಸ್ ಅನ್ನು ನಿಮ್ಮ ಶಿಕ್ಷಕರು ಕೊನೆಗೊಳಿಸಿದ್ದಾರೆ</translation>
 <translation id="5779818640587041940">ರೆಕಾರ್ಡಿಂಗ್ ಮಾಡುವಾಗ ಸ್ಕ್ರೀನ್ ಆನ್ ಮಾಡಿ</translation>
 <translation id="57838592816432529">ಮ್ಯೂಟ್</translation>
 <translation id="5784136236926853061">ಅಧಿಕ HTTP ವಿಳಂಬ</translation>
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb
index ed4872c..7ab63ae 100644
--- a/chromeos/strings/chromeos_strings_ko.xtb
+++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -351,6 +351,7 @@
 <translation id="2438248248625638801">녹화 파일 제목 생성 중</translation>
 <translation id="2446553403094072641">부동 소수점 정확성</translation>
 <translation id="2448312741937722512">유형</translation>
+<translation id="2448857983905133469">수업 도구</translation>
 <translation id="2468124392950503650">프롬프트를 선택하여 만들거나 <ph name="BEGIN_LINK_PROMPTING_GUIDE" />프롬프트 가이드<ph name="END_LINK_PROMPTING_GUIDE" />를 확인하세요.</translation>
 <translation id="2472215337771558851">작성 지원 기능을 사용하여 Google AI를 기반으로 초안을 작성하거나 기존 과제물을 다듬어 보세요.</translation>
 <translation id="2475982808118771221">오류가 발생했습니다.</translation>
@@ -449,6 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" />mA</translation>
 <translation id="3056720590588772262">엔드포인트</translation>
 <translation id="3060579846059757016">개요</translation>
+<translation id="3060798442805232711">수업 도구에서 마이크를 사용 중입니다.</translation>
 <translation id="3061850252076394168">텍스트 읽어주기 사용 설정</translation>
 <translation id="3066772729299747758">화요일</translation>
 <translation id="3069085583900247081">테스트 실패</translation>
@@ -910,6 +912,7 @@
 <translation id="5170568018924773124">폴더 열기</translation>
 <translation id="517075088756846356">업데이트를 계속하려면 <ph name="DEVICE_NAME" />에서 전원 케이블을 분리했다가 다시 연결하세요.</translation>
 <translation id="5180108905184566358">바오밥나무</translation>
+<translation id="5180431943345994173">선생님이 수업 도구에서 콘텐츠를 삭제했습니다.</translation>
 <translation id="5180712487038406644">생생함</translation>
 <translation id="5190187232518914472">소중한 추억을 되새겨 보세요. 앨범을 추가하거나 수정하려면 <ph name="LINK_BEGIN" />Google 포토<ph name="LINK_END" />로 이동하세요.</translation>
 <translation id="5212593641110061691">타블로이드</translation>
@@ -1003,6 +1006,7 @@
 <translation id="5628106863521633649">지원 언어</translation>
 <translation id="5630438231335788050">바우하우스</translation>
 <translation id="5631759159893697722">초록</translation>
+<translation id="5655084389678168978">선생님이 수업 도구에 새 콘텐츠를 추가했습니다.</translation>
 <translation id="5655283760733841251">키보드 밝기 높이기</translation>
 <translation id="5655296450510165335">기기 등록</translation>
 <translation id="5655776422854483175">인쇄 작업 없음</translation>
@@ -1026,7 +1030,6 @@
 <translation id="5760715441271661976">포털 상태</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> 다시 시작 및 업데이트</translation>
 <translation id="576835345334454681">디스플레이 밝기 높이기</translation>
-<translation id="5775340474232476653">선생님이 수업을 종료했습니다.</translation>
 <translation id="5779818640587041940">녹음 중 화면 켜두기</translation>
 <translation id="57838592816432529">음소거</translation>
 <translation id="5784136236926853061">HTTP 지연 시간 높음</translation>
@@ -1529,6 +1532,7 @@
 <translation id="7971535376154084247">일반 컨트롤</translation>
 <translation id="7977800524392185497"><ph name="NETWORK_NAME" /> 네트워크에 참여하려면 설정으로 이동하세요.</translation>
 <translation id="7978412674231730200">비공개 키</translation>
+<translation id="7979468455552394856">수업 도구가 학생에게 연결되어 있습니다.</translation>
 <translation id="7982789257301363584">네트워크</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{"<ph name="APP_NAME_1" />" 앱이 자동으로 시작되었습니다}other{#개 앱이 자동으로 시작되었습니다}}</translation>
 <translation id="7994702968232966508">EAP 방식</translation>
diff --git a/chromeos/strings/chromeos_strings_ky.xtb b/chromeos/strings/chromeos_strings_ky.xtb
index 591fa87..ca2c327b 100644
--- a/chromeos/strings/chromeos_strings_ky.xtb
+++ b/chromeos/strings/chromeos_strings_ky.xtb
@@ -351,6 +351,7 @@
 <translation id="2438248248625638801">Жаздыруунун аталыштары түзүлүүдө</translation>
 <translation id="2446553403094072641">Калкыма чекиттин тактыгы</translation>
 <translation id="2448312741937722512">Түрү</translation>
+<translation id="2448857983905133469">Окуу куралдары</translation>
 <translation id="2468124392950503650">Түзүү үчүн сурамды тандап же <ph name="BEGIN_LINK_PROMPTING_GUIDE" />сурам боюнча жетектемени<ph name="END_LINK_PROMPTING_GUIDE" /> караңыз</translation>
 <translation id="2472215337771558851">"Жазууга жардам бер" функциясы Google сунуштаган ЖИ технологиялары аркылуу жумушчу вариант түзүп же учурдагы текстти өркүндөтүүгө жардам берет</translation>
 <translation id="2475982808118771221">Ката кетти</translation>
@@ -449,6 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" />мА</translation>
 <translation id="3056720590588772262">Аяктоо чекити</translation>
 <translation id="3060579846059757016">Тышкы сызыктар</translation>
+<translation id="3060798442805232711">Окуу куралдары микрофонуңузду колдонуп жатат</translation>
 <translation id="3061850252076394168">"Басып туруп угуңуз" функциясын иштетүү</translation>
 <translation id="3066772729299747758">бейшембиде</translation>
 <translation id="3069085583900247081">Сыналган жок</translation>
@@ -910,6 +912,7 @@
 <translation id="5170568018924773124">Куржунда көрсөтүү</translation>
 <translation id="517075088756846356">Жаңыртуу процессин улантуу үчүн <ph name="DEVICE_NAME" /> түзмөгүнүн электр кубатынын кабелин сууруп, кайра сайыңыз</translation>
 <translation id="5180108905184566358">баобаб дарактары</translation>
+<translation id="5180431943345994173">Мугалимиңиз Окуу куралдарындагы материалды өчүрдү</translation>
 <translation id="5180712487038406644">Даана</translation>
 <translation id="5190187232518914472">Эсте калган учурларды кайра көз алдыңыздан өткөрүңүз. Альбомдорду кошуу же түзөтүү үчүн <ph name="LINK_BEGIN" />Google Фотого<ph name="LINK_END" /> өтүңүз.</translation>
 <translation id="5212593641110061691">Таблоид</translation>
@@ -1003,6 +1006,7 @@
 <translation id="5628106863521633649">Жеткиликтүү тилдер</translation>
 <translation id="5630438231335788050">баухаус</translation>
 <translation id="5631759159893697722">аннотация</translation>
+<translation id="5655084389678168978">МугалимиңизОкуу куралдарына жаңы материал кошту</translation>
 <translation id="5655283760733841251">Баскычтоптун жарыктыгын көбөйтүү</translation>
 <translation id="5655296450510165335">Түзмөктү каттоо</translation>
 <translation id="5655776422854483175">Басып чыгаруу тапшырмалары жок</translation>
@@ -1026,7 +1030,6 @@
 <translation id="5760715441271661976">Порталдын абалы</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> колдонмосун өчүрүп күйгүзүү жана жаңыртуу</translation>
 <translation id="576835345334454681">Дисплейдин жарыктыгын көбөйтүү</translation>
-<translation id="5775340474232476653">Мугалим сабакты бүтүрдү</translation>
 <translation id="5779818640587041940">Жаздырып жатканда экранды күйүк калтырыңыз</translation>
 <translation id="57838592816432529">Үнсүз</translation>
 <translation id="5784136236926853061">HTTP күтүү убакыты жогору</translation>
@@ -1529,6 +1532,7 @@
 <translation id="7971535376154084247">Жалпы башкаруу элементтери</translation>
 <translation id="7977800524392185497"><ph name="NETWORK_NAME" /> тармагына кошулуу үчүн Параметрлерге өтүңүз</translation>
 <translation id="7978412674231730200">Жеке ачкыч</translation>
+<translation id="7979468455552394856">Окуучулар класс куралдарына туташтырылды</translation>
 <translation id="7982789257301363584">Тармак</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{"<ph name="APP_NAME_1" />" колдонмосу автоматтык түрдө ачылды}other{# колдонмо автоматтык түрдө ачылды}}</translation>
 <translation id="7994702968232966508">EAP ыкмасы</translation>
diff --git a/chromeos/strings/chromeos_strings_lo.xtb b/chromeos/strings/chromeos_strings_lo.xtb
index a2a75fc1..ee70a12 100644
--- a/chromeos/strings/chromeos_strings_lo.xtb
+++ b/chromeos/strings/chromeos_strings_lo.xtb
@@ -351,6 +351,7 @@
 <translation id="2438248248625638801">ກຳລັງສ້າງຊື່ການບັນທຶກ</translation>
 <translation id="2446553403094072641">ຄວາມຖືກຕ້ອງຂອງຈຸດລອຍຕົວ</translation>
 <translation id="2448312741937722512">ປະ​ເພດ</translation>
+<translation id="2448857983905133469">ເຄື່ອງມືສຳລັບຫ້ອງຮຽນ</translation>
 <translation id="2468124392950503650">ເລືອກ prompt ເພື່ອສ້າງ ຫຼື ເບິ່ງ <ph name="BEGIN_LINK_PROMPTING_GUIDE" />ຄຳແນະນຳການໃຊ້ prompt<ph name="END_LINK_PROMPTING_GUIDE" /></translation>
 <translation id="2472215337771558851">ໃຊ້ຊ່ວຍຂ້ອຍຂຽນເພື່ອສ້າງສະບັບຮ່າງ ຫຼື ປັບປ່ຽນວຽກທີ່ມີຢູ່ແລ້ວ, ຂັບເຄື່ອນໂດຍ Google AI</translation>
 <translation id="2475982808118771221">ເກີດຄວາມຜິດພາດຂຶ້ນ.</translation>
@@ -449,6 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" />mA</translation>
 <translation id="3056720590588772262">ຈຸດສິ້ນສຸດ</translation>
 <translation id="3060579846059757016">ໂຄງຮ່າງ</translation>
+<translation id="3060798442805232711">ເຄື່ອງມືສຳລັບຫ້ອງຮຽນກຳລັງໃຊ້ໄມໂຄຣໂຟນຂອງທ່ານ</translation>
 <translation id="3061850252076394168">ເປີດການນຳໃຊ້ຄຸນສົມບັດເລືອກເພື່ອເວົ້າ</translation>
 <translation id="3066772729299747758">ໃນວັນອັງຄານ</translation>
 <translation id="3069085583900247081">ທົດສອບບໍ່ສຳເລັດ</translation>
@@ -910,6 +912,7 @@
 <translation id="5170568018924773124">ສະ​ແດງ​ຢູ່​ໃນ​ໂຟລ​ເດີ</translation>
 <translation id="517075088756846356">ຖອດປລັກ ແລ້ວສຽບປລັກສາຍໄຟ <ph name="DEVICE_NAME" /> ຄືນໃໝ່ເພື່ອສືບຕໍ່ຂັ້ນຕອນການອັບເດດ</translation>
 <translation id="5180108905184566358">ຕົ້ນບາວບັບ</translation>
+<translation id="5180431943345994173">ຄູຂອງທ່ານໄດ້ລຶບເນື້ອຫາໃນເຄື່ອງມືສຳລັບຫ້ອງຮຽນອອກ</translation>
 <translation id="5180712487038406644">ຊັດເຈນ</translation>
 <translation id="5190187232518914472">ຫວນຄືນຄວາມຊົງຈຳທີ່ທ່ານມັກ. ເພື່ອເພີ່ມ ຫຼື ແກ້ໄຂອະລະບໍ້າ, ກະລຸນາໄປທີ່ <ph name="LINK_BEGIN" />Google ຮູບພາບ<ph name="LINK_END" />.</translation>
 <translation id="5212593641110061691">ແທັບລອຍ</translation>
@@ -1003,6 +1006,7 @@
 <translation id="5628106863521633649">ພາສາທີ່ສາມາດໃຊ້ໄດ້</translation>
 <translation id="5630438231335788050">ສະຖາບັນເບົາເຮົາສ໌</translation>
 <translation id="5631759159893697722">ບົດຄັດຫຍໍ້</translation>
+<translation id="5655084389678168978">ຄູຂອງທ່ານໄດ້ເພີ່ມເນື້ອຫາໃໝ່ໃນເຄື່ອງມືສຳລັບຫ້ອງຮຽນ</translation>
 <translation id="5655283760733841251">ແປ້ນພິມເພີ່ມຄວາມສະຫວ່າງ</translation>
 <translation id="5655296450510165335">ການລົງທະບຽນອຸປະກອນ</translation>
 <translation id="5655776422854483175">ບໍ່​ມີ​ວຽກ​​ການ​ພິມ</translation>
@@ -1026,7 +1030,6 @@
 <translation id="5760715441271661976">ສະຖານະຜອດໂທລ</translation>
 <translation id="5763838252932650682">ກຳລັງຣີສະຕາດ ແລະ ອັບເດດ <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">ເພີ່ມຄວາມສະຫວ່າງການສະແດງຜົນ</translation>
-<translation id="5775340474232476653">ຄູຂອງທ່ານສິ້ນສຸດຫ້ອງຮຽນແລ້ວ</translation>
 <translation id="5779818640587041940">ເປີດໜ້າຈໍຄ້າງໄວ້ເມື່ອບັນທຶກ</translation>
 <translation id="57838592816432529">ປິດສຽງ</translation>
 <translation id="5784136236926853061">ການຕອບສະໜອງ HTTP ສູງ</translation>
@@ -1530,6 +1533,7 @@
 <translation id="7971535376154084247">ການຄວບຄຸມທົ່ວໄປ</translation>
 <translation id="7977800524392185497">ເພື່ອເຂົ້າຮ່ວມເຄືອຂ່າຍ <ph name="NETWORK_NAME" />, ໃຫ້ເຂົ້າໄປຫາການຕັ້ງຄ່າ</translation>
 <translation id="7978412674231730200">ປຸ່ມສ່ວນຕົວ</translation>
+<translation id="7979468455552394856">ເຄື່ອງມືສຳລັບຫ້ອງຮຽນເຊື່ອມຕໍ່ກັບນັກຮຽນແລ້ວ</translation>
 <translation id="7982789257301363584">ເຄືອ​ຂ່າຍ</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{ເລີ່ມ "<ph name="APP_NAME_1" />" ອັດຕະໂນມັດແລ້ວ}other{ເລີ່ມ # ອັດຕະໂນມັດແລ້ວ}}</translation>
 <translation id="7994702968232966508">ວິທີການ EAP</translation>
diff --git a/chromeos/strings/chromeos_strings_lt.xtb b/chromeos/strings/chromeos_strings_lt.xtb
index 460315f..c53705d 100644
--- a/chromeos/strings/chromeos_strings_lt.xtb
+++ b/chromeos/strings/chromeos_strings_lt.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Portalo būsena</translation>
 <translation id="5763838252932650682">„<ph name="APP_NAME" />“ paleidžiama iš naujo ir atnaujinama</translation>
 <translation id="576835345334454681">Padidinti ekrano šviesumą</translation>
-<translation id="5775340474232476653">Mokytojas baigė pamoką</translation>
 <translation id="5779818640587041940">Įrašant palikti ekraną įjungtą</translation>
 <translation id="57838592816432529">Nutildyti</translation>
 <translation id="5784136236926853061">Didelė HTTP delsa</translation>
diff --git a/chromeos/strings/chromeos_strings_lv.xtb b/chromeos/strings/chromeos_strings_lv.xtb
index a2c2acb..05036d3 100644
--- a/chromeos/strings/chromeos_strings_lv.xtb
+++ b/chromeos/strings/chromeos_strings_lv.xtb
@@ -345,6 +345,7 @@
 <translation id="2438248248625638801">Notiek ierakstu nosaukumu izveide</translation>
 <translation id="2446553403094072641">Peldošā punkta precizitāte</translation>
 <translation id="2448312741937722512">Tips</translation>
+<translation id="2448857983905133469">Klases rīki</translation>
 <translation id="2468124392950503650">Atlasiet uzvedni, lai izveidotu vai skatītu <ph name="BEGIN_LINK_PROMPTING_GUIDE" />norādījumus par uzvednēm<ph name="END_LINK_PROMPTING_GUIDE" />.</translation>
 <translation id="2472215337771558851">Lai izveidotu melnrakstu vai uzlabotu esošo darbu, izmantojiet funkciju “Palīdzība rakstīšanā”, ko nodrošina Google MI.</translation>
 <translation id="2475982808118771221">Radās kļūda</translation>
@@ -443,6 +444,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> mA</translation>
 <translation id="3056720590588772262">Beigu punkts</translation>
 <translation id="3060579846059757016">Struktūras</translation>
+<translation id="3060798442805232711">Klases rīki izmanto jūsu mikrofonu</translation>
 <translation id="3061850252076394168">iespējot funkciju “Atlasīt, lai izrunātu”</translation>
 <translation id="3066772729299747758">otrdien</translation>
 <translation id="3069085583900247081">Testēšana neizdevās</translation>
@@ -898,6 +900,7 @@
 <translation id="5170568018924773124">Rādīt mapē</translation>
 <translation id="517075088756846356">Lai turpinātu atjaunināšanas procesu, atvienojiet un atkārtoti pievienojiet ierīces (<ph name="DEVICE_NAME" />) barošanas vadu.</translation>
 <translation id="5180108905184566358">baobabi</translation>
+<translation id="5180431943345994173">Jūsu skolotājs noņēma saturu no Klases rīkiem.</translation>
 <translation id="5180712487038406644">Izteiksmīga</translation>
 <translation id="5190187232518914472">Iedzīviniet savas mīļākās atmiņas. Lai pievienotu vai rediģētu albumus, pārejiet uz pakalpojumu <ph name="LINK_BEGIN" />Google fotoattēli<ph name="LINK_END" />.</translation>
 <translation id="5212593641110061691">Neliela formāta laikraksts</translation>
@@ -991,6 +994,7 @@
 <translation id="5628106863521633649">Pieejamās valodas</translation>
 <translation id="5630438231335788050">Bauhaus</translation>
 <translation id="5631759159893697722">kopsavilkums</translation>
+<translation id="5655084389678168978">Jūsu skolotājs pievienoja jaunu saturu Klases rīkos</translation>
 <translation id="5655283760733841251">Palielināt tastatūras spilgtumu</translation>
 <translation id="5655296450510165335">Ierīces reģistrācija</translation>
 <translation id="5655776422854483175">Nav neviena drukas darba.</translation>
@@ -1014,7 +1018,6 @@
 <translation id="5760715441271661976">Portāla statuss</translation>
 <translation id="5763838252932650682">Lietotnes <ph name="APP_NAME" /> restartēšana un atjaunināšana</translation>
 <translation id="576835345334454681">Palielināt displeja spilgtumu</translation>
-<translation id="5775340474232476653">Skolotājs pabeidza nodarbību</translation>
 <translation id="5779818640587041940">Saglabāt ekrānu ieslēgtu ierakstīšanas laikā</translation>
 <translation id="57838592816432529">Izslēgt skaņu</translation>
 <translation id="5784136236926853061">Liels HTTP latentums</translation>
@@ -1517,6 +1520,7 @@
 <translation id="7971535376154084247">Vispārīgas vadīklas</translation>
 <translation id="7977800524392185497">Lai izveidotu savienojumu ar <ph name="NETWORK_NAME" /> tīklu, pārejiet uz iestatījumiem.</translation>
 <translation id="7978412674231730200">Privātā atslēga</translation>
+<translation id="7979468455552394856">Klases rīkiem ir izveidots savienojums ar skolēniem</translation>
 <translation id="7982789257301363584">Tīkls</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{Lietotne <ph name="APP_NAME_1" /> tika palaista automātiski}zero{# lietotnes tika palaistas automātiski}one{# lietotne tika palaista automātiski}other{# lietotnes tika palaistas automātiski}}</translation>
 <translation id="7994702968232966508">EAP metode</translation>
diff --git a/chromeos/strings/chromeos_strings_mk.xtb b/chromeos/strings/chromeos_strings_mk.xtb
index 67324b2..fc41bda 100644
--- a/chromeos/strings/chromeos_strings_mk.xtb
+++ b/chromeos/strings/chromeos_strings_mk.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Состојба на порталот</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> се рестартира и се ажурира</translation>
 <translation id="576835345334454681">Осветленоста на екранот се зголеми</translation>
-<translation id="5775340474232476653">Вашиот наставник го заврши класот</translation>
 <translation id="5779818640587041940">Екранот нека биде вклучен при снимање</translation>
 <translation id="57838592816432529">Исклучи звук</translation>
 <translation id="5784136236926853061">Висока латенција на HTTP</translation>
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb
index 838cf30..0c5c9a6c 100644
--- a/chromeos/strings/chromeos_strings_ml.xtb
+++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">പോര്‍ട്ടല്‍ നില</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> ആപ്പ് റീസ്റ്റാർട്ട് ചെയ്ത് അപ്‌ഡേറ്റ് ചെയ്യുന്നു</translation>
 <translation id="576835345334454681">ഡിസ്‌പ്ലേ തെളിച്ചം കൂട്ടുക</translation>
-<translation id="5775340474232476653">നിങ്ങളുടെ അധ്യാപകർ ക്ലാസ് അവസാനിപ്പിച്ചു</translation>
 <translation id="5779818640587041940">റെക്കോർഡ് ചെയ്യുമ്പോൾ സ്ക്രീൻ ഓണാക്കി വയ്‌ക്കുക</translation>
 <translation id="57838592816432529">മ്യൂട്ട് ചെയ്യുക</translation>
 <translation id="5784136236926853061">ഉയർന്ന HTTP പ്രതികരണ സമയം</translation>
diff --git a/chromeos/strings/chromeos_strings_mn.xtb b/chromeos/strings/chromeos_strings_mn.xtb
index 0dbfd0a7..9cf9bdb3 100644
--- a/chromeos/strings/chromeos_strings_mn.xtb
+++ b/chromeos/strings/chromeos_strings_mn.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">Порталын төлөв</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" />-г дахин эхлүүлж, шинэчилж байна</translation>
 <translation id="576835345334454681">Дэлгэцийн гэрэлтүүлгийг нэмэгдүүлэх</translation>
-<translation id="5775340474232476653">Танай багш ангийг дуусгасан</translation>
 <translation id="5779818640587041940">Бичих үед дэлгэцийг асаалттай байлгах</translation>
 <translation id="57838592816432529">Дууг хаах</translation>
 <translation id="5784136236926853061">HTTP-н өндөр хоцролт</translation>
diff --git a/chromeos/strings/chromeos_strings_mr.xtb b/chromeos/strings/chromeos_strings_mr.xtb
index c7853bc..1b64674 100644
--- a/chromeos/strings/chromeos_strings_mr.xtb
+++ b/chromeos/strings/chromeos_strings_mr.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">पोर्टलची स्थिती</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> रीस्टार्ट करून अपडेट करत आहे</translation>
 <translation id="576835345334454681">डिस्प्लेचा ब्राइटनेस वाढवा</translation>
-<translation id="5775340474232476653">तुमच्या शिक्षकांनी वर्ग संपवला आहे</translation>
 <translation id="5779818640587041940">रेकॉर्ड करताना स्क्रीन सुरू ठेवा</translation>
 <translation id="57838592816432529">म्यूट करा</translation>
 <translation id="5784136236926853061">उच्च HTTP लेटन्सी</translation>
diff --git a/chromeos/strings/chromeos_strings_ms.xtb b/chromeos/strings/chromeos_strings_ms.xtb
index 586b64b..a6dbf17 100644
--- a/chromeos/strings/chromeos_strings_ms.xtb
+++ b/chromeos/strings/chromeos_strings_ms.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">Keadaan Portal</translation>
 <translation id="5763838252932650682">Memulakan semula dan mengemaskinikan <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Tingkatkan kecerahan paparan</translation>
-<translation id="5775340474232476653">Guru anda telah menamatkan kelas</translation>
 <translation id="5779818640587041940">Pastikan skrin hidup semasa merakam</translation>
 <translation id="57838592816432529">Redam</translation>
 <translation id="5784136236926853061">Kependaman HTTP tinggi</translation>
diff --git a/chromeos/strings/chromeos_strings_my.xtb b/chromeos/strings/chromeos_strings_my.xtb
index 3743c47..35df41d 100644
--- a/chromeos/strings/chromeos_strings_my.xtb
+++ b/chromeos/strings/chromeos_strings_my.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">စာမျက်နှာအခြေအနေ</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> ကိုပြန်စပြီး အပ်ဒိတ်လုပ်နေသည်</translation>
 <translation id="576835345334454681">ဖန်သားပြင်တောက်ပမှု တိုးရန်</translation>
-<translation id="5775340474232476653">သင့်ဆရာက အတန်းကို ရပ်လိုက်သည်</translation>
 <translation id="5779818640587041940">အသံသွင်းသည့်အခါ ဖန်သားပြင် ဖွင့်ထားရန်</translation>
 <translation id="57838592816432529">တိတ်ရန်</translation>
 <translation id="5784136236926853061">HTTP တုံ့ပြန်ချိန် ကြာနေသည်</translation>
diff --git a/chromeos/strings/chromeos_strings_ne.xtb b/chromeos/strings/chromeos_strings_ne.xtb
index 47afdd8..6fc6cf5 100644
--- a/chromeos/strings/chromeos_strings_ne.xtb
+++ b/chromeos/strings/chromeos_strings_ne.xtb
@@ -351,6 +351,7 @@
 <translation id="2438248248625638801">रेकर्डिङका शीर्षकहरू बनाइँदै छन्</translation>
 <translation id="2446553403094072641">फ्लोटिङ पोइन्टको सटीकता</translation>
 <translation id="2448312741937722512">प्रकार</translation>
+<translation id="2448857983905133469">कक्षाका टुलहरू</translation>
 <translation id="2468124392950503650">सिर्जना गर्न प्रम्प्ट चयन गर्नुहोस् वा <ph name="BEGIN_LINK_PROMPTING_GUIDE" />प्रम्प्टसम्बन्धी गाइड<ph name="END_LINK_PROMPTING_GUIDE" /> हेर्नुहोस्</translation>
 <translation id="2472215337771558851">Google AI को लेख्न मद्दत गर्ने सुविधा प्रयोग गरी ड्राफ्ट बनाउनुहोस् वा पहिले नै लेखिएको सामग्री परिष्कृत गर्नुहोस्</translation>
 <translation id="2475982808118771221">त्रुटि भयो</translation>
@@ -449,6 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" />mA</translation>
 <translation id="3056720590588772262">इन्डपोइन्ट</translation>
 <translation id="3060579846059757016">आउटलाइन</translation>
+<translation id="3060798442805232711">कक्षाका टुलहरूले तपाईंको माइक्रोफोन प्रयोग गर्दै छ</translation>
 <translation id="3061850252076394168">सेलेक्ट टु स्पिक अन गर्नुहोस्</translation>
 <translation id="3066772729299747758">मङ्गलवार</translation>
 <translation id="3069085583900247081">परीक्षण गर्न सकिएन</translation>
@@ -910,6 +912,7 @@
 <translation id="5170568018924773124">फोल्डरमा देखाउनुहोस्</translation>
 <translation id="517075088756846356">अपडेट गर्ने प्रक्रिया जारी राख्न <ph name="DEVICE_NAME" /> को पावर केबल निकालेर फेरि जोड्नुहोस्</translation>
 <translation id="5180108905184566358">बाओबाब ट्री</translation>
+<translation id="5180431943345994173">तपाईंका शिक्षकले कक्षाका टुलहरूमा भएको कन्टेन्ट हटाउनुभएको छ</translation>
 <translation id="5180712487038406644">एक्स्प्रेसिभ</translation>
 <translation id="5190187232518914472">आफूलाई स्मरणीय पलहरूको आनन्द लिनुहोस्। एल्बमहरू हाल्न वा परिवर्तन गर्न <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> मा जानुहोस्।</translation>
 <translation id="5212593641110061691">ट्याब्लोइड</translation>
@@ -1003,6 +1006,7 @@
 <translation id="5628106863521633649">उपलब्ध भाषाहरू</translation>
 <translation id="5630438231335788050">बाउहाउस</translation>
 <translation id="5631759159893697722">अमूर्त</translation>
+<translation id="5655084389678168978">तपाईंका शिक्षकले कक्षाका टुलहरूमा नयाँ कन्टेन्ट हाल्नुभएको छ</translation>
 <translation id="5655283760733841251">किबोर्डको चमक बढाउने की</translation>
 <translation id="5655296450510165335">डिभाइस दर्ता गर्ने प्रक्रिया</translation>
 <translation id="5655776422854483175">कुनै पनि प्रिन्टसम्बन्धी कार्य भइरहेको छैन</translation>
@@ -1026,7 +1030,6 @@
 <translation id="5760715441271661976">पोर्टलको स्थिति</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> रिस्टार्ट र अपडेट गरिँदै छ</translation>
 <translation id="576835345334454681">डिस्प्लेको चमक बढाउने की</translation>
-<translation id="5775340474232476653">तपाईंका शिक्षक वा शिक्षिकाले कक्षा अन्त्य गर्नुभएको छ</translation>
 <translation id="5779818640587041940">रेकर्ड गरिरहेका बेला स्क्रिन अन राखिराख्नुहोस्</translation>
 <translation id="57838592816432529">म्यूट गर्नुहोस्</translation>
 <translation id="5784136236926853061">HTTP को विलम्बता धेरै छ</translation>
@@ -1529,6 +1532,7 @@
 <translation id="7971535376154084247">सामान्य कन्ट्रोलहरू</translation>
 <translation id="7977800524392185497"><ph name="NETWORK_NAME" /> नेटवर्कमा कनेक्ट गर्न सेटिङमा जानुहोस्</translation>
 <translation id="7978412674231730200">निजी कुञ्जी</translation>
+<translation id="7979468455552394856">विद्यार्थीहरू "कक्षाका टुलहरू" सेसनमा सामेल भएका छन्</translation>
 <translation id="7982789257301363584">सञ्जाल</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{"<ph name="APP_NAME_1" />" स्वतः खोलियो}other{# वटा एप स्वतः खोलिए}}</translation>
 <translation id="7994702968232966508">EAP विधि</translation>
diff --git a/chromeos/strings/chromeos_strings_nl.xtb b/chromeos/strings/chromeos_strings_nl.xtb
index d817e3a..f29b076 100644
--- a/chromeos/strings/chromeos_strings_nl.xtb
+++ b/chromeos/strings/chromeos_strings_nl.xtb
@@ -351,6 +351,7 @@
 <translation id="2438248248625638801">Opnametitels maken</translation>
 <translation id="2446553403094072641">Nauwkeurigheid van zwevendekommagetallen</translation>
 <translation id="2448312741937722512">Type</translation>
+<translation id="2448857983905133469">Tools voor lesgroepen</translation>
 <translation id="2468124392950503650">Selecteer een prompt die je wilt maken of bekijk de <ph name="BEGIN_LINK_PROMPTING_GUIDE" />handleiding voor prompts<ph name="END_LINK_PROMPTING_GUIDE" /></translation>
 <translation id="2472215337771558851">Gebruik Help me met schrijven om een conceptversie te maken of bestaand werk te verfijnen, mogelijk gemaakt door AI van Google</translation>
 <translation id="2475982808118771221">Er is een fout opgetreden</translation>
@@ -449,6 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> mA</translation>
 <translation id="3056720590588772262">Eindpunt</translation>
 <translation id="3060579846059757016">Details</translation>
+<translation id="3060798442805232711">Tools voor lesgroepen gebruikt je microfoon</translation>
 <translation id="3061850252076394168">Selecteer om voor te lezen aanzetten</translation>
 <translation id="3066772729299747758">op dinsdag</translation>
 <translation id="3069085583900247081">Test mislukt</translation>
@@ -910,6 +912,7 @@
 <translation id="5170568018924773124">Tonen in map</translation>
 <translation id="517075088756846356">Koppel de stroomkabel van je <ph name="DEVICE_NAME" /> los en sluit deze weer aan om door te gaan met het updateproces</translation>
 <translation id="5180108905184566358">baobabbomen</translation>
+<translation id="5180431943345994173">Je docent heeft content in Tools voor lesgroepen verwijderd</translation>
 <translation id="5180712487038406644">Expressief</translation>
 <translation id="5190187232518914472">Beleef je favoriete herinneringen opnieuw. Ga naar <ph name="LINK_BEGIN" />Google Foto's<ph name="LINK_END" /> om albums toe te voegen of te bewerken.</translation>
 <translation id="5212593641110061691">Tabloid</translation>
@@ -1003,6 +1006,7 @@
 <translation id="5628106863521633649">Beschikbare talen</translation>
 <translation id="5630438231335788050">bauhaus</translation>
 <translation id="5631759159893697722">uittreksel</translation>
+<translation id="5655084389678168978">Je docent heeft nieuwe content aan Tools voor lesgroepen toegevoegd</translation>
 <translation id="5655283760733841251">Helderheid van toetsenbord verhogen</translation>
 <translation id="5655296450510165335">Apparaatinschrijving</translation>
 <translation id="5655776422854483175">Geen afdruktaken</translation>
@@ -1026,7 +1030,6 @@
 <translation id="5760715441271661976">Status van portal</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> opnieuw opstarten en updaten</translation>
 <translation id="576835345334454681">Helderheid van scherm verhogen</translation>
-<translation id="5775340474232476653">Je docent heeft de les beëindigd</translation>
 <translation id="5779818640587041940">Scherm aan laten tijdens opnemen</translation>
 <translation id="57838592816432529">Geluid uitzetten</translation>
 <translation id="5784136236926853061">Hoge HTTP-vertraging</translation>
@@ -1529,6 +1532,7 @@
 <translation id="7971535376154084247">Algemene bedieningselementen</translation>
 <translation id="7977800524392185497">Ga naar Instellingen als je verbinding wilt maken met een <ph name="NETWORK_NAME" />-netwerk</translation>
 <translation id="7978412674231730200">Privésleutel</translation>
+<translation id="7979468455552394856">Tools voor lesgroepen is verbonden met leerlingen</translation>
 <translation id="7982789257301363584">Netwerk</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{<ph name="APP_NAME_1" /> is automatisch gestart}other{# apps zijn automatisch gestart}}</translation>
 <translation id="7994702968232966508">EAP-methode</translation>
diff --git a/chromeos/strings/chromeos_strings_no.xtb b/chromeos/strings/chromeos_strings_no.xtb
index c4e0d7c..7f1a762 100644
--- a/chromeos/strings/chromeos_strings_no.xtb
+++ b/chromeos/strings/chromeos_strings_no.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Portaltilstand</translation>
 <translation id="5763838252932650682">Starter <ph name="APP_NAME" /> på nytt og oppdaterer appen</translation>
 <translation id="576835345334454681">Skjermlysstyrke opp</translation>
-<translation id="5775340474232476653">Læreren har avsluttet timen</translation>
 <translation id="5779818640587041940">Hold skjermen på under opptak</translation>
 <translation id="57838592816432529">Kutt lyden</translation>
 <translation id="5784136236926853061">Høy HTTP-tidsforsinkelse</translation>
diff --git a/chromeos/strings/chromeos_strings_or.xtb b/chromeos/strings/chromeos_strings_or.xtb
index 481e6ec..764a9db 100644
--- a/chromeos/strings/chromeos_strings_or.xtb
+++ b/chromeos/strings/chromeos_strings_or.xtb
@@ -351,6 +351,7 @@
 <translation id="2438248248625638801">ରେକର୍ଡିଂ ଟାଇଟେଲ ତିଆରି କରାଯାଉଛି</translation>
 <translation id="2446553403094072641">ଫ୍ଲୋଟିଂ ପଏଣ୍ଟର ସଠିକତା</translation>
 <translation id="2448312741937722512">ପ୍ରକାର</translation>
+<translation id="2448857983905133469">କ୍ଲାସ ଟୁଲ</translation>
 <translation id="2468124392950503650"><ph name="BEGIN_LINK_PROMPTING_GUIDE" />ପ୍ରମ୍ପ୍ଟ ଗାଇଡ<ph name="END_LINK_PROMPTING_GUIDE" /> ତିଆରି କରିବା କିମ୍ବା ଦେଖିବା ପାଇଁ ପ୍ରମ୍ପ୍ଟକୁ ଚୟନ କରନ୍ତୁ</translation>
 <translation id="2472215337771558851">ଏକ ଡ୍ରାଫ୍ଟ ତିଆରି କରିବା କିମ୍ବା Google AI ଦ୍ୱାରା ପରିଚାଳିତ ପୂର୍ବରୁ ଥିବା କାର୍ଯ୍ୟକୁ ରିଫାଇନ କରିବା ପାଇଁ 'ଲେଖିବାରେ ମୋତେ ସାହାଯ୍ୟ କରନ୍ତୁ'କୁ ବ୍ୟବହାର କରନ୍ତୁ</translation>
 <translation id="2475982808118771221">ଏକ ତ୍ରୁଟି ଦେଖାଦେଲା</translation>
@@ -449,6 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" />mA</translation>
 <translation id="3056720590588772262">ଏଣ୍ଡପଏଣ୍ଟ</translation>
 <translation id="3060579846059757016">ଆଉଟଲାଇନଗୁଡ଼ିକ</translation>
+<translation id="3060798442805232711">କ୍ଲାସ ଟୁଲଗୁଡ଼ିକ ତୁମ ମାଇକ୍ରୋଫୋନ ବ୍ୟବହାର କରୁଛି</translation>
 <translation id="3061850252076394168">ସିଲେକ୍ଟ ଟୁ ସ୍ପିକ ସକ୍ଷମ କରନ୍ତୁ</translation>
 <translation id="3066772729299747758">ମଙ୍ଗଳବାର ଦିନ</translation>
 <translation id="3069085583900247081">ଟେଷ୍ଟ ବିଫଳ ହୋଇଛି</translation>
@@ -910,6 +912,7 @@
 <translation id="5170568018924773124">ଫୋଲ୍ଡରରେ ଦେଖାନ୍ତୁ</translation>
 <translation id="517075088756846356">ଅପଡେଟ ପ୍ରକ୍ରିୟା ଜାରି ରଖିବାକୁ <ph name="DEVICE_NAME" />ର ପାୱାର କେବୁଲକୁ ଅନପ୍ଲଗ କରି ପୁଣି ପ୍ଲଗ କରନ୍ତୁ</translation>
 <translation id="5180108905184566358">ବାଓବାବ ଗଛ</translation>
+<translation id="5180431943345994173">ତୁମ ଶିକ୍ଷକ କ୍ଲାସ ଟୁଲରୁ ବିଷୟବସ୍ତୁ କାଢ଼ି ଦେଇଛନ୍ତି</translation>
 <translation id="5180712487038406644">ଏକ୍ସପ୍ରେସିଭ</translation>
 <translation id="5190187232518914472">ଆପଣଙ୍କର ପ୍ରିୟ ସ୍ମୃତିଗୁଡ଼ିକୁ ପୁନର୍ଜୀବିତ କରନ୍ତୁ। ଆଲବମଗୁଡ଼ିକ ଯୋଗ କରିବା କିମ୍ବା ସେଗୁଡ଼ିକୁ ଏଡିଟ୍ କରିବା ପାଇଁ <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />କୁ ଯାଆନ୍ତୁ।</translation>
 <translation id="5212593641110061691">ଟାବଲଏଡ୍</translation>
@@ -1003,6 +1006,7 @@
 <translation id="5628106863521633649">ଉପଲବ୍ଧ ଭାଷା</translation>
 <translation id="5630438231335788050">ବଉହସ</translation>
 <translation id="5631759159893697722">ସାରାଂଶ</translation>
+<translation id="5655084389678168978">ତୁମ ଶିକ୍ଷକ କ୍ଲାସ ଟୁଲଗୁଡ଼ିକରେ ନୂଆ ବିଷୟବସ୍ତୁ ଯୋଗ କରିଛନ୍ତି</translation>
 <translation id="5655283760733841251">କୀବୋର୍ଡର ଉଜ୍ଜ୍ୱଳତା ବଢ଼ାନ୍ତୁ</translation>
 <translation id="5655296450510165335">ଡିଭାଇସର ପଞ୍ଜିକରଣ</translation>
 <translation id="5655776422854483175">କୌଣସି ପ୍ରିଣ୍ଟ ଜବ ନାହିଁ</translation>
@@ -1026,7 +1030,6 @@
 <translation id="5760715441271661976">ପୋର୍ଟାଲ୍ ସ୍ଥିତି</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" />କୁ ରିଷ୍ଟାର୍ଟ କରାଯାଇ ଅପଡେଟ କରାଯାଉଛି</translation>
 <translation id="576835345334454681">ଡିସପ୍ଲେର ଉଜ୍ଜ୍ୱଳତା ବଢ଼ାନ୍ତୁ</translation>
-<translation id="5775340474232476653">ତୁମ ଶିକ୍ଷକ କ୍ଲାସକୁ ସମାପ୍ତ କରିଛନ୍ତି</translation>
 <translation id="5779818640587041940">ରେକର୍ଡିଂ କରିବା ସମୟରେ ସ୍କ୍ରିନକୁ ଚାଲୁ ରଖନ୍ତୁ</translation>
 <translation id="57838592816432529">ମ୍ୟୁଟ୍‌</translation>
 <translation id="5784136236926853061">HTTPର ଅଧିକ ଲାଟେନ୍ସି</translation>
@@ -1529,6 +1532,7 @@
 <translation id="7971535376154084247">ସାଧାରଣ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ</translation>
 <translation id="7977800524392185497">ଏକ <ph name="NETWORK_NAME" /> ନେଟୱାର୍କରେ ଯୋଗ ଦେବା ପାଇଁ, ସେଟିଂସକୁ ଯାଆନ୍ତୁ</translation>
 <translation id="7978412674231730200">ବ୍ୟକ୍ତିଗତ କୀ</translation>
+<translation id="7979468455552394856">କ୍ଲାସ ଟୁଲଗୁଡ଼ିକ ଛାତ୍ର/ଛାତ୍ରୀମାନଙ୍କ ସହ କନେକ୍ଟ ହୋଇଛି</translation>
 <translation id="7982789257301363584">ନେଟୱାର୍କ</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{"<ph name="APP_NAME_1" />" ସ୍ୱତଃ ଆରମ୍ଭ ହୋଇଛି}other{# ଆପ୍ସ ସ୍ୱତଃ ଆରମ୍ଭ ହୋଇଛି}}</translation>
 <translation id="7994702968232966508">EAP ପଦ୍ଧତି</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb
index 4a0deda..9074274 100644
--- a/chromeos/strings/chromeos_strings_pa.xtb
+++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">ਪੋਰਟਲ ਸਥਿਤੀ</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਅਤੇ ਅੱਪਡੇਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation>
 <translation id="576835345334454681">ਡਿਸਪਲੇ ਦੀ ਚਮਕ ਵਧਾਉਣ ਵਾਲੀ ਕੁੰਜੀ</translation>
-<translation id="5775340474232476653">ਤੁਹਾਡੇ ਅਧਿਆਪਕ ਨੇ ਕਲਾਸ ਖਤਮ ਕਰ ਦਿੱਤੀ ਹੈ</translation>
 <translation id="5779818640587041940">ਰਿਕਾਰਡਿੰਗ ਕਰਦੇ ਸਮੇਂ ਸਕ੍ਰੀਨ ਨੂੰ ਚਾਲੂ ਰੱਖੋ</translation>
 <translation id="57838592816432529">ਮਿਊਟ ਕਰੋ</translation>
 <translation id="5784136236926853061">ਜ਼ਿਆਦਾ HTTP ਵਿਲੰਬਤਾ</translation>
diff --git a/chromeos/strings/chromeos_strings_pl.xtb b/chromeos/strings/chromeos_strings_pl.xtb
index e059f5f..6920b0a7 100644
--- a/chromeos/strings/chromeos_strings_pl.xtb
+++ b/chromeos/strings/chromeos_strings_pl.xtb
@@ -1028,7 +1028,6 @@
 <translation id="5760715441271661976">Stan portalu</translation>
 <translation id="5763838252932650682">Uruchamiam ponownie i aktualizuję aplikację <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Zwiększ jasność wyświetlacza</translation>
-<translation id="5775340474232476653">Nauczyciel zakończył zajęcia</translation>
 <translation id="5779818640587041940">Nie wyłączaj ekranu podczas nagrywania</translation>
 <translation id="57838592816432529">Wycisz</translation>
 <translation id="5784136236926853061">Duże opóźnienie HTTP</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb
index cf84bda..69c97c6 100644
--- a/chromeos/strings/chromeos_strings_pt-BR.xtb
+++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Estado do portal</translation>
 <translation id="5763838252932650682">Reiniciando e atualizando o app <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Aumentar o brilho da tela</translation>
-<translation id="5775340474232476653">O professor encerrou a aula</translation>
 <translation id="5779818640587041940">Manter a tela ligada durante a gravação</translation>
 <translation id="57838592816432529">Desativar som</translation>
 <translation id="5784136236926853061">A latência do HTTP está alta</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-PT.xtb b/chromeos/strings/chromeos_strings_pt-PT.xtb
index 6bb84ae..686beb9 100644
--- a/chromeos/strings/chromeos_strings_pt-PT.xtb
+++ b/chromeos/strings/chromeos_strings_pt-PT.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">Estado do portal</translation>
 <translation id="5763838252932650682">A reiniciar e a atualizar a app <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Aumentar o luminosidade do ecrã</translation>
-<translation id="5775340474232476653">O professor terminou a aula</translation>
 <translation id="5779818640587041940">Manter ecrã ligado durante a gravação</translation>
 <translation id="57838592816432529">Desativar som</translation>
 <translation id="5784136236926853061">Latência elevada de HTTP</translation>
diff --git a/chromeos/strings/chromeos_strings_ro.xtb b/chromeos/strings/chromeos_strings_ro.xtb
index d1a35f7..b8508e6 100644
--- a/chromeos/strings/chromeos_strings_ro.xtb
+++ b/chromeos/strings/chromeos_strings_ro.xtb
@@ -351,6 +351,7 @@
 <translation id="2438248248625638801">Se creează titluri de înregistrări</translation>
 <translation id="2446553403094072641">Precizia virgulei mobile</translation>
 <translation id="2448312741937722512">Tipul</translation>
+<translation id="2448857983905133469">Class Tools</translation>
 <translation id="2468124392950503650">Selectează solicitarea pentru a crea sau a vedea <ph name="BEGIN_LINK_PROMPTING_GUIDE" />ghidul pentru solicitări<ph name="END_LINK_PROMPTING_GUIDE" /></translation>
 <translation id="2472215337771558851">Folosește funcția Ajută-mă să scriu pentru a crea o schiță sau a rafina lucrările existente, pe bază de Google AI</translation>
 <translation id="2475982808118771221">A apărut o eroare</translation>
@@ -449,6 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> mA</translation>
 <translation id="3056720590588772262">Punct final</translation>
 <translation id="3060579846059757016">Scheme</translation>
+<translation id="3060798442805232711">Class Tools folosește microfonul</translation>
 <translation id="3061850252076394168">activează Selectează și ascultă</translation>
 <translation id="3066772729299747758">marți</translation>
 <translation id="3069085583900247081">Testul nu a reușit</translation>
@@ -910,6 +912,7 @@
 <translation id="5170568018924773124">Afișează în dosar</translation>
 <translation id="517075088756846356">Deconectează și reconectează cablul de alimentare pentru <ph name="DEVICE_NAME" /> pentru a continua procesul de actualizare</translation>
 <translation id="5180108905184566358">baobabi</translation>
+<translation id="5180431943345994173">Profesorul tău a eliminat conținut din Class Tools</translation>
 <translation id="5180712487038406644">Expresiv</translation>
 <translation id="5190187232518914472">Retrăiește amintirile preferate. Pentru a adăuga sau a edita albume, accesează <ph name="LINK_BEGIN" />Google Foto<ph name="LINK_END" />.</translation>
 <translation id="5212593641110061691">Tabloid</translation>
@@ -1003,6 +1006,7 @@
 <translation id="5628106863521633649">Limbi disponibile</translation>
 <translation id="5630438231335788050">bauhaus</translation>
 <translation id="5631759159893697722">rezumat</translation>
+<translation id="5655084389678168978">Profesorul tău a adăugat conținut nou în Class Tools</translation>
 <translation id="5655283760733841251">Creșterea luminozității tastaturii</translation>
 <translation id="5655296450510165335">Înregistrarea dispozitivului</translation>
 <translation id="5655776422854483175">Nicio sarcină de printare</translation>
@@ -1026,7 +1030,6 @@
 <translation id="5760715441271661976">Starea portalului</translation>
 <translation id="5763838252932650682">Se repornește și se actualizează <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Creșterea luminozității ecranului</translation>
-<translation id="5775340474232476653">Profesorul a încheiat cursul</translation>
 <translation id="5779818640587041940">Menține ecranul activat în timpul înregistrării</translation>
 <translation id="57838592816432529">Dezactivează sunetul</translation>
 <translation id="5784136236926853061">Latență mare a solicitărilor HTTP</translation>
@@ -1529,6 +1532,7 @@
 <translation id="7971535376154084247">Comenzi generale</translation>
 <translation id="7977800524392185497">Pentru a te conecta la o rețea <ph name="NETWORK_NAME" />, accesează Setările</translation>
 <translation id="7978412674231730200">Cheie privată</translation>
+<translation id="7979468455552394856">Class Tools este conectat la elevi</translation>
 <translation id="7982789257301363584">Rețea</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{<ph name="APP_NAME_1" /> a pornit automat}few{# aplicații au pornit automat}other{# de aplicații au pornit automat}}</translation>
 <translation id="7994702968232966508">Metodă EAP</translation>
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb
index e05ca57..9a3f942 100644
--- a/chromeos/strings/chromeos_strings_ru.xtb
+++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -351,6 +351,7 @@
 <translation id="2438248248625638801">Создание названий записей</translation>
 <translation id="2446553403094072641">Точность чисел с плавающей запятой</translation>
 <translation id="2448312741937722512">Тип</translation>
+<translation id="2448857983905133469">Инструменты для уроков</translation>
 <translation id="2468124392950503650">Выберите запрос или посмотрите <ph name="BEGIN_LINK_PROMPTING_GUIDE" />руководство по его составлению<ph name="END_LINK_PROMPTING_GUIDE" /></translation>
 <translation id="2472215337771558851">Генератор текстов создаст черновик или поможет улучшить существующий текст, используя технологии ИИ от Google.</translation>
 <translation id="2475982808118771221">Произошел сбой.</translation>
@@ -449,6 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> мА</translation>
 <translation id="3056720590588772262">Конечная точка</translation>
 <translation id="3060579846059757016">Описание</translation>
+<translation id="3060798442805232711">Инструменты для уроков используют ваш микрофон.</translation>
 <translation id="3061850252076394168">включить озвучивание при нажатии</translation>
 <translation id="3066772729299747758">во вторник</translation>
 <translation id="3069085583900247081">Проверка не пройдена</translation>
@@ -910,6 +912,7 @@
 <translation id="5170568018924773124">Показать в папке</translation>
 <translation id="517075088756846356">Чтобы продолжить обновление, отключите и снова вставьте кабель питания устройства "<ph name="DEVICE_NAME" />".</translation>
 <translation id="5180108905184566358">баобабы</translation>
+<translation id="5180431943345994173">Преподаватель удалил контент из инструментов для уроков.</translation>
 <translation id="5180712487038406644">Выразительная</translation>
 <translation id="5190187232518914472">Вспоминайте яркие моменты своей жизни. Чтобы добавить или изменить альбом, перейдите в <ph name="LINK_BEGIN" />Google Фото<ph name="LINK_END" />.</translation>
 <translation id="5212593641110061691">Tabloid</translation>
@@ -1003,6 +1006,7 @@
 <translation id="5628106863521633649">Доступные языки</translation>
 <translation id="5630438231335788050">баухаус</translation>
 <translation id="5631759159893697722">аннотация</translation>
+<translation id="5655084389678168978">Преподаватель добавил контент в инструменты для уроков.</translation>
 <translation id="5655283760733841251">Увеличение яркости клавиатуры</translation>
 <translation id="5655296450510165335">Регистрация устройства</translation>
 <translation id="5655776422854483175">Заданий печати нет</translation>
@@ -1026,7 +1030,6 @@
 <translation id="5760715441271661976">Состояние страницы входа</translation>
 <translation id="5763838252932650682">Перезапуск и обновление приложения "<ph name="APP_NAME" />"</translation>
 <translation id="576835345334454681">Увеличение яркости экрана</translation>
-<translation id="5775340474232476653">Преподаватель завершил занятие.</translation>
 <translation id="5779818640587041940">Не отключать экран во время записи</translation>
 <translation id="57838592816432529">Отключить звук</translation>
 <translation id="5784136236926853061">большое время ожидания HTTP</translation>
@@ -1529,6 +1532,7 @@
 <translation id="7971535376154084247">Общие настройки</translation>
 <translation id="7977800524392185497">Чтобы подключиться к сети <ph name="NETWORK_NAME" />, перейдите в настройки.</translation>
 <translation id="7978412674231730200">Закрытый ключ</translation>
+<translation id="7979468455552394856">Учащиеся подключены к инструментам для уроков.</translation>
 <translation id="7982789257301363584">Сеть</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{Приложение "<ph name="APP_NAME_1" />" открылось автоматически}one{# приложение открылось автоматически}few{# приложения открылись автоматически}many{# приложений открылись автоматически}other{# приложения открылись автоматически}}</translation>
 <translation id="7994702968232966508">Метод EAP</translation>
diff --git a/chromeos/strings/chromeos_strings_si.xtb b/chromeos/strings/chromeos_strings_si.xtb
index 5175627..63a9065 100644
--- a/chromeos/strings/chromeos_strings_si.xtb
+++ b/chromeos/strings/chromeos_strings_si.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">ද්වාර තත්වය</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> යළි අරඹා යාවත්කාලීන කරමින්</translation>
 <translation id="576835345334454681">සංදර්ශක දීප්තිය ඉහළට</translation>
-<translation id="5775340474232476653">ඔබේ ගුරුවරයා පන්තිය අවසන් කර ඇත</translation>
 <translation id="5779818640587041940">පටිගත කරන විට තිරය සක්‍රීයව තබා ගන්න</translation>
 <translation id="57838592816432529">නිහඬ කරන්න</translation>
 <translation id="5784136236926853061">ඉහළ HTTP පමාව</translation>
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb
index 6a49bae..3a9d2656b 100644
--- a/chromeos/strings/chromeos_strings_sk.xtb
+++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">Stav portálu</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> sa reštartuje a aktualizuje</translation>
 <translation id="576835345334454681">Zvýšenie jasu obrazovky</translation>
-<translation id="5775340474232476653">Učiteľ ukončil vyučovanie</translation>
 <translation id="5779818640587041940">Ponechať obrazovku pri nahrávaní zapnutú</translation>
 <translation id="57838592816432529">Vypnúť zvuk</translation>
 <translation id="5784136236926853061">Vysoká latencia protokolu HTTPS</translation>
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb
index f82067e..8a6f209 100644
--- a/chromeos/strings/chromeos_strings_sl.xtb
+++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Stanje portala</translation>
 <translation id="5763838252932650682">Vnovični zagon in posodabljanje aplikacije <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Povečanje svetlosti zaslona</translation>
-<translation id="5775340474232476653">Učitelj je končal predavanje</translation>
 <translation id="5779818640587041940">Med snemanjem naj zaslon ostane vklopljen</translation>
 <translation id="57838592816432529">Izklopi zvok</translation>
 <translation id="5784136236926853061">Velika zakasnitev HTTP</translation>
diff --git a/chromeos/strings/chromeos_strings_sq.xtb b/chromeos/strings/chromeos_strings_sq.xtb
index b8c98ba..230b085 100644
--- a/chromeos/strings/chromeos_strings_sq.xtb
+++ b/chromeos/strings/chromeos_strings_sq.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">Gjendja e portalit</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> po riniset dhe po përditësohet</translation>
 <translation id="576835345334454681">Ngritja e ndriçimit të ekranit</translation>
-<translation id="5775340474232476653">Mësuesi yt e ka përfunduar orën e mësimit</translation>
 <translation id="5779818640587041940">Mbaje ekranin ndezur ndërsa regjistron</translation>
 <translation id="57838592816432529">Hiqi zërin</translation>
 <translation id="5784136236926853061">Vonesë shumë e lartë e HTTP-së</translation>
diff --git a/chromeos/strings/chromeos_strings_sr-Latn.xtb b/chromeos/strings/chromeos_strings_sr-Latn.xtb
index 926b300..532a87b 100644
--- a/chromeos/strings/chromeos_strings_sr-Latn.xtb
+++ b/chromeos/strings/chromeos_strings_sr-Latn.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">Status portala</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> se restartuje i ažurira</translation>
 <translation id="576835345334454681">Povećajte osvetljenost ekrana</translation>
-<translation id="5775340474232476653">Nastavnik je završio čas</translation>
 <translation id="5779818640587041940">Ne isključuj ekran tokom snimanja</translation>
 <translation id="57838592816432529">Isključi zvuk</translation>
 <translation id="5784136236926853061">Veliko HTTP kašnjenje</translation>
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb
index 60c5498..82ca76fe 100644
--- a/chromeos/strings/chromeos_strings_sr.xtb
+++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">Статус портала</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> се рестартује и ажурира</translation>
 <translation id="576835345334454681">Повећајте осветљеност екрана</translation>
-<translation id="5775340474232476653">Наставник је завршио час</translation>
 <translation id="5779818640587041940">Не искључуј екран током снимања</translation>
 <translation id="57838592816432529">Искључи звук</translation>
 <translation id="5784136236926853061">Велико HTTP кашњење</translation>
diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb
index 71e1eb5..f65b571 100644
--- a/chromeos/strings/chromeos_strings_sv.xtb
+++ b/chromeos/strings/chromeos_strings_sv.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Portalläge</translation>
 <translation id="5763838252932650682">Startar om och uppdaterar <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Tangenten som ökar skärmens ljusstyrka</translation>
-<translation id="5775340474232476653">Läraren har avslutat lektionen</translation>
 <translation id="5779818640587041940">Låt skärmen vara på under inspelning</translation>
 <translation id="57838592816432529">Stäng av ljudet</translation>
 <translation id="5784136236926853061">Hög HTTP-latens</translation>
diff --git a/chromeos/strings/chromeos_strings_sw.xtb b/chromeos/strings/chromeos_strings_sw.xtb
index fcd0956..fcaf79ad 100644
--- a/chromeos/strings/chromeos_strings_sw.xtb
+++ b/chromeos/strings/chromeos_strings_sw.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">Hali ya Ukurasa wa Mwanzo</translation>
 <translation id="5763838252932650682">Kuzima kisha kuwasha na kusasisha <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Ongeza mwangaza wa skrini</translation>
-<translation id="5775340474232476653">Mwalimu wako ametamatisha darasa</translation>
 <translation id="5779818640587041940">Usizime skrini unaporekodi</translation>
 <translation id="57838592816432529">Zima sauti</translation>
 <translation id="5784136236926853061">Muda mwingi wa kusubiri maombi ya HTTP</translation>
diff --git a/chromeos/strings/chromeos_strings_ta.xtb b/chromeos/strings/chromeos_strings_ta.xtb
index 8f918aa..15b70251 100644
--- a/chromeos/strings/chromeos_strings_ta.xtb
+++ b/chromeos/strings/chromeos_strings_ta.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">போர்டல் நிலை</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> ஆப்ஸை மீண்டும் தொடங்கி புதுப்பித்தல்</translation>
 <translation id="576835345334454681">காட்சி ஒளிர்வை அதிகரிக்கும்</translation>
-<translation id="5775340474232476653">ஆசிரியர் வகுப்பை முடித்துவிட்டார்</translation>
 <translation id="5779818640587041940">ரெக்கார்டு செய்யும்போது திரையை ஆனில் வைத்திரு</translation>
 <translation id="57838592816432529">ஒலியடக்கு</translation>
 <translation id="5784136236926853061">HTTP கோரிக்கைகள் அதிக நேரம் எடுத்துக்கொள்கின்றன</translation>
diff --git a/chromeos/strings/chromeos_strings_te.xtb b/chromeos/strings/chromeos_strings_te.xtb
index 6317a63..ce87424 100644
--- a/chromeos/strings/chromeos_strings_te.xtb
+++ b/chromeos/strings/chromeos_strings_te.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">పోర్టల్ స్థితి</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" />‌ను రీస్టార్ట్ చేసి, అప్‌డేట్ చేయడం</translation>
 <translation id="576835345334454681">డిస్‌ప్లే బ్రైట్‌నెస్‌ను పెంచండి</translation>
-<translation id="5775340474232476653">మీ టీచర్ క్లాస్‌ను ముగించారు</translation>
 <translation id="5779818640587041940">రికార్డింగ్ చేస్తున్నప్పుడు స్క్రీన్ ఆన్‌లో ఉంచండి</translation>
 <translation id="57838592816432529">మ్యూట్ చేయి</translation>
 <translation id="5784136236926853061">అధిక HTTPS ప్రతిస్పందన సమయం</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb
index f000adf..228a42e 100644
--- a/chromeos/strings/chromeos_strings_th.xtb
+++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">สถานะพอร์ทัล</translation>
 <translation id="5763838252932650682">กำลังรีสตาร์ทและอัปเดต <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">เพิ่มความสว่างของหน้าจอ</translation>
-<translation id="5775340474232476653">ครูได้สิ้นสุดชั้นเรียนแล้ว</translation>
 <translation id="5779818640587041940">เปิดหน้าจอค้างไว้เมื่อบันทึก</translation>
 <translation id="57838592816432529">ปิดเสียง</translation>
 <translation id="5784136236926853061">เวลาในการตอบสนองของ HTTP สูง</translation>
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb
index 176a860..43d2e2d 100644
--- a/chromeos/strings/chromeos_strings_tr.xtb
+++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Portal Durumu</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> yeniden başlatılıyor ve güncelleniyor</translation>
 <translation id="576835345334454681">Ekran parlaklığını artır</translation>
-<translation id="5775340474232476653">Öğretmeniniz dersi sonlandırdı</translation>
 <translation id="5779818640587041940">Kayıt sırasında ekranı açık tut</translation>
 <translation id="57838592816432529">Sesi kapat</translation>
 <translation id="5784136236926853061">Yüksek HTTP gecikmesi</translation>
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb
index b58b4f7..951594df 100644
--- a/chromeos/strings/chromeos_strings_uk.xtb
+++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Стан порталу</translation>
 <translation id="5763838252932650682">Перезапуск і оновлення додатка <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Збільшити яскравість екрана</translation>
-<translation id="5775340474232476653">Викладач завершив заняття</translation>
 <translation id="5779818640587041940">Не вимикати екран під час запису</translation>
 <translation id="57838592816432529">Вимкнути звук</translation>
 <translation id="5784136236926853061">Велика затримка HTTP</translation>
diff --git a/chromeos/strings/chromeos_strings_ur.xtb b/chromeos/strings/chromeos_strings_ur.xtb
index 67b4645f..9e2b2d9 100644
--- a/chromeos/strings/chromeos_strings_ur.xtb
+++ b/chromeos/strings/chromeos_strings_ur.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">پورٹل صورت حال</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> کو ری اسٹارٹ اور اپ ڈیٹ کیا جا رہا ہے</translation>
 <translation id="576835345334454681">ڈسپلے کی چمک بڑھانے کی کلید</translation>
-<translation id="5775340474232476653">آپ کے استاد نے کلاس کو ختم کر دیا ہے</translation>
 <translation id="5779818640587041940">ریکارڈنگ کرتے وقت اسکرین آن رکھیں</translation>
 <translation id="57838592816432529">آواز بند کریں</translation>
 <translation id="5784136236926853061">‏زیادہ HTTPS تاخیر</translation>
diff --git a/chromeos/strings/chromeos_strings_uz.xtb b/chromeos/strings/chromeos_strings_uz.xtb
index dbd1084d..7c9b87a 100644
--- a/chromeos/strings/chromeos_strings_uz.xtb
+++ b/chromeos/strings/chromeos_strings_uz.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Portal holati</translation>
 <translation id="5763838252932650682"><ph name="APP_NAME" /> qayta ishga tushirilmoqda va yangilanmoqda</translation>
 <translation id="576835345334454681">Displey yorqinligini oshirish</translation>
-<translation id="5775340474232476653">Oʻqituvchi darsni yakunladi</translation>
 <translation id="5779818640587041940">Ovoz yozib olishda ekran yoniq tursin</translation>
 <translation id="57838592816432529">Ovozni o‘chirib qo‘yish</translation>
 <translation id="5784136236926853061">HTTP kechikishi yuqori</translation>
diff --git a/chromeos/strings/chromeos_strings_vi.xtb b/chromeos/strings/chromeos_strings_vi.xtb
index 4128896..e9fbfdf0 100644
--- a/chromeos/strings/chromeos_strings_vi.xtb
+++ b/chromeos/strings/chromeos_strings_vi.xtb
@@ -1030,7 +1030,6 @@
 <translation id="5760715441271661976">Trạng thái trang xác thực</translation>
 <translation id="5763838252932650682">Đang khởi động lại và cập nhật <ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Tăng độ sáng màn hình</translation>
-<translation id="5775340474232476653">Giáo viên đã kết thúc lớp học</translation>
 <translation id="5779818640587041940">Duy trì màn hình ở trạng thái bật khi ghi âm</translation>
 <translation id="57838592816432529">Tắt tiếng</translation>
 <translation id="5784136236926853061">Yêu cầu HTTP có độ trễ cao</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-CN.xtb b/chromeos/strings/chromeos_strings_zh-CN.xtb
index 97e3ebbb..b8ecab88 100644
--- a/chromeos/strings/chromeos_strings_zh-CN.xtb
+++ b/chromeos/strings/chromeos_strings_zh-CN.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">门户状态</translation>
 <translation id="5763838252932650682">正在重启并更新“<ph name="APP_NAME" />”</translation>
 <translation id="576835345334454681">调高显示屏亮度</translation>
-<translation id="5775340474232476653">老师已结束课程</translation>
 <translation id="5779818640587041940">录制时使屏幕保持开启状态</translation>
 <translation id="57838592816432529">静音</translation>
 <translation id="5784136236926853061">HTTP 延迟时间较长</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-HK.xtb b/chromeos/strings/chromeos_strings_zh-HK.xtb
index 6eda21b..42b7eb4 100644
--- a/chromeos/strings/chromeos_strings_zh-HK.xtb
+++ b/chromeos/strings/chromeos_strings_zh-HK.xtb
@@ -351,6 +351,7 @@
 <translation id="2438248248625638801">正在建立錄音內容標題</translation>
 <translation id="2446553403094072641">浮點準確性</translation>
 <translation id="2448312741937722512">類型</translation>
+<translation id="2448857983905133469">課堂工具</translation>
 <translation id="2468124392950503650">選取要建立的提示或查看<ph name="BEGIN_LINK_PROMPTING_GUIDE" />提示指南<ph name="END_LINK_PROMPTING_GUIDE" /></translation>
 <translation id="2472215337771558851">「幫我寫」功能採用 Google AI 技術,用來建立草稿或修正現有作品</translation>
 <translation id="2475982808118771221">發生錯誤</translation>
@@ -449,6 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" />mA</translation>
 <translation id="3056720590588772262">端點</translation>
 <translation id="3060579846059757016">概要</translation>
+<translation id="3060798442805232711">「課堂工具」正在使用麥克風</translation>
 <translation id="3061850252076394168">啟用揀選朗讀內容</translation>
 <translation id="3066772729299747758">星期二</translation>
 <translation id="3069085583900247081">未通過測試</translation>
@@ -910,6 +912,7 @@
 <translation id="5170568018924773124">在資料夾中顯示</translation>
 <translation id="517075088756846356">請拔除然後重新插上「<ph name="DEVICE_NAME" />」電源線,以繼續更新程序</translation>
 <translation id="5180108905184566358">猴麵包樹</translation>
+<translation id="5180431943345994173">老師已移除「課堂工具」中的內容</translation>
 <translation id="5180712487038406644">熱情奔放</translation>
 <translation id="5190187232518914472">重溫美好回憶。如要新增或編輯相簿,請前往「<ph name="LINK_BEGIN" />Google 相片<ph name="LINK_END" />」。</translation>
 <translation id="5212593641110061691">Tabloid</translation>
@@ -1003,6 +1006,7 @@
 <translation id="5628106863521633649">可用的語言</translation>
 <translation id="5630438231335788050">包豪斯</translation>
 <translation id="5631759159893697722">摘要</translation>
+<translation id="5655084389678168978">老師已在「課堂工具」中新增內容</translation>
 <translation id="5655283760733841251">鍵盤校光亮度</translation>
 <translation id="5655296450510165335">裝置註冊</translation>
 <translation id="5655776422854483175">沒有任何列印工作</translation>
@@ -1026,7 +1030,6 @@
 <translation id="5760715441271661976">入口網站狀態</translation>
 <translation id="5763838252932650682">正在重新啟動並更新「<ph name="APP_NAME" />」</translation>
 <translation id="576835345334454681">顯示屏校光亮度</translation>
-<translation id="5775340474232476653">老師已結束課堂</translation>
 <translation id="5779818640587041940">錄音時讓螢幕保持開啟</translation>
 <translation id="57838592816432529">静音</translation>
 <translation id="5784136236926853061">HTTP 延遲時間過長</translation>
@@ -1529,6 +1532,7 @@
 <translation id="7971535376154084247">一般控制項</translation>
 <translation id="7977800524392185497">如要加入 <ph name="NETWORK_NAME" /> 網絡,請前往「設定」頁面</translation>
 <translation id="7978412674231730200">私密金鑰</translation>
+<translation id="7979468455552394856">「課堂工具」已連接學生的裝置</translation>
 <translation id="7982789257301363584">網絡</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{系統已自動啟動「<ph name="APP_NAME_1" />」}other{系統已自動啟動 # 個應用程式}}</translation>
 <translation id="7994702968232966508">EAP 方法</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-TW.xtb b/chromeos/strings/chromeos_strings_zh-TW.xtb
index 1365b9a..7db9b1e8 100644
--- a/chromeos/strings/chromeos_strings_zh-TW.xtb
+++ b/chromeos/strings/chromeos_strings_zh-TW.xtb
@@ -351,6 +351,7 @@
 <translation id="2438248248625638801">正在建立錄音檔標題</translation>
 <translation id="2446553403094072641">浮點精確度</translation>
 <translation id="2448312741937722512">類型</translation>
+<translation id="2448857983905133469">課程工具組</translation>
 <translation id="2468124392950503650">選取要建立的提示或查看<ph name="BEGIN_LINK_PROMPTING_GUIDE" />提示指南<ph name="END_LINK_PROMPTING_GUIDE" /></translation>
 <translation id="2472215337771558851">「幫我寫」功能採用 Google AI 技術,歡迎用來建立草稿或修正現有作品</translation>
 <translation id="2475982808118771221">發生錯誤</translation>
@@ -449,6 +450,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" /> mA</translation>
 <translation id="3056720590588772262">端點</translation>
 <translation id="3060579846059757016">概要</translation>
+<translation id="3060798442805232711">課程工具組正在使用麥克風</translation>
 <translation id="3061850252076394168">啟用隨選朗讀</translation>
 <translation id="3066772729299747758">星期二</translation>
 <translation id="3069085583900247081">未通過測試</translation>
@@ -910,6 +912,7 @@
 <translation id="5170568018924773124">在資料夾中顯示</translation>
 <translation id="517075088756846356">請將「<ph name="DEVICE_NAME" />」的電源線拔除再重新接上,以繼續進行更新程序</translation>
 <translation id="5180108905184566358">猴麵包樹</translation>
+<translation id="5180431943345994173">老師已移除課程工具組中的內容</translation>
 <translation id="5180712487038406644">栩栩如生</translation>
 <translation id="5190187232518914472">重溫你最珍視的美好回憶。如要新增或編輯相簿,請前往 <ph name="LINK_BEGIN" />Google 相簿<ph name="LINK_END" />。</translation>
 <translation id="5212593641110061691">Tabloid</translation>
@@ -1003,6 +1006,7 @@
 <translation id="5628106863521633649">可用的語言</translation>
 <translation id="5630438231335788050">包浩斯</translation>
 <translation id="5631759159893697722">摘要</translation>
+<translation id="5655084389678168978">老師已在課程工具組中新增內容</translation>
 <translation id="5655283760733841251">鍵盤亮度調高</translation>
 <translation id="5655296450510165335">裝置註冊</translation>
 <translation id="5655776422854483175">沒有任何列印工作</translation>
@@ -1026,7 +1030,6 @@
 <translation id="5760715441271661976">入口網站狀態</translation>
 <translation id="5763838252932650682">正在重新啟動並更新「<ph name="APP_NAME" />」</translation>
 <translation id="576835345334454681">顯示亮度調高</translation>
-<translation id="5775340474232476653">老師已結束課程</translation>
 <translation id="5779818640587041940">錄音時螢幕保持開啟</translation>
 <translation id="57838592816432529">靜音</translation>
 <translation id="5784136236926853061">HTTP 延遲時間過長</translation>
@@ -1529,6 +1532,7 @@
 <translation id="7971535376154084247">一般控制項</translation>
 <translation id="7977800524392185497">如要加入 <ph name="NETWORK_NAME" /> 網路,請前往「設定」頁面</translation>
 <translation id="7978412674231730200">秘密金鑰</translation>
+<translation id="7979468455552394856">課程工具組已連上學生的裝置</translation>
 <translation id="7982789257301363584">網路</translation>
 <translation id="7983597390787556680">{NUM_ROOL_APPS,plural, =1{「<ph name="APP_NAME_1" />」已自動啟動}other{# 個應用程式已自動啟動}}</translation>
 <translation id="7994702968232966508">EAP 方法</translation>
diff --git a/chromeos/strings/chromeos_strings_zu.xtb b/chromeos/strings/chromeos_strings_zu.xtb
index 33f750d..c22e8b1 100644
--- a/chromeos/strings/chromeos_strings_zu.xtb
+++ b/chromeos/strings/chromeos_strings_zu.xtb
@@ -1026,7 +1026,6 @@
 <translation id="5760715441271661976">Isimo sephothali</translation>
 <translation id="5763838252932650682">Ukuqala kabusha nokubuyekeza i-<ph name="APP_NAME" /></translation>
 <translation id="576835345334454681">Ukugqama kwesibonisi kuphezulu</translation>
-<translation id="5775340474232476653">Uthisha wakho uqede ikilasi</translation>
 <translation id="5779818640587041940">Gcina isikrini sivulekile ngesikhathi urekhoda</translation>
 <translation id="57838592816432529">Thulisa</translation>
 <translation id="5784136236926853061">Ukubambezeleka kwe-HTTP okuphakeme</translation>
diff --git a/clank b/clank
index dc121c5..5c66745 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit dc121c58029e00ebbaaa941a253676b6e66f7d90
+Subproject commit 5c66745b33cda1230040a42b22046206497c6580
diff --git a/components/account_manager_core/account_manager_util.cc b/components/account_manager_core/account_manager_util.cc
index 486e9856..9996a22 100644
--- a/components/account_manager_core/account_manager_util.cc
+++ b/components/account_manager_core/account_manager_util.cc
@@ -95,6 +95,10 @@
         kRemoteConsentResolutionRequired:
       return GoogleServiceAuthError::ScopeLimitedUnrecoverableErrorReason::
           kRemoteConsentResolutionRequired;
+    case cm::GoogleServiceAuthError::ScopeLimitedUnrecoverableErrorReason::
+        kAccessDenied:
+      return GoogleServiceAuthError::ScopeLimitedUnrecoverableErrorReason::
+          kAccessDenied;
   }
 }
 
@@ -122,6 +126,10 @@
         kRemoteConsentResolutionRequired:
       return cm::GoogleServiceAuthError::ScopeLimitedUnrecoverableErrorReason::
           kRemoteConsentResolutionRequired;
+    case GoogleServiceAuthError::ScopeLimitedUnrecoverableErrorReason::
+        kAccessDenied:
+      return cm::GoogleServiceAuthError::ScopeLimitedUnrecoverableErrorReason::
+          kAccessDenied;
   }
 }
 
diff --git a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_encoding.cc b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_encoding.cc
index 273f178..5aec9dc 100644
--- a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_encoding.cc
+++ b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_encoding.cc
@@ -953,32 +953,6 @@
     AutofillMetrics::LogServerResponseHasDataForForm(std::ranges::any_of(
         form->fields(), [](FieldType t) { return t != NO_SERVER_DATA; },
         &AutofillField::server_type));
-
-    form->RationalizeFormStructure(log_manager);
-
-    AssignSections(form->fields());
-
-    // Since this step requires the sections to be available, it is done after
-    // the sectioning logic is ran. Note that since this step doesn't change the
-    // types of the individual field, this should not break any assumption that
-    // was made to compute the sections.
-    form->RationalizePhoneNumberFieldsForFilling();
-
-    // Log the field type predicted by rationalization.
-    // The sections are mapped to consecutive natural numbers starting at 1.
-    std::map<Section, size_t> section_id_map;
-    for (const auto& field : form->fields()) {
-      if (!base::Contains(section_id_map, field->section())) {
-        size_t next_section_id = section_id_map.size() + 1;
-        section_id_map[field->section()] = next_section_id;
-      }
-      field->AppendLogEventIfNotRepeated(RationalizationFieldLogEvent{
-          .field_type = field->Type().GetStorableType(),
-          .section_id = section_id_map[field->section()],
-          .type_changed = field->Type().GetStorableType() !=
-                          field->ComputedType().GetStorableType(),
-      });
-    }
   }
 
   AutofillMetrics::ServerQueryMetric metric;
diff --git a/components/autofill/core/browser/data_manager/payments/payments_data_manager.cc b/components/autofill/core/browser/data_manager/payments/payments_data_manager.cc
index 6cc6fa88..0d1c5bfe5 100644
--- a/components/autofill/core/browser/data_manager/payments/payments_data_manager.cc
+++ b/components/autofill/core/browser/data_manager/payments/payments_data_manager.cc
@@ -890,7 +890,7 @@
 
   // The sizes are used on Android, but ignored on desktop.
   if (image_fetcher_) {
-    image_fetcher_->FetchImagesForURLs(
+    image_fetcher_->FetchCreditCardArtImagesForURLs(
         base::span_from_ref(card_art_url),
         {AutofillImageFetcherBase::ImageSize::kSmall,
          AutofillImageFetcherBase::ImageSize::kLarge});
@@ -2059,7 +2059,7 @@
     updated_urls.emplace_back(card->card_art_url());
   }
   if (!updated_urls.empty()) {
-    image_fetcher_->FetchImagesForURLs(
+    image_fetcher_->FetchCreditCardArtImagesForURLs(
         updated_urls, {AutofillImageFetcherBase::ImageSize::kSmall,
                        AutofillImageFetcherBase::ImageSize::kLarge});
   }
@@ -2139,7 +2139,7 @@
     updated_urls.emplace_back(display_icon_url);
   }
   if (!updated_urls.empty()) {
-    image_fetcher_->FetchImagesForURLs(
+    image_fetcher_->FetchCreditCardArtImagesForURLs(
         updated_urls,
         base::span_from_ref(AutofillImageFetcherBase::ImageSize::kLarge));
   }
diff --git a/components/autofill/core/browser/data_manager/payments/payments_data_manager_unittest.cc b/components/autofill/core/browser/data_manager/payments/payments_data_manager_unittest.cc
index 970e9b92..a8b4925 100644
--- a/components/autofill/core/browser/data_manager/payments/payments_data_manager_unittest.cc
+++ b/components/autofill/core/browser/data_manager/payments/payments_data_manager_unittest.cc
@@ -262,7 +262,7 @@
  public:
   MOCK_METHOD(
       void,
-      FetchImagesForURLs,
+      FetchCreditCardArtImagesForURLs,
       (base::span<const GURL> card_art_urls,
        base::span<const AutofillImageFetcherBase::ImageSize> image_sizes),
       (override));
@@ -2292,7 +2292,7 @@
   ASSERT_TRUE(
       GetServerDataTable()->SetPaymentInstruments({payment_instrument}));
 
-  EXPECT_CALL(mock_image_fetcher, FetchImagesForURLs);
+  EXPECT_CALL(mock_image_fetcher, FetchCreditCardArtImagesForURLs);
 
   // We need to call `Refresh()` to ensure that the eWallet payment instruments
   // are loaded again from the WebDatabase which triggers the call to fetch
@@ -2671,7 +2671,7 @@
   test_api(payments_data_manager()).SetImageFetcher(&mock_image_fetcher);
   auto wait_for_fetch_images_for_url = [&] {
     base::RunLoop run_loop;
-    EXPECT_CALL(mock_image_fetcher, FetchImagesForURLs)
+    EXPECT_CALL(mock_image_fetcher, FetchCreditCardArtImagesForURLs)
         .WillOnce(base::test::RunClosure(run_loop.QuitClosure()));
     run_loop.Run();
   };
diff --git a/components/autofill/core/browser/form_import/form_data_importer.cc b/components/autofill/core/browser/form_import/form_data_importer.cc
index 9392f0fc..8124b5d 100644
--- a/components/autofill/core/browser/form_import/form_data_importer.cc
+++ b/components/autofill/core/browser/form_import/form_data_importer.cc
@@ -908,6 +908,8 @@
   auto [candidate, form_has_duplicate_cc_type] =
       ExtractCreditCardFromForm(form);
   if (form_has_duplicate_cc_type) {
+    AutofillMetrics::LogSubmittedCardStateMetric(
+        AutofillMetrics::HAS_DUPLICATE_FORM_FIELDS);
     return std::nullopt;
   }
 
@@ -929,6 +931,8 @@
   // the expiration date fix flow. However, cards with invalid card numbers must
   // still be ignored.
   if (!candidate.HasValidCardNumber()) {
+    AutofillMetrics::LogSubmittedCardStateMetric(
+        AutofillMetrics::INVALID_CARD_NUMBER);
     return std::nullopt;
   }
 
diff --git a/components/autofill/core/browser/form_import/form_data_importer_unittest.cc b/components/autofill/core/browser/form_import/form_data_importer_unittest.cc
index 3413d53..cf759fa8 100644
--- a/components/autofill/core/browser/form_import/form_data_importer_unittest.cc
+++ b/components/autofill/core/browser/form_import/form_data_importer_unittest.cc
@@ -1877,7 +1877,7 @@
       ExtractCreditCard(*form_structure);
   EXPECT_TRUE(extracted_credit_card);
   histogram_tester.ExpectUniqueSample(
-      "Autofill.SubmittedCardState",
+      "Autofill.SubmittedCardState2",
       AutofillMetrics::HAS_CARD_NUMBER_AND_EXPIRATION_DATE, 1);
   payments_data_manager().OnAcceptedLocalCreditCardSave(*extracted_credit_card);
 
@@ -1888,6 +1888,33 @@
               UnorderedElementsCompareEqual(expected));
 }
 
+// Tests that a credit card is not extracted when the form has duplicate fields.
+TEST_F(FormDataImporterTest, ExtractCreditCard_DuplicateFields) {
+  FormData form;
+  form.set_url(GURL("https://www.foo.com"));
+  form.set_fields(
+      {CreateTestFormField("Name on card:", "name_on_card", "John MMYY",
+                           FormControlType::kInputText),
+       CreateTestFormField("Card Number:", "card_number", "4111111111111111",
+                           FormControlType::kInputText),
+       CreateTestFormField("Card Number:", "card_number", "4111111111111112",
+                           FormControlType::kInputText),
+       CreateTestFormField("Exp Date:", "exp_date", "05/45",
+                           FormControlType::kInputText, "cc-exp", 5)});
+
+  std::unique_ptr<FormStructure> form_structure =
+      ConstructFormStructureFromFormData(form);
+  base::HistogramTester histogram_tester;
+  std::optional<CreditCard> extracted_credit_card =
+      ExtractCreditCard(*form_structure);
+  EXPECT_FALSE(extracted_credit_card);
+  histogram_tester.ExpectUniqueSample(
+      "Autofill.SubmittedCardState2",
+      AutofillMetrics::HAS_DUPLICATE_FORM_FIELDS, 1);
+
+  ASSERT_EQ(0U, payments_data_manager().GetCreditCards().size());
+}
+
 // Tests that an invalid credit card number is not extracted.
 TEST_F(FormDataImporterTest, ExtractCreditCard_InvalidCardNumber) {
   FormData form = CreateFullCreditCardForm("Jim Johansen", "1000000000000000",
@@ -1899,9 +1926,10 @@
   std::optional<CreditCard> extracted_credit_card =
       ExtractCreditCard(*form_structure);
   EXPECT_FALSE(extracted_credit_card);
-  histogram_tester.ExpectUniqueSample("Autofill.SubmittedCardState",
-                                      AutofillMetrics::HAS_EXPIRATION_DATE_ONLY,
-                                      1);
+  EXPECT_THAT(
+      histogram_tester.GetAllSamples("Autofill.SubmittedCardState2"),
+      BucketsAre(base::Bucket(AutofillMetrics::HAS_EXPIRATION_DATE_ONLY, 1),
+                 base::Bucket(AutofillMetrics::INVALID_CARD_NUMBER, 1)));
 
   ASSERT_EQ(0U, payments_data_manager().GetCreditCards().size());
 }
@@ -1954,7 +1982,7 @@
   std::optional<CreditCard> extracted_credit_card =
       ExtractCreditCard(*form_structure);
   EXPECT_TRUE(extracted_credit_card);
-  histogram_tester.ExpectUniqueSample("Autofill.SubmittedCardState",
+  histogram_tester.ExpectUniqueSample("Autofill.SubmittedCardState2",
                                       AutofillMetrics::HAS_CARD_NUMBER_ONLY, 1);
 }
 
@@ -1971,7 +1999,7 @@
   std::optional<CreditCard> extracted_credit_card =
       ExtractCreditCard(*form_structure);
   EXPECT_TRUE(extracted_credit_card);
-  histogram_tester.ExpectUniqueSample("Autofill.SubmittedCardState",
+  histogram_tester.ExpectUniqueSample("Autofill.SubmittedCardState2",
                                       AutofillMetrics::HAS_CARD_NUMBER_ONLY, 1);
 }
 
@@ -1996,7 +2024,7 @@
       ExtractCreditCard(*form_structure);
   EXPECT_TRUE(extracted_credit_card);
   histogram_tester.ExpectUniqueSample(
-      "Autofill.SubmittedCardState",
+      "Autofill.SubmittedCardState2",
       AutofillMetrics::HAS_CARD_NUMBER_AND_EXPIRATION_DATE, 1);
   payments_data_manager().OnAcceptedLocalCreditCardSave(*extracted_credit_card);
 
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc
index 0964d4c7..d4e4953e 100644
--- a/components/autofill/core/browser/form_structure.cc
+++ b/components/autofill/core/browser/form_structure.cc
@@ -225,10 +225,21 @@
                          GetActiveRegexFeatures(), log_manager);
   FieldCandidatesMap regex_predictions = ParseFieldTypesWithPatterns(context);
   AssignBestFieldTypes(regex_predictions, HeuristicSource::kRegexes);
+  RationalizeAndAssignSections(log_manager);
+  LogDetermineHeuristicTypesMetrics();
+}
 
-  AssignSections(fields_);
-  RationalizeFormStructure(log_manager);
-  RationalizePhoneNumberFieldsForFilling();
+void FormStructure::RationalizeAndAssignSections(LogManager* log_manager,
+                                                 bool legacy_order) {
+  if (!legacy_order) {
+    AssignSections(fields_);
+    RationalizeFormStructure(log_manager);
+    RationalizePhoneNumberFieldsForFilling();
+  } else {
+    RationalizeFormStructure(log_manager);
+    AssignSections(fields_);
+    RationalizePhoneNumberFieldsForFilling();
+  }
 
   // Log the field type predicted by rationalization.
   // The sections are mapped to consecutive natural numbers starting at 1.
@@ -245,8 +256,6 @@
                         field->ComputedType().GetStorableType(),
     });
   }
-
-  LogDetermineHeuristicTypesMetrics();
 }
 
 // static
diff --git a/components/autofill/core/browser/form_structure.h b/components/autofill/core/browser/form_structure.h
index e8207ab..7151388 100644
--- a/components/autofill/core/browser/form_structure.h
+++ b/components/autofill/core/browser/form_structure.h
@@ -71,6 +71,17 @@
       const GeoIpCountryCode& client_country,
       LogManager* log_manager);
 
+  // Runs rationalization and sectioning. This is to be run after the field
+  // types change.
+  //
+  // For historical reasons, the order of rationalization and sectioning is
+  // context-dependent: Usually, sectioning comes first. But for server
+  // predictions (or `legacy_order` is true), parts of the rationalization
+  // happens before sectioning.
+  // TODO(crbug.com/408497919): Make the order consistent.
+  void RationalizeAndAssignSections(LogManager* log_manager,
+                                    bool legacy_order = false);
+
   // Returns predictions using the details from the given |form_structures| and
   // their fields' predicted types.
   static std::vector<FormDataPredictions> GetFieldTypePredictions(
diff --git a/components/autofill/core/browser/form_structure_rationalizer_unittest.cc b/components/autofill/core/browser/form_structure_rationalizer_unittest.cc
index 8257e9f..6b3928d0b 100644
--- a/components/autofill/core/browser/form_structure_rationalizer_unittest.cc
+++ b/components/autofill/core/browser/form_structure_rationalizer_unittest.cc
@@ -132,10 +132,10 @@
                                                    fields[i].heuristic_type);
     }
   }
-  // Calls RationalizeFieldTypePredictions.
   ParseServerPredictionsQueryResponse(
       response_string, {form_structure.get()},
       test::GetEncodedSignatures({form_structure.get()}), nullptr);
+  form_structure->RationalizeAndAssignSections(nullptr, /*legacy_order=*/true);
   return form_structure;
 }
 
diff --git a/components/autofill/core/browser/foundations/autofill_manager.cc b/components/autofill/core/browser/foundations/autofill_manager.cc
index cea103f..967569a 100644
--- a/components/autofill/core/browser/foundations/autofill_manager.cc
+++ b/components/autofill/core/browser/foundations/autofill_manager.cc
@@ -20,6 +20,7 @@
 #include "components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_encoding.h"
 #include "components/autofill/core/browser/data_model/payments/credit_card.h"
 #include "components/autofill/core/browser/form_structure.h"
+#include "components/autofill/core/browser/form_structure_sectioning_util.h"
 #include "components/autofill/core/browser/logging/log_manager.h"
 #include "components/autofill/core/browser/metrics/form_interactions_ukm_logger.h"
 #include "components/autofill/core/browser/metrics/quality_metrics.h"
@@ -835,6 +836,10 @@
 
   OnLoadedServerPredictionsImpl(queried_forms);
 
+  for (const raw_ptr<FormStructure, VectorExperimental> form : queried_forms) {
+    form->RationalizeAndAssignSections(log_manager(), /*legacy_order=*/true);
+  }
+
   // Will log quality metrics for each FormStructure based on the presence of
   // autocomplete attributes, if available.
   for (FormStructure* cur_form : queried_forms) {
diff --git a/components/autofill/core/browser/metrics/autofill_metrics.cc b/components/autofill/core/browser/metrics/autofill_metrics.cc
index 7221596..6de5710 100644
--- a/components/autofill/core/browser/metrics/autofill_metrics.cc
+++ b/components/autofill/core/browser/metrics/autofill_metrics.cc
@@ -148,7 +148,7 @@
 void AutofillMetrics::LogSubmittedCardStateMetric(
     SubmittedCardStateMetric metric) {
   DCHECK_LT(metric, NUM_SUBMITTED_CARD_STATE_METRICS);
-  UMA_HISTOGRAM_ENUMERATION("Autofill.SubmittedCardState", metric,
+  UMA_HISTOGRAM_ENUMERATION("Autofill.SubmittedCardState2", metric,
                             NUM_SUBMITTED_CARD_STATE_METRICS);
 }
 
diff --git a/components/autofill/core/browser/metrics/autofill_metrics.h b/components/autofill/core/browser/metrics/autofill_metrics.h
index e60342a..06450e2 100644
--- a/components/autofill/core/browser/metrics/autofill_metrics.h
+++ b/components/autofill/core/browser/metrics/autofill_metrics.h
@@ -129,6 +129,10 @@
     // Submitted card has a valid expiration date but an invalid or missing card
     // number.
     HAS_EXPIRATION_DATE_ONLY = 2,
+    // Submitted card has invalid credit card number.
+    INVALID_CARD_NUMBER = 3,
+    // Submitted card has duplicate fields.
+    HAS_DUPLICATE_FORM_FIELDS = 4,
     NUM_SUBMITTED_CARD_STATE_METRICS,
   };
 
diff --git a/components/autofill/core/browser/payments/bnpl_manager.cc b/components/autofill/core/browser/payments/bnpl_manager.cc
index 33f66871..082dc13 100644
--- a/components/autofill/core/browser/payments/bnpl_manager.cc
+++ b/components/autofill/core/browser/payments/bnpl_manager.cc
@@ -161,8 +161,6 @@
       /*cancel_callback=*/base::BindOnce(
           [](base::WeakPtr<BnplManager> manager) {
             if (manager) {
-              // TODO(crbug.com/400528473): Log cancel metrics.
-
               // Note: Does not call
               // `PaymentsAutofillClient::CloseAutofillProgressDialog()` as this
               // is expected to be handled by dialog UI code.
diff --git a/components/autofill/core/browser/suggestions/suggestion.h b/components/autofill/core/browser/suggestions/suggestion.h
index 7d25a995..a18c0c4 100644
--- a/components/autofill/core/browser/suggestions/suggestion.h
+++ b/components/autofill/core/browser/suggestions/suggestion.h
@@ -168,12 +168,10 @@
 
   using IsLoading = base::StrongAlias<class IsLoadingTag, bool>;
   using InstrumentId = base::StrongAlias<class InstrumentIdTag, uint64_t>;
-  using ValueToFill = base::StrongAlias<struct ValueToFill, std::u16string>;
   using Payload = std::variant<Guid,
                                InstrumentId,
                                AutofillProfilePayload,
                                GURL,
-                               ValueToFill,
                                PasswordSuggestionDetails,
                                PlusAddressPayload,
                                AutofillAiPayload,
@@ -396,12 +394,10 @@
       case SuggestionType::kSeePromoCodeDetails:
         return std::holds_alternative<GURL>(payload);
       case SuggestionType::kIbanEntry:
-        return std::holds_alternative<ValueToFill>(payload) ||
-               std::holds_alternative<Guid>(payload) ||
+        return std::holds_alternative<Guid>(payload) ||
                std::holds_alternative<InstrumentId>(payload);
       case SuggestionType::kFillAutofillAi:
-        return std::holds_alternative<ValueToFill>(payload) ||
-               std::holds_alternative<AutofillAiPayload>(payload);
+        return std::holds_alternative<AutofillAiPayload>(payload);
       case SuggestionType::kCreditCardEntry:
       case SuggestionType::kVirtualCreditCardEntry:
         // TODO(crbug.com/367434234): Use `PaymentsPayload` for all credit card
diff --git a/components/autofill/core/browser/ui/autofill_image_fetcher.cc b/components/autofill/core/browser/ui/autofill_image_fetcher.cc
index 8e81255..fc09cd7 100644
--- a/components/autofill/core/browser/ui/autofill_image_fetcher.cc
+++ b/components/autofill/core/browser/ui/autofill_image_fetcher.cc
@@ -59,7 +59,7 @@
 
 AutofillImageFetcher::~AutofillImageFetcher() = default;
 
-void AutofillImageFetcher::FetchImagesForURLs(
+void AutofillImageFetcher::FetchCreditCardArtImagesForURLs(
     base::span<const GURL> image_urls,
     base::span<const AutofillImageFetcherBase::ImageSize> image_sizes_unused) {
   if (!GetImageFetcher()) {
diff --git a/components/autofill/core/browser/ui/autofill_image_fetcher.h b/components/autofill/core/browser/ui/autofill_image_fetcher.h
index 64adf8a..2bf983c 100644
--- a/components/autofill/core/browser/ui/autofill_image_fetcher.h
+++ b/components/autofill/core/browser/ui/autofill_image_fetcher.h
@@ -40,9 +40,10 @@
   // The image sizes passed in the arguments are unused as this param is only
   // used for Android. For Desktop, the implementation of this method has
   // hardcoded image sizes.
-  void FetchImagesForURLs(base::span<const GURL> image_urls,
-                          base::span<const AutofillImageFetcherBase::ImageSize>
-                              image_sizes_unused) override;
+  void FetchCreditCardArtImagesForURLs(
+      base::span<const GURL> image_urls,
+      base::span<const AutofillImageFetcherBase::ImageSize> image_sizes_unused)
+      override;
   void FetchPixAccountImages(base::span<const GURL> image_urls) override;
   const gfx::Image* GetCachedImageForUrl(const GURL& image_url) const override;
 
diff --git a/components/autofill/core/browser/ui/autofill_image_fetcher_base.h b/components/autofill/core/browser/ui/autofill_image_fetcher_base.h
index 09896052..a4bffe0 100644
--- a/components/autofill/core/browser/ui/autofill_image_fetcher_base.h
+++ b/components/autofill/core/browser/ui/autofill_image_fetcher_base.h
@@ -53,8 +53,9 @@
   // on the urls. `image_urls` is a span of urls that needs to be downloaded. If
   // an image has already been fetched, it won't be fetched again. `image_sizes`
   // is the different sizes in which each image_url should be downloaded.
-  virtual void FetchImagesForURLs(base::span<const GURL> image_urls,
-                                  base::span<const ImageSize> image_sizes) = 0;
+  virtual void FetchCreditCardArtImagesForURLs(
+      base::span<const GURL> image_urls,
+      base::span<const ImageSize> image_sizes) = 0;
 
   // Fetches images for the `image_urls`, treats them according to Pix image
   // specifications, and caches them in memory.
diff --git a/components/autofill/core/browser/ui/autofill_image_fetcher_unittest.cc b/components/autofill/core/browser/ui/autofill_image_fetcher_unittest.cc
index d98f675..c989c14 100644
--- a/components/autofill/core/browser/ui/autofill_image_fetcher_unittest.cc
+++ b/components/autofill/core/browser/ui/autofill_image_fetcher_unittest.cc
@@ -44,7 +44,7 @@
     card_art_image_override_ = card_art_image_override;
   }
 
-  void SimulateOnImageFetched(
+  void SimulateOnCardArtImageFetched(
       const GURL& url,
       const std::optional<base::TimeTicks>& fetch_image_request_timestamp,
       const gfx::Image& image) {
@@ -124,15 +124,17 @@
       FetchImageAndData_(GURL(fake_url1.spec() + "=w32-h20-n"), _, _, _));
   EXPECT_CALL(*mock_image_fetcher(), FetchImageAndData_(fake_url2, _, _, _));
   std::vector<GURL> urls = {fake_url1, fake_url2};
-  autofill_image_fetcher()->FetchImagesForURLs(
+  autofill_image_fetcher()->FetchCreditCardArtImagesForURLs(
       urls, base::span_from_ref(AutofillImageFetcherBase::ImageSize::kSmall));
 
   // Advance the time to make the latency values more realistic.
   task_environment().FastForwardBy(base::Milliseconds(200));
   // Simulate successful image fetching (for image with URL) -> expect the
   // callback to be called.
-  autofill_image_fetcher()->SimulateOnImageFetched(fake_url1, now, fake_image1);
-  autofill_image_fetcher()->SimulateOnImageFetched(fake_url2, now, fake_image2);
+  autofill_image_fetcher()->SimulateOnCardArtImageFetched(fake_url1, now,
+                                                          fake_image1);
+  autofill_image_fetcher()->SimulateOnCardArtImageFetched(fake_url2, now,
+                                                          fake_image2);
 
   EXPECT_TRUE(gfx::test::AreImagesEqual(
       fake_image1, *autofill_image_fetcher()->GetCachedImageForUrl(fake_url1)));
@@ -158,7 +160,7 @@
       .Times(0);
   EXPECT_CALL(*mock_image_fetcher(), FetchImageAndData_(override_url, _, _, _));
   std::vector<GURL> urls = {fake_url1};
-  autofill_image_fetcher()->FetchImagesForURLs(
+  autofill_image_fetcher()->FetchCreditCardArtImagesForURLs(
       urls, base::span_from_ref(AutofillImageFetcherBase::ImageSize::kSmall));
 }
 
@@ -171,7 +173,7 @@
   GURL fake_url1 = GURL("https://www.example.com/fake_image1");
   gfx::Image fake_image1 = gfx::test::CreateImage(1, 2);
 
-  autofill_image_fetcher()->SimulateOnImageFetched(
+  autofill_image_fetcher()->SimulateOnCardArtImageFetched(
       fake_url1, base::TimeTicks::Now(), fake_image1);
 
   // The received image should be `override_image`, because ResolveCardArtImage
@@ -190,13 +192,13 @@
   // Expect to be called once.
   EXPECT_CALL(*mock_image_fetcher(), FetchImageAndData_(_, _, _, _));
   std::vector<GURL> urls = {fake_url1};
-  autofill_image_fetcher()->FetchImagesForURLs(
+  autofill_image_fetcher()->FetchCreditCardArtImagesForURLs(
       urls, base::span_from_ref(AutofillImageFetcherBase::ImageSize::kSmall));
 
   task_environment().FastForwardBy(base::Milliseconds(200));
   // Simulate successful image fetching (for image with URL).
-  autofill_image_fetcher()->SimulateOnImageFetched(fake_url1, now,
-                                                   gfx::Image());
+  autofill_image_fetcher()->SimulateOnCardArtImageFetched(fake_url1, now,
+                                                          gfx::Image());
 
   // Empty images are not cached, so the result should be a `nullptr`.
   EXPECT_FALSE(autofill_image_fetcher()->GetCachedImageForUrl(fake_url1));
@@ -219,22 +221,22 @@
   std::vector<GURL> urls = {fake_url1};
 
   // Attempt 1 - Failure.
-  autofill_image_fetcher()->FetchImagesForURLs(
+  autofill_image_fetcher()->FetchCreditCardArtImagesForURLs(
       urls, base::span_from_ref(AutofillImageFetcherBase::ImageSize::kSmall));
   task_environment().FastForwardBy(base::Milliseconds(200));
   // Simulate successful image fetching (for image with URL).
-  autofill_image_fetcher()->SimulateOnImageFetched(fake_url1, now,
-                                                   gfx::Image());
+  autofill_image_fetcher()->SimulateOnCardArtImageFetched(fake_url1, now,
+                                                          gfx::Image());
   // Empty images are not cached, so the result should be a `nullptr`.
   EXPECT_FALSE(autofill_image_fetcher()->GetCachedImageForUrl(fake_url1));
 
   // Attempt 2 - Failure.
-  autofill_image_fetcher()->FetchImagesForURLs(
+  autofill_image_fetcher()->FetchCreditCardArtImagesForURLs(
       urls, base::span_from_ref(AutofillImageFetcherBase::ImageSize::kSmall));
   task_environment().FastForwardBy(base::Milliseconds(100));
   // Simulate successful image fetching (for image with URL).
-  autofill_image_fetcher()->SimulateOnImageFetched(fake_url1, now,
-                                                   gfx::Image());
+  autofill_image_fetcher()->SimulateOnCardArtImageFetched(fake_url1, now,
+                                                          gfx::Image());
 
   // Empty images are not cached, so the result should be a `nullptr`.
   EXPECT_FALSE(autofill_image_fetcher()->GetCachedImageForUrl(fake_url1));
@@ -261,24 +263,25 @@
   std::vector<GURL> urls = {fake_url1};
 
   // Attempt 1 - Failure.
-  autofill_image_fetcher()->FetchImagesForURLs(
+  autofill_image_fetcher()->FetchCreditCardArtImagesForURLs(
       urls, base::span_from_ref(AutofillImageFetcherBase::ImageSize::kSmall));
   task_environment().FastForwardBy(base::Milliseconds(200));
   // Simulate failed image fetching (for image with URL) -> expect the
   // callback to be called.
-  autofill_image_fetcher()->SimulateOnImageFetched(fake_url1, now,
-                                                   gfx::Image());
+  autofill_image_fetcher()->SimulateOnCardArtImageFetched(fake_url1, now,
+                                                          gfx::Image());
 
   // Empty images are not cached, so the result should be a `nullptr`.
   EXPECT_FALSE(autofill_image_fetcher()->GetCachedImageForUrl(fake_url1));
 
   // Attempt 2 - Success.
-  autofill_image_fetcher()->FetchImagesForURLs(
+  autofill_image_fetcher()->FetchCreditCardArtImagesForURLs(
       urls, base::span_from_ref(AutofillImageFetcherBase::ImageSize::kSmall));
   task_environment().FastForwardBy(base::Milliseconds(100));
   // Simulate successful image fetching (for image with URL) -> expect the
   // callback to be called.
-  autofill_image_fetcher()->SimulateOnImageFetched(fake_url1, now, fake_image1);
+  autofill_image_fetcher()->SimulateOnCardArtImageFetched(fake_url1, now,
+                                                          fake_image1);
 
   EXPECT_TRUE(gfx::test::AreImagesEqual(
       fake_image1, *autofill_image_fetcher()->GetCachedImageForUrl(fake_url1)));
@@ -302,24 +305,26 @@
   std::vector<GURL> urls = {fake_url1};
 
   // Attempt 1 - Success.
-  autofill_image_fetcher()->FetchImagesForURLs(
+  autofill_image_fetcher()->FetchCreditCardArtImagesForURLs(
       urls, base::span_from_ref(AutofillImageFetcherBase::ImageSize::kSmall));
   task_environment().FastForwardBy(base::Milliseconds(200));
   // Simulate successful image fetching (for image with URL) -> expect the
   // callback to be called.
-  autofill_image_fetcher()->SimulateOnImageFetched(fake_url1, now, fake_image1);
+  autofill_image_fetcher()->SimulateOnCardArtImageFetched(fake_url1, now,
+                                                          fake_image1);
 
   EXPECT_TRUE(gfx::test::AreImagesEqual(
       fake_image1, *autofill_image_fetcher()->GetCachedImageForUrl(fake_url1)));
 
   // Attempt 2 - The image has been cached already, it shouldn't be fetched
   // again.
-  autofill_image_fetcher()->FetchImagesForURLs(
+  autofill_image_fetcher()->FetchCreditCardArtImagesForURLs(
       urls, base::span_from_ref(AutofillImageFetcherBase::ImageSize::kSmall));
   task_environment().FastForwardBy(base::Milliseconds(100));
   // Simulate successful image fetching (for image with URL) -> expect the
   // callback to be called.
-  autofill_image_fetcher()->SimulateOnImageFetched(fake_url1, now, fake_image1);
+  autofill_image_fetcher()->SimulateOnCardArtImageFetched(fake_url1, now,
+                                                          fake_image1);
 
   EXPECT_TRUE(gfx::test::AreImagesEqual(
       fake_image1, *autofill_image_fetcher()->GetCachedImageForUrl(fake_url1)));
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc
index e3075e0..3d70e95 100644
--- a/components/autofill/core/common/autofill_payments_features.cc
+++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -49,7 +49,7 @@
 // When enabled, buy now pay later (BNPL) data will be synced to Chrome clients.
 BASE_FEATURE(kAutofillEnableBuyNowPayLaterSyncing,
              "AutofillEnableBuyNowPayLaterSyncing",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // When enabled, card benefits offered by American Express will be shown in
 // Payments Autofill UI.
diff --git a/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/TabModalPresenter.java b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/TabModalPresenter.java
index 92ddbcf..7a4fcd0 100644
--- a/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/TabModalPresenter.java
+++ b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/TabModalPresenter.java
@@ -214,8 +214,7 @@
      *         is hiding and text selection should be restored.
      */
     protected void saveOrRestoreTextSelection(WebContents webContents, boolean save) {
-        SelectionPopupController controller =
-                assumeNonNull(SelectionPopupController.fromWebContents(webContents));
+        SelectionPopupController controller = SelectionPopupController.fromWebContents(webContents);
         if (save) {
             // Dismiss the action bar that obscures the dialogs but preserve the text selection.
             controller.setPreserveSelectionOnNextLossOfFocus(true);
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 9b5dbfd..4b801fce 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
@@ -257,6 +257,7 @@
 <translation id="4194328954146351878">Web lokacije moraju tražiti odobrenje za pregled i izmjenu informacija na NFC uređajima (preporučeno)</translation>
 <translation id="4200726100658658164">Otvaranje postavki lokacije</translation>
 <translation id="421742575134139848">Web lokacije mogu reproducirati zvuk radi pružanja zvuka za muziku, videozapise i druge medije</translation>
+<translation id="4217710972110098902">Povezano sa serijskim priključkom</translation>
 <translation id="4226663524361240545">Obavještenja mogu aktivirati vibraciju uređaja</translation>
 <translation id="4259722352634471385">Navigacija je blokirana: <ph name="URL" /></translation>
 <translation id="4274673989874969668">Nakon što napustite web lokaciju, sinhronizacija se može nastaviti da se završe zadaci, kao što je otpremanje fotografija ili slanje poruke chata</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 e1634d8..cf5dccb 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
@@ -257,6 +257,7 @@
 <translation id="4194328954146351878">Teilt küsitakse luba, kui saidid üritavad NFC-seadmetes teavet vaadata ja muuta (soovitatav)</translation>
 <translation id="4200726100658658164">Ava asukohaseaded</translation>
 <translation id="421742575134139848">Saidid võivad heli esitada näiteks muusika, videote ja muu meedia puhul</translation>
+<translation id="4217710972110098902">Jadapordiga ühendatud</translation>
 <translation id="4226663524361240545">Seade võib märguannete korral vibreerida</translation>
 <translation id="4259722352634471385">Navigeerimine on blokeeritud: <ph name="URL" /></translation>
 <translation id="4274673989874969668">Kui lahkute saidilt, võib see sünkroonimist jätkata, et toimingud (nt fotode üleslaadimine või vestlussõnumi saatmine) lõpule viia</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 999fb91..203c2a5c 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
@@ -257,6 +257,7 @@
 <translation id="4194328954146351878">Pitaj prije omogućavanja web-lokacijama da vide i mijenjaju podatke na NFC uređajima (preporučeno)</translation>
 <translation id="4200726100658658164">Otvori postavke lokacije</translation>
 <translation id="421742575134139848">Web-lokacije mogu reproducirati zvuk koji služi kao audiozapis za glazbu, videozapise i druge medijske sadržaje</translation>
+<translation id="4217710972110098902">Povezano sa serijskim priključkom</translation>
 <translation id="4226663524361240545">Obavijesti mogu uključiti vibriranje uređaja</translation>
 <translation id="4259722352634471385">Otvaranje je blokirano: <ph name="URL" /></translation>
 <translation id="4274673989874969668">Nakon što je napustite, web-lokacija može nastaviti sa sinkronizacijom kao što je prijenos fotografija ili slanje poruke chata</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 4af0d82..b9a8fd0 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
@@ -257,6 +257,7 @@
 <translation id="4194328954146351878">შეკითხვა საიტებისთვის NFC მოწყობილობებზე ინფორმაციაზე წვდომისა და მისი შეცვლის დაშვებამდე (რეკომენდებული)</translation>
 <translation id="4200726100658658164">მდებარეობის პარამეტრების გახსნა</translation>
 <translation id="421742575134139848">საიტებს ხმის დაკვრა შეუძლია მუსიკის, ვიდეოებისა და სხვა მედიაფაილების გასახმოვანებლად</translation>
+<translation id="4217710972110098902">დაკავშირებულია სერიულ პორტთან</translation>
 <translation id="4226663524361240545">შეტყობინებებმა შეიძლება მოწყობილობის ვიბრაცია გამოიწვიოს</translation>
 <translation id="4259722352634471385">ნავიგაცია დაბლოკილია: <ph name="URL" /></translation>
 <translation id="4274673989874969668">საიტებიდან გასვლის შემდეგ ზოგიერთი მათგანი მაინც აგრძელებს სინქრონიზაციას ისეთი ამოცანების დასასრულებლად, როგორიცაა ფოტოების ატვირთვა თუ ჩეთში შეტყობინების გაგზავნა</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 28db757c..3c9894a05 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
@@ -400,7 +400,7 @@
 <translation id="6071501408666570960">Сіз бұл сайтта аккаунттан шығарылуыңыз мүмкін.</translation>
 <translation id="6085954183010297841">Файл өзгерту рұқсатын жою қажет пе? <ph name="FILE" /></translation>
 <translation id="6120483543004435978">Қосылса, сайттар құрылғыны белсенді пайдаланатын уақытыңызды білуге рұқсат сұрай алады. Өшірілсе, біле алмайды.</translation>
-<translation id="6165508094623778733">Толығырақ</translation>
+<translation id="6165508094623778733">Толық ақпарат</translation>
 <translation id="6171020522141473435">Қосылса, сайттар Bluetooth құрылғыларын пайдалануға рұқсат сұрай алады. Өшірілсе, пайдалана алмайды.</translation>
 <translation id="6177128806592000436">Бұл сайтпен байланысыңыз қауіпсіз емес</translation>
 <translation id="6181444274883918285">Сайтты ерекшеліктер тізіміне қосу</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 0442053f..d6b8b1f 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
@@ -257,6 +257,7 @@
 <translation id="4194328954146351878">NFC ಸಾಧನಗಳಲ್ಲಿ ಮಾಹಿತಿಯನ್ನು ನೋಡಲು ಮತ್ತು ಬದಲಾಯಿಸಲು ಸೈಟ್‌ಗಳಿಗೆ ಅನುಮತಿಸುವ ಮೊದಲು ಕೇಳಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation>
 <translation id="4200726100658658164">ಸ್ಥಳ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="421742575134139848">ಸಂಗೀತ, ವೀಡಿಯೊಗಳು ಮತ್ತು ಇತರ ಮೀಡಿಯಾಗಳಿಗಾಗಿ ಆಡಿಯೋ ಒದಗಿಸಲು ಸೈಟ್‌ಗಳು ಧ್ವನಿಯನ್ನು ಪ್ಲೇ ಮಾಡಬಹುದು</translation>
+<translation id="4217710972110098902">ಸೀರಿಯಲ್ ಪೋರ್ಟ್‌ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="4226663524361240545">ಪ್ರಕಟಣೆಗಳು ಸಾಧನವನ್ನು ವೈಬ್ರೇಟ್ ಮಾಡಬಹುದು</translation>
 <translation id="4259722352634471385">ನ್ಯಾವಿಗೇಶನ್‌ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ: <ph name="URL" /></translation>
 <translation id="4274673989874969668">ನೀವು ಸೈಟ್‌ನಿಂದ ನಿರ್ಗಮಿಸಿದ ನಂತರ, ಫೋಟೋಗಳನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡುವುದು ಅಥವಾ ಚಾಟ್ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸುವಂತಹ ಕಾರ್ಯಗಳನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ಇದು ಸಿಂಕ್ ಮಾಡುತ್ತಲೇ ಇರುತ್ತದೆ</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 c1f05bc..abcb8b7 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
@@ -257,6 +257,7 @@
 <translation id="4194328954146351878">NFC စက်ပစ္စည်းများရှိ အချက်အလက်များကို ဝဘ်ဆိုက်များအား ကြည့်ခွင့်နှင့် ပြောင်းလဲခွင့်မပေးမီ ဦးစွာမေးမြန်းပါ (အကြံပြုထားသည်)</translation>
 <translation id="4200726100658658164">'တည်နေရာပြဆက်တင်များ' ကို ဖွင့်ပါ</translation>
 <translation id="421742575134139848">သီချင်း၊ ဗီဒီယိုနှင့် အခြားမီဒီယာအတွက် အသံပံ့ပိုးရန် ဝဘ်ဆိုက်များက အသံဖွင့်ပေးနိုင်သည်</translation>
+<translation id="4217710972110098902">အမှတ်စဉ်ပို့တ်နှင့် ချိတ်ဆက်ထားသည်</translation>
 <translation id="4226663524361240545">အကြောင်းကြားချက်သည် စက်ပစ္စည်းကို တုန်ခါစေပါမည်</translation>
 <translation id="4259722352634471385">သွားလာမှုပြလမ်းညွှန်အား ပိတ်ထား၏- <ph name="URL" /></translation>
 <translation id="4274673989874969668">သင်ထွက်သွားသောအခါ ဓာတ်ပုံအပ်လုဒ်လုပ်ခြင်း (သို့) ချတ်မက်ဆေ့ဂျ်ပို့ခြင်းကဲ့သို့ လုပ်ဆောင်စရာများအပြီးသတ်ရန် ဝဘ်ဆိုက်များက ဆက်လက်၍စင့်ခ်လုပ်နိုင်သည်</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 185f9c0..536d659 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
@@ -257,6 +257,7 @@
 <translation id="4194328954146351878">ਸਾਈਟਾਂ ਨੂੰ NFC ਡੀਵਾਈਸਾਂ 'ਤੇ ਜਾਣਕਾਰੀ ਦੇਖਣ ਅਤੇ ਬਦਲਣ ਦੀ ਆਗਿਆ ਦੇਣ ਤੋਂ ਪਹਿਲਾਂ ਪੁੱਛੋ (ਸਿਫ਼ਾਰਸ਼ੀ)</translation>
 <translation id="4200726100658658164">ਟਿਕਾਣਾ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ</translation>
 <translation id="421742575134139848">ਸੰਗੀਤ, ਵੀਡੀਓ ਅਤੇ ਹੋਰ ਮੀਡੀਆ ਸਮੱਗਰੀ ਲਈ ਆਡੀਓ ਮੁਹੱਈਆ ਕਰਨ ਲਈ, ਸਾਈਟਾਂ ਧੁਨੀ ਵਜਾ ਸਕਦੀਆਂ ਹਨ</translation>
+<translation id="4217710972110098902">ਸੀਰੀਅਲ ਪੋਰਟ ਨਾਲ ਕਨੈਕਟ ਹੈ</translation>
 <translation id="4226663524361240545">ਸੂਚਨਾਵਾਂ ਡੀਵਾਈਸ ਨੂੰ ਥਰਥਰਾਹਟ ਕਰ ਸਕਦੀਆਂ ਹਨ</translation>
 <translation id="4259722352634471385">ਨੈਵੀਗੇਸ਼ਨ ਬਲੌਕ ਕੀਤੀ ਹੈ: <ph name="URL" /></translation>
 <translation id="4274673989874969668">ਤੁਹਾਡੇ ਵੱਲੋਂ ਸਾਈਟ ਛੱਡਣ ਤੋਂ ਬਾਅਦ ਵੀ, ਇਹ ਫ਼ੋਟੋਆਂ ਅੱਪਲੋਡ ਕਰਨ ਜਾਂ ਚੈਟ ਸੁਨੇਹੇ ਭੇਜਣ ਵਰਗੇ ਕਾਰਜ ਪੂਰੇ ਕਰਨ ਲਈ ਸਿੰਕ ਕਰਨਾ ਜਾਰੀ ਰੱਖ ਸਕਦੀ ਹੈ</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 6155f64..ef0bee0 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
@@ -257,6 +257,7 @@
 <translation id="4194328954146351878">Pre nego što dozvolite sajtovima da vide i menjaju informacije na NFC uređajima prikazuje se upit (preporučeno)</translation>
 <translation id="4200726100658658164">Otvorite podešavanja lokacije</translation>
 <translation id="421742575134139848">Sajtovi mogu da puštaju zvuk da biste čuli muziku, video snimke i druge medije</translation>
+<translation id="4217710972110098902">Povezano sa serijskim portom</translation>
 <translation id="4226663524361240545">Uređaj će vibrirati kada primate obaveštenja</translation>
 <translation id="4259722352634471385">Navigacija je blokirana: <ph name="URL" /></translation>
 <translation id="4274673989874969668">Kada napustite sajt, on obično nastavlja sinhronizaciju da bi završio zadatke poput otpremanja slika ili slanja poruke ćaskanja</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 1bdc184d..ef0eac3e 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
@@ -257,6 +257,7 @@
 <translation id="4194328954146351878">Пре него што дозволите сајтовима да виде и мењају информације на NFC уређајима приказује се упит (препоручено)</translation>
 <translation id="4200726100658658164">Отворите подешавања локације</translation>
 <translation id="421742575134139848">Сајтови могу да пуштају звук да бисте чули музику, видео снимке и друге медије</translation>
+<translation id="4217710972110098902">Повезано са серијским портом</translation>
 <translation id="4226663524361240545">Уређај ће вибрирати када примате обавештења</translation>
 <translation id="4259722352634471385">Навигација је блокирана: <ph name="URL" /></translation>
 <translation id="4274673989874969668">Када напустите сајт, он обично наставља синхронизацију да би завршио задатке попут отпремања слика или слања поруке ћаскања</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 30df05c2..eae7769f 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
@@ -257,6 +257,7 @@
 <translation id="4194328954146351878">NFC పరికరాలలో సమాచారాన్ని చూడటానికి, మార్చడానికి సైట్‌లను అనుమతించే ముందు అడగాలి (సిఫార్సు చేయడమైనది)</translation>
 <translation id="4200726100658658164">లొకేషన్ సెట్టింగ్‌లను తెరవండి</translation>
 <translation id="421742575134139848">మ్యూజిక్, వీడియో, ఇతర మీడియాకు ఆడియోను అందించడానికి సైట్‌లు సౌండ్‌ను ప్లే చేయవచ్చు</translation>
+<translation id="4217710972110098902">సీరియల్ పోర్ట్‌కు కనెక్ట్ అయింది</translation>
 <translation id="4226663524361240545">నోటిఫికేషన్‌లు పరికరాన్ని వైబ్రేట్ చేయవచ్చు</translation>
 <translation id="4259722352634471385">నావిగేషన్ బ్లాక్ చేయబడింది: <ph name="URL" /></translation>
 <translation id="4274673989874969668">మీరు సైట్‌ను వదిలి వెళ్లిన తర్వాత, ఫోటోలు అప్‌లోడ్ చేయడం లేదా చాట్ మెసేజ్‌ను పంపడం వంటి టాస్క్‌లను ముగించడానికి అది సింక్ చేస్తూనే ఉంటుంది</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 9f50acae..9c30a90 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
@@ -257,6 +257,7 @@
 <translation id="4194328954146351878">Saytlar NFC qurilmalarni koʻrishi va ulardagi axborotni oʻzgartirishidan oldin ruxsat olsin (tavsiya etiladi)</translation>
 <translation id="4200726100658658164">Joylashuv sozlamalarini ochish</translation>
 <translation id="421742575134139848">Saytlar musiqa, video va boshqa media kontent audiosini chiqarish uchun tovushlarni ijro qilishi mumkin</translation>
+<translation id="4217710972110098902">Seriyali portga ulandi</translation>
 <translation id="4226663524361240545">Bildirishnoma kelganida qurilma tebranishi mumkin</translation>
 <translation id="4259722352634471385">Sahifa bloklandi: <ph name="URL" /></translation>
 <translation id="4274673989874969668">Odatda saytlar yopilganda ular rasmni yuklash yoki chat xabarini yuborish kabi amallarni yakunlash uchun sinxronlashda davom etadi</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 a9a45207..a46154a0d 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
@@ -257,6 +257,7 @@
 <translation id="4194328954146351878">需先询问,得到许可后才允许网站查看和更改 NFC 设备上的信息(推荐)</translation>
 <translation id="4200726100658658164">打开位置信息设置</translation>
 <translation id="421742575134139848">网站可能会播放声音来为音乐、视频和其他媒体提供音频</translation>
+<translation id="4217710972110098902">已连接到串行端口</translation>
 <translation id="4226663524361240545">收到通知时设备会振动</translation>
 <translation id="4259722352634471385">已屏蔽 <ph name="URL" /></translation>
 <translation id="4274673989874969668">当您离开网站后,网站可保持同步以完成各项任务(例如上传照片或发送聊天消息)</translation>
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RoundedCornerImageView.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RoundedCornerImageView.java
index fa3cc55..3a5c832c 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RoundedCornerImageView.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RoundedCornerImageView.java
@@ -137,7 +137,7 @@
     }
 
     @Override
-    public void setImageBitmap(Bitmap bm) {
+    public void setImageBitmap(@Nullable Bitmap bm) {
         super.setImageBitmap(bm);
         refreshState();
     }
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index 7c702cd..be0c5f1 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "53.4",
-  "log_list_timestamp": "2025-04-06T12:54:30Z",
+  "version": "53.5",
+  "log_list_timestamp": "2025-04-07T12:58:14Z",
   "operators": [
     {
       "name": "Google",
diff --git a/components/component_updater/component_updater_service.cc b/components/component_updater/component_updater_service.cc
index 210010b..43c19fc 100644
--- a/components/component_updater/component_updater_service.cc
+++ b/components/component_updater/component_updater_service.cc
@@ -19,6 +19,7 @@
 #include "base/functional/callback.h"
 #include "base/functional/callback_helpers.h"
 #include "base/logging.h"
+#include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/notreached.h"
 #include "base/sequence_checker.h"
@@ -172,7 +173,7 @@
       config_->InitialDelay(), config_->NextCheckDelay(),
       base::BindRepeating(
           base::IgnoreResult(&CrxUpdateService::CheckForUpdates),
-          base::Unretained(this)),
+          weak_ptr_factory_.GetWeakPtr()),
       base::DoNothing());
 }
 
@@ -386,9 +387,9 @@
                             UPDATE_TYPE_COUNT);
 
   auto crx_data_callback = base::BindOnce(&CrxUpdateService::GetCrxComponents,
-                                          base::Unretained(this));
+                                          weak_ptr_factory_.GetWeakPtr());
   auto update_complete_callback = base::BindOnce(
-      &CrxUpdateService::OnUpdateComplete, base::Unretained(this),
+      &CrxUpdateService::OnUpdateComplete, weak_ptr_factory_.GetWeakPtr(),
       std::move(callback), base::TimeTicks::Now());
   switch (priority) {
     case Priority::FOREGROUND:
@@ -418,10 +419,10 @@
   update_client_->Update(
       components_order_,
       base::BindOnce(&CrxUpdateService::GetCrxComponents,
-                     base::Unretained(this)),
+                     weak_ptr_factory_.GetWeakPtr()),
       {}, false,
       base::BindOnce(&CrxUpdateService::OnUpdateComplete,
-                     base::Unretained(this),
+                     weak_ptr_factory_.GetWeakPtr(),
                      base::BindOnce(
                          [](UpdateScheduler::OnFinishedCallback on_finished,
                             update_client::Error /*error*/) {
diff --git a/components/component_updater/component_updater_service_internal.h b/components/component_updater/component_updater_service_internal.h
index 839161f..3c21f6b 100644
--- a/components/component_updater/component_updater_service_internal.h
+++ b/components/component_updater/component_updater_service_internal.h
@@ -13,6 +13,7 @@
 
 #include "base/containers/flat_map.h"
 #include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
 #include "components/component_updater/update_scheduler.h"
 #include "components/update_client/persisted_data.h"
@@ -134,6 +135,8 @@
   // for that media type. Only the most recently-registered component is
   // tracked. May include the IDs of un-registered components.
   std::map<std::string, std::string> component_ids_by_mime_type_;
+
+  base::WeakPtrFactory<CrxUpdateService> weak_ptr_factory_{this};
 };
 
 }  // namespace component_updater
diff --git a/components/content_settings/browser/ui/cookie_controls_controller.cc b/components/content_settings/browser/ui/cookie_controls_controller.cc
index ec26d3c..94507e09 100644
--- a/components/content_settings/browser/ui/cookie_controls_controller.cc
+++ b/components/content_settings/browser/ui/cookie_controls_controller.cc
@@ -164,16 +164,21 @@
     tab_observer_ = std::make_unique<TabObserver>(this, web_contents);
     SetUserChangedCookieBlockingForSite(false);
   }
+  if (observers_.empty()) {
+    return;
+  }
   auto status = GetStatus(web_contents);
+  const bool icon_visible = ShouldUserBypassIconBeVisible(
+      status.features, status.protections_on, status.controls_visible);
+  const bool should_highlight =
+      ShouldHighlightUserBypass(status.protections_on);
   for (auto& observer : observers_) {
     observer.OnStatusChanged(status.controls_visible, status.protections_on,
                              status.enforcement, status.blocking_status,
                              status.expiration, status.features);
     observer.OnCookieControlsIconStatusChanged(
-        ShouldUserBypassIconBeVisible(status.features, status.protections_on,
-                                      status.controls_visible),
-        status.protections_on, status.blocking_status,
-        ShouldHighlightUserBypass(status.protections_on));
+        icon_visible, status.protections_on, status.blocking_status,
+        should_highlight);
   }
 }
 
@@ -491,13 +496,18 @@
 }
 
 void CookieControlsController::UpdateUserBypass() {
+  if (observers_.empty()) {
+    return;
+  }
   auto status = GetStatus(GetWebContents());
+  const bool icon_visible = ShouldUserBypassIconBeVisible(
+      status.features, status.protections_on, status.controls_visible);
+  const bool should_highlight =
+      ShouldHighlightUserBypass(status.protections_on);
   for (auto& observer : observers_) {
     observer.OnCookieControlsIconStatusChanged(
-        ShouldUserBypassIconBeVisible(status.features, status.protections_on,
-                                      status.controls_visible),
-        status.protections_on, status.blocking_status,
-        ShouldHighlightUserBypass(status.protections_on));
+        icon_visible, status.protections_on, status.blocking_status,
+        should_highlight);
   }
 }
 
@@ -675,6 +685,9 @@
     std::vector<TrackingProtectionFeature> features,
     bool protections_on,
     bool controls_visible) {
+  if (!controls_visible) {
+    return false;
+  }
   if (ShowActFeatures()) {
     bool has_controllable_feature = false;
     std::vector<TrackingProtectionFeature>::iterator it;
@@ -687,26 +700,24 @@
       return false;
     }
   }
-
-  // If no 3P sites have attempted to access site data, nor were any stateful
-  // bounces recorded, the icon should not be displayed. Take into account both
-  // allow and blocked counts, since the breakage might be related to storage
-  // partitioning. Partitioned site will be allowed to access partitioned
-  // storage.
-  bool site_data_access_attempted =
-      GetAllowedThirdPartyCookiesSitesCount() +
-          GetBlockedThirdPartyCookiesSitesCount() + GetStatefulBounceCount() !=
-      0;
-
   // 3PCD prevents SameSite=None cookies from being sent when the top-level
   // document is sandboxed without `allow-origin`. For instance when loaded
   // with: `Content-Security-Policy: sandbox`. In that case, we render the UI to
   // allow the user to opt into sending SameSite=None cookies again in those
   // contexts.
-  return controls_visible &&
-         (HasOriginSandboxedTopLevelDocument() || !protections_on ||
-          site_data_access_attempted || GetIsSubresourceBlocked() ||
-          GetIsSubresourceProxied());
+  return HasOriginSandboxedTopLevelDocument() || !protections_on ||
+         // If no 3P sites have attempted to access site data, nor were any
+         // stateful bounces recorded, the icon should not be displayed. Take
+         // into account both allow and blocked counts, since the breakage might
+         // be related to storage partitioning. Partitioned site will be allowed
+         // to access partitioned storage.
+         SiteDataAccessAttempted() || GetIsSubresourceBlocked() ||
+         GetIsSubresourceProxied();
+}
+
+bool CookieControlsController::SiteDataAccessAttempted() {
+  return GetStatefulBounceCount() || GetAllowedThirdPartyCookiesSitesCount() ||
+         GetBlockedThirdPartyCookiesSitesCount();
 }
 
 CookieControlsController::TabObserver::TabObserver(
diff --git a/components/content_settings/browser/ui/cookie_controls_controller.h b/components/content_settings/browser/ui/cookie_controls_controller.h
index 281f980d..4d599dae 100644
--- a/components/content_settings/browser/ui/cookie_controls_controller.h
+++ b/components/content_settings/browser/ui/cookie_controls_controller.h
@@ -230,6 +230,7 @@
       std::vector<TrackingProtectionFeature> features,
       bool protections_on,
       bool controls_visible);
+  bool SiteDataAccessAttempted();
   content::WebContents* GetWebContents() const;
 
   std::unique_ptr<TabObserver> tab_observer_;
diff --git a/components/cronet/gn2bp/copy.bara.sky b/components/cronet/gn2bp/copy.bara.sky
index 392e732..1b9cd66e 100644
--- a/components/cronet/gn2bp/copy.bara.sky
+++ b/components/cronet/gn2bp/copy.bara.sky
@@ -239,9 +239,6 @@
       destination_files = destination_files,
       mode = mode,
       transformations = [
-        metadata.squash_notes(
-          prefix= "Import Cronet from Chromium to AOSP."
-            + "\n\nGenerated by Copybara" + "\n\n"+ "Included changes:\n\n",),
         core.rename("Android.bp.gn2bp", "Android.bp"),
         core.rename("Android.extras.bp.gn2bp", "Android.extras.bp"),
         additional_transform,
@@ -269,12 +266,11 @@
 per_channel_workflow(
   name = "import_cronet_to_aosp_gerrit",
   destination = git.gerrit_destination(
-      url = "https://android-review.googlesource.com/platform/external/cronet",
+      url = "https://googleplex-android.googlesource.com/platform/external/cronet",
       fetch = "main",
       push_to_refs_for = "main",
       # TODO(crbug.com/372534509): Replace reviewer with team-based Gerrit
       # account once it is set up.
-      reviewers = ["aymanm@google.com"],
       labels = ["Presubmit-Ready+1"]
   ),
   mode = "SQUASH",
diff --git a/components/cronet/gn2bp/gen_android_bp.py b/components/cronet/gn2bp/gen_android_bp.py
index 733db85..92eb714 100755
--- a/components/cronet/gn2bp/gen_android_bp.py
+++ b/components/cronet/gn2bp/gen_android_bp.py
@@ -75,11 +75,14 @@
 
   global additional_args
   additional_args = {
-      f'{MODULE_PREFIX}net_third_party_quiche_net_quic_test_tools_proto_gen_headers':
-      [('export_include_dirs', {
-          "net/third_party/quiche/src",
-      })],
-      f'{MODULE_PREFIX}net_third_party_quiche_net_quic_test_tools_proto_gen__testing_headers':
+      # TODO: operating on the final module names means we have to use short
+      # names which are less readable. Find a better way.
+      f'{MODULE_PREFIX}39ea1a33_quiche_net_quic_test_tools_proto_gen_h': [
+          ('export_include_dirs', {
+              "net/third_party/quiche/src",
+          })
+      ],
+      f'{MODULE_PREFIX}39ea1a33_quiche_net_quic_test_tools_proto_gen__testing_h':
       [('export_include_dirs', {
           "net/third_party/quiche/src",
       })],
@@ -993,9 +996,18 @@
     return ret
 
 
-def label_to_module_name(label):
+def label_to_module_name(label, short=False):
   """Turn a GN label (e.g., //:perfetto_tests) into a module name."""
   module = re.sub(r'^//:?', '', label)
+
+  if short:
+    # We want the module name to be short, but we still need it to be unique and
+    # somewhat readable. To do this we replace just the path by a short hash.
+    parts = module.rsplit('/', maxsplit=1)
+    if len(parts) > 1 and len(parts[0]) > 10:
+      module = hashlib.sha256(
+          parts[0].encode('utf-8')).hexdigest()[:8] + '_' + parts[1]
+
   module = re.sub(r'[^a-zA-Z0-9_]', '_', module)
 
   if not module.startswith(MODULE_PREFIX):
@@ -1225,7 +1237,13 @@
   cpp_out_dir = get_value_arg('--cc-out-dir')
   assert cpp_out_dir is not None, target.name
   cpp_out_dir = cpp_out_dir.removeprefix('gen/')
-  target_module_name = label_to_module_name(target.name)
+  # We need to keep these module names short because the modules end up in
+  # `generated_headers` which propagate throughout the build graph. If the names
+  # are too long we can easily end up with long lists of generated headers with
+  # long names, which in turn trigger "argument list too long" errors due to the
+  # sheer size of `-I` include dir parameter lists being passed to the C++
+  # compiler.
+  target_module_name = label_to_module_name(target.name, short=True)
 
   # In GN builds the proto path is always relative to the output directory
   # (out/tmp.xxx).
@@ -1251,8 +1269,7 @@
   blueprint.add_module(source_module)
   source_module.srcs.update(sources)
 
-  header_module = Module('cc_genrule', source_module_name + '_headers',
-                         target.name)
+  header_module = Module('cc_genrule', source_module_name + '_h', target.name)
   blueprint.add_module(header_module)
   header_module.srcs = set(source_module.srcs)
 
diff --git a/components/cronet/gn2bp/run_gn2bp.py b/components/cronet/gn2bp/run_gn2bp.py
index 72d893c..f909f258 100755
--- a/components/cronet/gn2bp/run_gn2bp.py
+++ b/components/cronet/gn2bp/run_gn2bp.py
@@ -23,6 +23,7 @@
 import subprocess
 import sys
 import tempfile
+import textwrap
 import time
 from typing import List, Optional, Set, Tuple
 
@@ -71,6 +72,20 @@
     return None
 
 
+def _get_version_string() -> str:
+  version = ''
+  chrome_version_file_path = os.path.join(REPOSITORY_ROOT, 'chrome', 'VERSION')
+  for version_component in cronet_utils.read_file(
+      chrome_version_file_path).split('\n'):
+    if not version_component:
+      # Ignore empty lines
+      continue
+    if version:
+      # Only subsequent version components should be split by dots
+      version += '.'
+    version += version_component.split('=')[1]
+  return version
+
 def _run_license_generation() -> int:
   return cronet_utils.run(["python3", _GENERATE_LICENSE_SCRIPT_PATH])
 
@@ -172,11 +187,63 @@
   change_id = f'I{hashlib.sha1(msg.encode()).hexdigest()}'
   print(f'Generated {change_id=}')
 
-  target_workflow = None
+  version = _get_version_string()
+  commit_hash = cronet_utils.run_and_get_stdout(['git', 'rev-parse', 'HEAD'])
+  commit_date = cronet_utils.run_and_get_stdout(
+      ['git', 'show', '--pretty=format:%ci', '--no-patch'])
+  swarming_task_id = os.environ.get('SWARMING_TASK_ID')
+  commit_message = textwrap.dedent(f"""\
+      Import Cronet {commit_hash[:8]} ({version}) into {import_channel}
+
+      Chromium commit hash: {commit_hash}
+      Chromium commit date: {commit_date}
+      Chromium version: {version}
+
+      """)
+  if not os.environ.get('SWARMING_BOT_ID', '').startswith('luci-chrome-ci-'):
+    # This is not ideal, but we don't have a better signal to tell if gn2bp is
+    # running in CI or somewhere else.
+    #
+    # Chromium CQ checks for this string in code, so this must be split to land
+    # the change.
+    prefix = 'DO NOT ' + 'SUBMIT'
+    commit_message += textwrap.dedent(f"""\
+        {prefix}: This import was not generated by Chromium's CI, as such
+        it might contain unreviewed changes on top of the aforementioned commit.
+
+        """)
+  if swarming_task_id:
+    commit_message += textwrap.dedent(f"""\
+        This CL was autogenerated by the following Chromium bot run:
+        https://luci-milo.appspot.com/swarming/task/{swarming_task_id}?server=chrome-swarming.appspot.com
+
+        """)
+  commit_message += textwrap.dedent(f"""\
+      This CL can be reproduced by running the following command:
+      gclient config --spec 'solutions = [
+      {{
+          "name": "src",
+          "url": "https://chromium.googlesource.com/chromium/src.git",
+          "managed": False,
+          "custom_deps": {{}},
+          "custom_vars": {{
+            "checkout_copybara": True,
+          }},
+        }},
+      ]
+      target_os = ["android"]
+      ' && gclient sync --rev={commit_hash} && cd src
+      && vpython3 components/cronet/gn2bp/run_gn2bp.py --channel={import_channel}
+
+      The state of Chromium, for the commit being imported, can be browsed at:
+      https://chromium.googlesource.com/chromium/src/+/{commit_hash}""")
   additional_parameters = [
       '--ignore-noop',
+      '--force-message',
+      commit_message,
   ]
 
+  target_workflow = None
   if git_url_and_branch:
     target_workflow = f'{import_channel}_import_cronet_to_git_branch'
     additional_parameters.extend([
@@ -285,6 +352,11 @@
   run_copybara = not args.skip_copybara
   delete_temporary_files = not args.keep_temporary_files
 
+  if os.listdir(os.path.join(REPOSITORY_ROOT, 'clank')):
+    raise RuntimeError(
+        'gn2bp should not be run with an internal code checkout, as copybara'
+        ' may end up leaking internal code to the destination')
+
   try:
     arch_to_desc_file = {
         arch:
diff --git a/components/cronet/tools/utils.py b/components/cronet/tools/utils.py
index 79f770c..c1f9218 100755
--- a/components/cronet/tools/utils.py
+++ b/components/cronet/tools/utils.py
@@ -40,6 +40,20 @@
   return subprocess.call(command, **kwargs)
 
 
+def run_and_get_stdout(command, **kwargs):
+  """See the official documentation for subprocess.run.
+
+  Args:
+    command (list[str]): command to be executed
+
+  Returns:
+    str: stdout for the executed command
+  """
+  print('Executing: ' + ' '.join(shlex.quote(arg) for arg in command))
+  return subprocess.run(command, capture_output=True,
+                        check=True, **kwargs).stdout.decode('utf-8').strip()
+
+
 def gn(out_dir, gn_args, gn_extra=None, **kwargs):
   """ Executes `gn gen`.
 
diff --git a/components/dom_distiller/content/renderer/distiller_native_javascript.cc b/components/dom_distiller/content/renderer/distiller_native_javascript.cc
index f5e9a032..712c9ed 100644
--- a/components/dom_distiller/content/renderer/distiller_native_javascript.cc
+++ b/components/dom_distiller/content/renderer/distiller_native_javascript.cc
@@ -70,29 +70,31 @@
 
   EnsureServiceConnected();
 
-  // Many functions can simply call the Mojo interface directly and have no
-  // wrapper function for binding. Note that calling distiller_js_service.get()
-  // does not transfer ownership of the interface.
   BindFunctionToObject(
       isolate, distiller_obj, "openSettings",
       base::BindRepeating(
-          &mojom::DistillerJavaScriptService::HandleDistillerOpenSettingsCall,
-          base::Unretained(distiller_js_service_.get())));
+          [](base::WeakPtr<DistillerNativeJavaScript> service) {
+            if (!service || !service->distiller_js_service_) {
+              return;
+            }
+            service->distiller_js_service_->HandleDistillerOpenSettingsCall();
+          },
+          weak_factory_.GetWeakPtr()));
 
   BindFunctionToObject(
       isolate, distiller_obj, "storeThemePref",
       base::BindRepeating(&DistillerNativeJavaScript::StoreIntTheme,
-                          base::Unretained(this)));
+                          weak_factory_.GetWeakPtr()));
 
   BindFunctionToObject(
       isolate, distiller_obj, "storeFontFamilyPref",
       base::BindRepeating(&DistillerNativeJavaScript::StoreIntFontFamily,
-                          base::Unretained(this)));
+                          weak_factory_.GetWeakPtr()));
 
   BindFunctionToObject(
       isolate, distiller_obj, "storeFontScalingPref",
       base::BindRepeating(&DistillerNativeJavaScript::StoreFloatFontScaling,
-                          base::Unretained(this)));
+                          weak_factory_.GetWeakPtr()));
 }
 
 template <typename Sig>
diff --git a/components/dom_distiller/content/renderer/distiller_native_javascript.h b/components/dom_distiller/content/renderer/distiller_native_javascript.h
index eed6256..d729722 100644
--- a/components/dom_distiller/content/renderer/distiller_native_javascript.h
+++ b/components/dom_distiller/content/renderer/distiller_native_javascript.h
@@ -6,6 +6,7 @@
 #define COMPONENTS_DOM_DISTILLER_CONTENT_RENDERER_DISTILLER_NATIVE_JAVASCRIPT_H_
 
 #include "base/memory/raw_ptr.h"
+#include "base/memory/weak_ptr.h"
 #include "components/dom_distiller/content/common/mojom/distiller_javascript_service.mojom.h"
 #include "content/public/renderer/render_frame.h"
 #include "content/public/renderer/render_frame_observer.h"
@@ -45,6 +46,8 @@
 
   raw_ptr<content::RenderFrame> render_frame_;
   mojo::Remote<mojom::DistillerJavaScriptService> distiller_js_service_;
+
+  base::WeakPtrFactory<DistillerNativeJavaScript> weak_factory_{this};
 };
 
 // static
diff --git a/components/management_strings.grdp b/components/management_strings.grdp
index 081130d8..09869f1 100644
--- a/components/management_strings.grdp
+++ b/components/management_strings.grdp
@@ -231,7 +231,6 @@
     <message name="IDS_MANAGEMENT_REPORT_FILE_EVENTS" desc="Message stating that administrators may see file information">
       Recent file access and modifications, including file names, digital fingerprints of the file content, download source, and metadata
     </message>
-
     <!-- ChromeOS update required end-of-life reached section -->
     <message name="IDS_MANAGEMENT_UPDATE_REQUIRED_EOL_MESSAGE" desc="Message indicating that the device needs to be returned back before the deadline because the device has reached end-of-life and an update is required as per policy.">
       <ph name="ENROLLMENT_DOMAIN">$1<ex>example.com</ex></ph> requires you to back up your data and return this <ph name="DEVICE_TYPE">$2<ex>Chromebook</ex></ph>.
@@ -239,6 +238,25 @@
     <message name="IDS_MANAGEMENT_UPDATE_REQUIRED_EOL_ADMIN_MESSAGE_TITLE" desc="Message indicating return instructions from the device administrator because the device cannot be updated as it has reached its end of life.">
       Instructions from your device administrator:
     </message>
+    <!-- Strings related to Desk sync section -->
+    <message name="IDS_MANAGEMENT_DESK_SYNC_TITLE" desc="Title of the Desk sync section on chrome management page.">
+      Desk sync
+    </message>
+    <message name="IDS_MANAGEMENT_DESK_SYNC_DESCRIPTION" desc="Message explaining that the Desk sync feature is enabled and it will result in synchronization of some data between user's ChromeOS devices. Data will be listed in a list below.">
+      Your administrator enables the following to be synced between your previous and current sessions on any ChromeOS device:
+    </message>
+    <message name="IDS_MANAGEMENT_DESK_SYNC_WINDOWS_NOTICE" desc="This string is used to mention windows (i.e. browser and application windows) in the list of data which is synced by the Desk sync feature.">
+      Windows (arrangement and organization of windows and tabs)
+    </message>
+    <message name="IDS_MANAGEMENT_DESK_SYNC_COOKIES_NOTICE" desc="This string is used to mention browser cookies in the list of data which is synced by the Desk sync feature. It also clarifies that cookies are responsible for the signed-in state on websites.">
+      Cookies (signed-in state on your recently visited websites)
+    </message>
+    <message name="IDS_MANAGEMENT_DESK_SYNC_OPT_OUT" desc="Message explaining that the user can opt out from the effects of the Desk sync feature in Chrome Sync settings.">
+      You can opt out of this policy in <ph name="BEGIN_LINK">&lt;a href='chrome://settings/syncSetup'&gt;</ph>Chrome Sync settings<ph name="END_LINK">&lt;/a&gt;</ph>.
+    </message>
+    <message name="IDS_MANAGEMENT_DESK_SYNC_LEARN_MORE" desc="Learn more link for the section about the Desk sync feature to provide additional informaiton">
+      <ph name="BEGIN_LINK">&lt;a target="_blank" href="https://support.google.com/chrome/a?p=office_cookies_sync" &gt;</ph>Learn more<ph name="END_LINK">&lt;/a&gt;</ph>
+    </message>
   </if>
 
   <if expr="not is_ios">
diff --git a/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_COOKIES_NOTICE.png.sha1 b/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_COOKIES_NOTICE.png.sha1
new file mode 100644
index 0000000..030e7c7
--- /dev/null
+++ b/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_COOKIES_NOTICE.png.sha1
@@ -0,0 +1 @@
+fcf02ac3685fde82eefb7a95601147aa92ae204e
\ No newline at end of file
diff --git a/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_DESCRIPTION.png.sha1 b/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_DESCRIPTION.png.sha1
new file mode 100644
index 0000000..73e4830
--- /dev/null
+++ b/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_DESCRIPTION.png.sha1
@@ -0,0 +1 @@
+c4a017bac0fa6660a051852949b82da127031f5a
\ No newline at end of file
diff --git a/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_LEARN_MORE.png.sha1 b/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_LEARN_MORE.png.sha1
new file mode 100644
index 0000000..08736bd4
--- /dev/null
+++ b/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_LEARN_MORE.png.sha1
@@ -0,0 +1 @@
+0ad3fdaf22ee42171d92d552cdb626afd499d71a
\ No newline at end of file
diff --git a/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_OPT_OUT.png.sha1 b/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_OPT_OUT.png.sha1
new file mode 100644
index 0000000..632fa6e4
--- /dev/null
+++ b/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_OPT_OUT.png.sha1
@@ -0,0 +1 @@
+aaf3cc318240131b5cc6c5aeec8904a0bdbf8468
\ No newline at end of file
diff --git a/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_TITLE.png.sha1 b/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_TITLE.png.sha1
new file mode 100644
index 0000000..a5e69bf
--- /dev/null
+++ b/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_TITLE.png.sha1
@@ -0,0 +1 @@
+2223b7d156af7a7456251fb290d981f370d63158
\ No newline at end of file
diff --git a/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_WINDOWS_NOTICE.png.sha1 b/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_WINDOWS_NOTICE.png.sha1
new file mode 100644
index 0000000..158b48c5
--- /dev/null
+++ b/components/management_strings_grdp/IDS_MANAGEMENT_DESK_SYNC_WINDOWS_NOTICE.png.sha1
@@ -0,0 +1 @@
+ce037e0d24a82e6397e7568081b60ebba84aaab8
\ No newline at end of file
diff --git a/components/optimization_guide/core/model_execution/on_device_model_adaptation_loader.cc b/components/optimization_guide/core/model_execution/on_device_model_adaptation_loader.cc
index cb4baa18a..2e69731 100644
--- a/components/optimization_guide/core/model_execution/on_device_model_adaptation_loader.cc
+++ b/components/optimization_guide/core/model_execution/on_device_model_adaptation_loader.cc
@@ -110,10 +110,10 @@
     : feature_(feature),
       target_(
           *features::internal::GetOptimizationTargetForCapability(feature_)),
-      on_load_fn_(on_load_fn),
+      model_provider_(model_provider),
       on_device_component_state_manager_(on_device_component_state_manager),
       local_state_(local_state),
-      model_provider_(model_provider),
+      on_load_fn_(on_load_fn),
       background_task_runner_(base::ThreadPool::CreateSequencedTaskRunner(
           {base::MayBlock(), base::TaskPriority::BEST_EFFORT})) {
   if (!on_device_component_state_manager) {
@@ -128,8 +128,13 @@
 }
 
 OnDeviceModelAdaptationLoader::~OnDeviceModelAdaptationLoader() {
-  if (registered_with_model_provider_) {
+  Unregister();
+}
+
+void OnDeviceModelAdaptationLoader::Unregister() {
+  if (registered_spec_) {
     model_provider_->RemoveObserverForOptimizationTargetModel(target_, this);
+    registered_spec_.reset();
   }
 }
 
@@ -143,24 +148,20 @@
     const OnDeviceModelComponentState* state,
     bool was_feature_recently_used) {
   CHECK(model_provider_);
-  if (registered_with_model_provider_) {
-    model_provider_->RemoveObserverForOptimizationTargetModel(target_, this);
-    registered_with_model_provider_ = false;
-  }
-  base_model_spec_ = std::nullopt;
-  on_load_fn_.Run(nullptr);
   if (!state) {
+    Unregister();
+    on_load_fn_.Run(nullptr);
     RecordAdaptationModelAvailability(
         feature_, OnDeviceModelAdaptationAvailability::kBaseModelUnavailable);
     return;
   }
-  base_model_spec_ = state->GetBaseModelSpec();
+  auto spec = state->GetBaseModelSpec();
+  if (registered_spec_ == spec) {
+    return;
+  }
+  Unregister();
+  on_load_fn_.Run(nullptr);
   if (!switches::GetOnDeviceModelExecutionOverride()) {
-    if (!base_model_spec_) {
-      RecordAdaptationModelAvailability(
-          feature_, OnDeviceModelAdaptationAvailability::kBaseModelSpecInvalid);
-      return;
-    }
     if (!was_feature_recently_used) {
       RecordAdaptationModelAvailability(
           feature_,
@@ -169,23 +170,23 @@
     }
   }
 
+  registered_spec_ = state->GetBaseModelSpec();
   proto::Any any_metadata;
   any_metadata.set_type_url(
       "type.googleapis.com/"
       "google.internal.chrome.optimizationguide.v1.OnDeviceBaseModelMetadata");
-  proto::OnDeviceBaseModelMetadata model_metadata;
-  if (base_model_spec_) {
-    model_metadata.set_base_model_version(base_model_spec_->model_version);
-    model_metadata.set_base_model_name(base_model_spec_->model_name);
+  {
+    proto::OnDeviceBaseModelMetadata model_metadata;
+    model_metadata.set_base_model_version(registered_spec_->model_version);
+    model_metadata.set_base_model_name(registered_spec_->model_name);
     *model_metadata.mutable_supported_performance_hints() = {
-        base_model_spec_->supported_performance_hints.begin(),
-        base_model_spec_->supported_performance_hints.end()};
+        registered_spec_->supported_performance_hints.begin(),
+        registered_spec_->supported_performance_hints.end()};
+    model_metadata.SerializeToString(any_metadata.mutable_value());
   }
-  model_metadata.SerializeToString(any_metadata.mutable_value());
 
   model_provider_->AddObserverForOptimizationTargetModel(target_, any_metadata,
                                                          this);
-  registered_with_model_provider_ = true;
 }
 
 void OnDeviceModelAdaptationLoader::OnDeviceEligibleFeatureFirstUsed(
@@ -252,14 +253,14 @@
   }
   // Check for incompatibility when base model override is not specified
   if (!switches::GetOnDeviceModelExecutionOverride()) {
-    if (!base_model_spec_) {
+    if (!registered_spec_) {
       return base::unexpected(
           OnDeviceModelAdaptationAvailability::kBaseModelUnavailable);
     }
     if (supported_model_spec->base_model_name() !=
-            base_model_spec_->model_name ||
+            registered_spec_->model_name ||
         supported_model_spec->base_model_version() !=
-            base_model_spec_->model_version) {
+            registered_spec_->model_version) {
       return base::unexpected(
           OnDeviceModelAdaptationAvailability::kAdaptationModelIncompatible);
     }
diff --git a/components/optimization_guide/core/model_execution/on_device_model_adaptation_loader.h b/components/optimization_guide/core/model_execution/on_device_model_adaptation_loader.h
index 8ee15bc7..7bfd341 100644
--- a/components/optimization_guide/core/model_execution/on_device_model_adaptation_loader.h
+++ b/components/optimization_guide/core/model_execution/on_device_model_adaptation_loader.h
@@ -84,6 +84,9 @@
  private:
   friend class OnDeviceModelAdaptationLoaderTest;
 
+  // Removes any registration for model updates.
+  void Unregister();
+
   // OptimizationTargetModelObserver:
   void OnModelUpdated(
       optimization_guide::proto::OptimizationTarget optimization_target,
@@ -105,24 +108,19 @@
   ModelBasedCapabilityKey feature_;
   proto::OptimizationTarget target_;
 
-  // The model spec of the latest base model, received from the component
-  // state manager.
-  std::optional<OnDeviceBaseModelSpec> base_model_spec_;
-
+  // The model provider to observe for updates to model adaptations.
+  raw_ptr<OptimizationGuideModelProvider> model_provider_;
+  base::WeakPtr<OnDeviceModelComponentStateManager>
+      on_device_component_state_manager_;
+  raw_ptr<PrefService> local_state_;
   OnLoadFn on_load_fn_;
 
   base::ScopedObservation<OnDeviceModelComponentStateManager,
                           OnDeviceModelComponentStateManager::Observer>
       component_state_manager_observation_{this};
 
-  base::WeakPtr<OnDeviceModelComponentStateManager>
-      on_device_component_state_manager_;
-
-  raw_ptr<PrefService> local_state_;
-
-  // The model provider to observe for updates to model adaptations.
-  raw_ptr<OptimizationGuideModelProvider> model_provider_;
-  bool registered_with_model_provider_ = false;
+  // The compatibility spec that we've registered for adaptations with.
+  std::optional<OnDeviceBaseModelSpec> registered_spec_;
 
   // Background thread where file processing should be performed.
   scoped_refptr<base::SequencedTaskRunner> background_task_runner_;
diff --git a/components/optimization_guide/core/model_execution/on_device_model_component.cc b/components/optimization_guide/core/model_execution/on_device_model_component.cc
index d3f65f9..670b8c7 100644
--- a/components/optimization_guide/core/model_execution/on_device_model_component.cc
+++ b/components/optimization_guide/core/model_execution/on_device_model_component.cc
@@ -97,6 +97,13 @@
 OnDeviceBaseModelSpec::OnDeviceBaseModelSpec(const OnDeviceBaseModelSpec&) =
     default;
 
+bool OnDeviceBaseModelSpec::operator==(
+    const OnDeviceBaseModelSpec& other) const {
+  return model_name == other.model_name &&
+         model_version == other.model_version &&
+         supported_performance_hints == other.supported_performance_hints;
+}
+
 void OnDeviceModelComponentStateManager::UninstallComplete() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   local_state_->ClearPref(model_execution::prefs::localstate::
diff --git a/components/optimization_guide/core/model_execution/on_device_model_component.h b/components/optimization_guide/core/model_execution/on_device_model_component.h
index 98c9ad7..a395649 100644
--- a/components/optimization_guide/core/model_execution/on_device_model_component.h
+++ b/components/optimization_guide/core/model_execution/on_device_model_component.h
@@ -43,6 +43,8 @@
   ~OnDeviceBaseModelSpec();
   OnDeviceBaseModelSpec(const OnDeviceBaseModelSpec&);
 
+  bool operator==(const OnDeviceBaseModelSpec& other) const;
+
   // The name of the base model currently available on-device.
   std::string model_name;
   // The version of the base model currently available on-device.
diff --git a/components/optimization_guide/proto/features/actions_data.proto b/components/optimization_guide/proto/features/actions_data.proto
index 3426479..cf17c91 100644
--- a/components/optimization_guide/proto/features/actions_data.proto
+++ b/components/optimization_guide/proto/features/actions_data.proto
@@ -192,8 +192,70 @@
 }
 
 // A single set of actions to be taken by Chrome before responding.
-// Next ID: 2
+// Next ID: 4
 message BrowserAction {
   // The actions to be taken by Chrome.
   repeated ActionInformation action_information = 1;
+
+  // The task id of the action.
+  int32 task_id = 2;
+
+  // The id of the tab the action will be taken in.
+  int32 tab_id = 3;
+}
+
+// The state of the browser after an action is taken.
+// Currently only used for extension APIs, but should directly reflect the
+// production state of the browser returned in glic.mojom.
+// Next ID: 7
+message BrowserActionResult {
+  // The page content at the time after the action.
+  AnnotatedPageContent annotated_page_content = 1;
+
+  // The screenshot of the page at the time after the action.
+  bytes screenshot = 2;
+
+  // The mime type of the |screenshot|.
+  string screenshot_mime_type = 3;
+
+  // The result of the action.
+  int32 action_result = 4;
+
+  // The task id of the action.
+  int32 task_id = 5;
+
+  // The id of the tab the action was taken in.
+  int32 tab_id = 6;
+}
+
+// A request to start a task.
+// Next ID: 1
+
+message BrowserStartTask {
+}
+
+// The response to a request to start a task.
+// Next ID: 4
+message BrowserStartTaskResult {
+  // The id of the task that was created.
+  int32 task_id = 1;
+
+  // The id of the tab the action will be taken in.
+  int32 tab_id = 2;
+
+  // The status of the start task request. If not SUCCESS, the task_id and
+  // tab_id may not be set.
+  StartTaskStatus status = 3;
+
+  enum StartTaskStatus {
+    // Unknown start task status. This should not be used.
+    START_TASK_STATUS_UNKNOWN = 0;
+
+    // The task was started successfully.
+    SUCCESS = 1;
+
+    // The task was not started because there were too many tasks already
+    // running.
+    OVER_TASK_LIMIT = 2;
+  }
 }
diff --git a/components/optimization_guide/proto/features/common_quality_data.proto b/components/optimization_guide/proto/features/common_quality_data.proto
index c20934d..4cd3006ba 100644
--- a/components/optimization_guide/proto/features/common_quality_data.proto
+++ b/components/optimization_guide/proto/features/common_quality_data.proto
@@ -213,6 +213,7 @@
   PageInteractionInfo page_interaction_info = 4;
 
   // The rect of the viewport for the tab. i.e., screenshot dimensions.
+  // Dimensions are in captured pixels.
   BoundingRect viewport_geometry = 5;
 }
 
@@ -290,7 +291,11 @@
   // This is the geometry of the common_ancestor_dom_node_id.
   Geometry geometry = 4;
 
-  // The interaction information for the content node.
+  // The interaction information for the content node. This information is only
+  // computed for proto version
+  // ANNOTATED_PAGE_CONTENT_VERSION_ONLY_ACTIONABLE_ELEMENTS_1_0.
+  //
+  // Unless otherwise specified, all nodes are selectable.
   InteractionInfo interaction_info = 21;
 
   // These can come from the aria role, the html tag, or are assumed from some
diff --git a/components/page_load_metrics/browser/features.cc b/components/page_load_metrics/browser/features.cc
index 8b4f168..d33cb7a8 100644
--- a/components/page_load_metrics/browser/features.cc
+++ b/components/page_load_metrics/browser/features.cc
@@ -18,6 +18,12 @@
              base::FEATURE_ENABLED_BY_DEFAULT);
 
 BASE_FEATURE_PARAM(std::string,
+                   kBeaconLeakageLoggingCategoryParamName,
+                   &kBeaconLeakageLogging,
+                   "category_param_name",
+                   /*default_value=*/"category");
+
+BASE_FEATURE_PARAM(std::string,
                    kBeaconLeakageLoggingCategoryPrefix,
                    &kBeaconLeakageLogging,
                    "category_prefix",
diff --git a/components/page_load_metrics/browser/features.h b/components/page_load_metrics/browser/features.h
index 0d7547b..c5a960b 100644
--- a/components/page_load_metrics/browser/features.h
+++ b/components/page_load_metrics/browser/features.h
@@ -16,6 +16,9 @@
 // The feature flag to enable beacon leakage-related logging logic.
 BASE_DECLARE_FEATURE(kBeaconLeakageLogging);
 
+// The param name of the URL category for beacon-leakage-related logging logic.
+BASE_DECLARE_FEATURE_PARAM(std::string, kBeaconLeakageLoggingCategoryParamName);
+
 // The prefix of the URL category for beacon-leakage-related logging logic.
 BASE_DECLARE_FEATURE_PARAM(std::string, kBeaconLeakageLoggingCategoryPrefix);
 }  // namespace page_load_metrics::features
diff --git a/components/page_load_metrics/browser/page_load_metrics_util.cc b/components/page_load_metrics/browser/page_load_metrics_util.cc
index 364be9b8..a6b6f00 100644
--- a/components/page_load_metrics/browser/page_load_metrics_util.cc
+++ b/components/page_load_metrics/browser/page_load_metrics_util.cc
@@ -105,9 +105,6 @@
   return false;
 }
 
-// The category URL param name.
-constexpr char kUrlCategoryParamName[] = "category";
-
 // Returns the category ID given a string if it matches the configured pattern.
 std::optional<uint32_t> GetCategoryId(const std::string& category) {
   auto category_prefix = features::kBeaconLeakageLoggingCategoryPrefix.Get();
@@ -354,7 +351,9 @@
 
 std::optional<uint32_t> GetCategoryIdFromUrl(const GURL& url) {
   std::string category;
-  if (net::GetValueForKeyInQuery(url, kUrlCategoryParamName, &category)) {
+  if (net::GetValueForKeyInQuery(
+          url, features::kBeaconLeakageLoggingCategoryParamName.Get(),
+          &category)) {
     return GetCategoryId(category);
   }
   return std::nullopt;
diff --git a/components/page_load_metrics/browser/page_load_metrics_util.h b/components/page_load_metrics/browser/page_load_metrics_util.h
index 2690ca51..05d737b2 100644
--- a/components/page_load_metrics/browser/page_load_metrics_util.h
+++ b/components/page_load_metrics/browser/page_load_metrics_util.h
@@ -251,15 +251,16 @@
     const PageLoadMetricsObserverDelegate& delegate,
     ukm::SourceId source_id);
 
-// Returns the ID if `url` contains a URL param "category" where the param value
-// matches the pattern configured by Finch. Returns std::nullopt if the param
-// value is not recognized.
+// Returns the ID if `url` contains a URL param where the param name and value
+// matches the prefix pattern configured by Finch (the default param name is
+// "category" and the prefix pattern is an empty string / will match anything).
+// Returns std::nullopt if the param value is not recognized.
 //
-// For example, if the valid pattern prefix is "pattern", this function may
-// return an ID for (1) but not for (2):
+// For example, if the valid param name  is "cat" and the prefix pattern is
+// "pattern", this function may return an ID for (1) but not for (2):
 //
-// (1) http://a.com?category=pattern1
-// (2) http://b.com?category=invalid-pattern
+// (1) http://a.com?cat=pattern1
+// (2) http://b.com?cat=invalid-pattern
 //
 // UKM Review:
 // https://docs.google.com/document/d/1TSbtp5I5Bc1pbAKrrEHfmZlAwgeh6AlgAH7GbDMNPRQ/edit?disco=AAABe5h90jQ
diff --git a/components/page_load_metrics/google/browser/from_gws_abandoned_page_load_metrics_observer.h b/components/page_load_metrics/google/browser/from_gws_abandoned_page_load_metrics_observer.h
index 30cbf9b..283640a1 100644
--- a/components/page_load_metrics/google/browser/from_gws_abandoned_page_load_metrics_observer.h
+++ b/components/page_load_metrics/google/browser/from_gws_abandoned_page_load_metrics_observer.h
@@ -76,7 +76,9 @@
 
   std::optional<std::set<NavigationMilestone>> last_logged_ukm_milestones_;
 
-  // The value of `category=` URL parameter in the initial navigated url.
+  // The value of the URL category (which is configured by
+  // `kBeaconLeakageLoggingCategoryPrefix` and defaults to "category") parameter
+  // in the initial navigated url.
   std::optional<uint32_t> category_parameter_id_;
 };
 
diff --git a/components/permissions/BUILD.gn b/components/permissions/BUILD.gn
index 098a397..02d0416 100644
--- a/components/permissions/BUILD.gn
+++ b/components/permissions/BUILD.gn
@@ -109,7 +109,6 @@
     "permission_usage_session.cc",
     "permission_usage_session.h",
     "permission_util.cc",
-    "permission_util.h",
     "permissions_client.cc",
     "permissions_client.h",
     "pref_names.cc",
diff --git a/components/permissions/android/java/src/org/chromium/components/permissions/OsAdditionalSecurityPermissionProvider.java b/components/permissions/android/java/src/org/chromium/components/permissions/OsAdditionalSecurityPermissionProvider.java
index c89a5ce2..b1e88296 100644
--- a/components/permissions/android/java/src/org/chromium/components/permissions/OsAdditionalSecurityPermissionProvider.java
+++ b/components/permissions/android/java/src/org/chromium/components/permissions/OsAdditionalSecurityPermissionProvider.java
@@ -31,7 +31,7 @@
      * querying from any thread.
      */
     public boolean isAdvancedProtectionRequestedByOs() {
-        return !hasJavascriptOptimizerPermission();
+        return false;
     }
 
     /**
@@ -39,7 +39,7 @@
      * Implementations must allow querying from any thread.
      */
     public boolean hasJavascriptOptimizerPermission() {
-        return false;
+        return !isAdvancedProtectionRequestedByOs();
     }
 
     /**
diff --git a/components/permissions/contexts/camera_pan_tilt_zoom_permission_context.cc b/components/permissions/contexts/camera_pan_tilt_zoom_permission_context.cc
index 8787a6c..5244be5 100644
--- a/components/permissions/contexts/camera_pan_tilt_zoom_permission_context.cc
+++ b/components/permissions/contexts/camera_pan_tilt_zoom_permission_context.cc
@@ -12,6 +12,7 @@
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "services/network/public/mojom/permissions_policy/permissions_policy_feature.mojom-shared.h"
@@ -82,7 +83,10 @@
       ->RequestPermissionFromCurrentDocument(
           render_frame_host,
           content::PermissionRequestDescription(
-              blink::PermissionType::VIDEO_CAPTURE, request_data.user_gesture),
+              content::PermissionDescriptorUtil::
+                  CreatePermissionDescriptorForPermissionType(
+                      blink::PermissionType::VIDEO_CAPTURE),
+              request_data.user_gesture),
           base::BindOnce(&CallbackWrapper, std::move(callback)));
 }
 
diff --git a/components/permissions/features.cc b/components/permissions/features.cc
index c4c2614..687db3c1 100644
--- a/components/permissions/features.cc
+++ b/components/permissions/features.cc
@@ -115,7 +115,7 @@
 
 BASE_FEATURE(kCpssUseTfliteSignatureRunner,
              "CpssUseTfliteSignatureRunner",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // When enabled, FederatedIdentityApiEmbargoDurationDismiss will use values from
 // a field trial.
diff --git a/components/permissions/permission_manager.cc b/components/permissions/permission_manager.cc
index 28ef2f3..d140c48 100644
--- a/components/permissions/permission_manager.cc
+++ b/components/permissions/permission_manager.cc
@@ -67,14 +67,14 @@
  public:
   PendingRequest(
       content::RenderFrameHost* render_frame_host,
-      const std::vector<ContentSettingsType>& permissions,
+      std::vector<blink::mojom::PermissionDescriptorPtr> permissions,
       base::OnceCallback<void(const std::vector<ContentSetting>&)> callback)
       : render_process_id_(render_frame_host->GetProcess()->GetDeprecatedID()),
         render_frame_id_(render_frame_host->GetRoutingID()),
         callback_(std::move(callback)),
-        permissions_(permissions),
+        remaining_results_(permissions.size()),
         results_(permissions.size(), CONTENT_SETTING_BLOCK),
-        remaining_results_(permissions.size()) {}
+        permissions_(std::move(permissions)) {}
 
   void SetContentSetting(int permission_id, ContentSetting content_setting) {
     DCHECK(!IsComplete());
@@ -92,7 +92,10 @@
     return std::move(callback_);
   }
 
-  std::vector<ContentSettingsType> permissions() const { return permissions_; }
+  const std::vector<blink::mojom::PermissionDescriptorPtr>& permissions()
+      const {
+    return permissions_;
+  }
 
   std::vector<ContentSetting> results() const { return results_; }
 
@@ -100,9 +103,9 @@
   int render_process_id_;
   int render_frame_id_;
   base::OnceCallback<void(const std::vector<ContentSetting>&)> callback_;
-  std::vector<ContentSettingsType> permissions_;
-  std::vector<ContentSetting> results_;
   size_t remaining_results_;
+  std::vector<ContentSetting> results_;
+  std::vector<blink::mojom::PermissionDescriptorPtr> permissions_;
 };
 
 // Object to track the callback passed to
@@ -225,31 +228,35 @@
     const content::PermissionRequestDescription& request_description,
     base::OnceCallback<void(const std::vector<PermissionStatus>&)>
         permission_status_callback) {
-  std::vector<ContentSettingsType> permissions;
-  std::ranges::transform(request_description.permissions,
-                         back_inserter(permissions),
-                         PermissionUtil::PermissionTypeToContentSettingsType);
+  std::vector<blink::mojom::PermissionDescriptorPtr> permissions;
+  permissions.reserve(request_description.permissions.size());
+  for (const auto& permission : request_description.permissions) {
+    permissions.push_back(permission.Clone());
+  }
 
   base::OnceCallback<void(const std::vector<ContentSetting>&)> callback =
       base::BindOnce(&PermissionStatusVectorCallbackWrapper,
                      std::move(permission_status_callback));
 
-  if (permissions.empty()) {
+  if (request_description.permissions.empty()) {
     std::move(callback).Run(std::vector<ContentSetting>());
     return;
   }
 
   auto request_local_id = request_local_id_generator_.GenerateNextId();
   pending_requests_.AddWithID(
-      std::make_unique<PendingRequest>(render_frame_host, permissions,
-                                       std::move(callback)),
+      std::make_unique<PendingRequest>(
+          render_frame_host, std::move(permissions), std::move(callback)),
       request_local_id);
 
   const PermissionRequestID request_id(render_frame_host, request_local_id);
   const GURL embedding_origin = GetEmbeddingOrigin(
       render_frame_host, request_description.requesting_origin);
-  for (size_t i = 0; i < permissions.size(); ++i) {
-    const ContentSettingsType permission = permissions[i];
+  for (size_t i = 0; i < request_description.permissions.size(); ++i) {
+    const ContentSettingsType permission =
+        PermissionUtil::PermissionTypeToContentSettingsType(
+            blink::PermissionDescriptorToPermissionType(
+                request_description.permissions[i]));
     const GURL canonical_requesting_origin = PermissionUtil::GetCanonicalOrigin(
         permission, request_description.requesting_origin, embedding_origin);
 
diff --git a/components/permissions/permission_manager_unittest.cc b/components/permissions/permission_manager_unittest.cc
index 7d8f9ef..d6d9e39c 100644
--- a/components/permissions/permission_manager_unittest.cc
+++ b/components/permissions/permission_manager_unittest.cc
@@ -20,6 +20,7 @@
 #include "components/permissions/test/permission_test_util.h"
 #include "components/permissions/test/test_permissions_client.h"
 #include "content/public/browser/content_browser_client.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/permission_request_description.h"
 #include "content/public/browser/permission_result.h"
 #include "content/public/common/content_client.h"
@@ -145,7 +146,8 @@
     GetPermissionManager()->RequestPermissionsFromCurrentDocument(
         rfh,
         std::move(content::PermissionRequestDescription(
-            std::vector(1, type),
+            content::PermissionDescriptorUtil::
+                CreatePermissionDescriptorForPermissionType(type),
             /*user_gesture=*/true, rfh->GetLastCommittedOrigin().GetURL())),
         base::BindOnce(
             [](base::OnceCallback<void(PermissionStatus)> callback,
@@ -164,8 +166,9 @@
     GetPermissionManager()->RequestPermissionsFromCurrentDocument(
         rfh,
         content::PermissionRequestDescription(
-            type, /*user_gesture=*/true,
-            rfh->GetLastCommittedOrigin().GetURL()),
+            content::PermissionDescriptorUtil::
+                CreatePermissionDescriptorForPermissionType(type),
+            /*user_gesture=*/true, rfh->GetLastCommittedOrigin().GetURL()),
         base::BindOnce(
             [](base::OnceCallback<void(PermissionStatus)> callback,
                const std::vector<PermissionStatus>& state) {
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto
index 291dfe06..0ecef286 100644
--- a/components/policy/proto/device_management_backend.proto
+++ b/components/policy/proto/device_management_backend.proto
@@ -373,7 +373,10 @@
   // enrollment process.
   optional string oidc_profile_enrollment_state = 22;
 
-  // Next id: 23.
+  // Information from the device's SMBIOS.
+  optional SmbiosInfo smbios_info = 23;
+
+  // Next id: 24.
 }
 
 // Identification of a device used during its registration.
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 79bf862..996eea0 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -7852,6 +7852,7 @@
 <translation id="6583473893541367102">Wenn du diese Richtlinie konfigurierst, gibst du eine Liste von URLs an, deren Muster mit dem SecurityOrigin-Objekt der anfragenden URL abgeglichen werden. Bei einer Übereinstimmung wird ohne Nachfrage Zugriff auf Videoaufnahmegeräte gewährt.
 
       Genaue Informationen zu gültigen <ph name="URL_LABEL" />-Mustern findest du unter https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Das Muster „*“, das bei jeder URL zu einer Übereinstimmung führt, wird von dieser Richtlinie jedoch nicht unterstützt.</translation>
+<translation id="6583517553738784213">Bedienungshilfe „Mimik-Steuerung“ deaktivieren</translation>
 <translation id="6584122839583172231">In den Einstellungen von F12 wird die Tastenkombination verwendet, die den Strg- und den Umschalttaste-Modifikator enthält</translation>
 <translation id="6584541828182430328">Anzeige von Vollbild-Warnung deaktivieren</translation>
 <translation id="6588634282328239769">Vollständige URL anzeigen</translation>
@@ -8157,6 +8158,7 @@
 Wird die Richtlinie deaktiviert, wird das Symbol für den Zugriff auf experimentelle Browserfunktionen von der Symbolleiste entfernt.
 
       „chrome://flags“ und alle weiteren Möglichkeiten zum Aktivieren oder Deaktivieren von Browserfunktionen funktionieren weiter wie gewohnt, unabhängig davon, ob diese Richtlinie aktiviert oder deaktiviert ist.</translation>
+<translation id="6794273802619210652">Bedienungshilfe „Mimik-Steuerung“ aktivieren</translation>
 <translation id="6795485990775913659">Drucken nur ohne PIN zulassen</translation>
 <translation id="6796215185873669533">Standardmäßig Browsereinstellungen für die Hauptversion im User-Agent-String verwenden.</translation>
 <translation id="6800181452282128474">Keine Anfragen an Quirks Server stellen</translation>
@@ -9223,6 +9225,7 @@
 <translation id="7635106595080609261">Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, kann Chrome Dialogfelder zur Dateiauswahl anzeigen und Nutzer können diese öffnen.
 
       Wird die Richtlinie deaktiviert, erscheint stattdessen eine Meldung, wenn Nutzer mit einer Aktion ein Dialogfeld zur Dateiauswahl öffnen würden, etwa beim Importieren von Lesezeichen, Hochladen von Dateien und Speichern von Links. Es wird angenommen, dass der Nutzer im Dialogfeld zur Dateiauswahl auf „Abbrechen“ geklickt hat.</translation>
+<translation id="7637522465980672147">Mimik-Steuerung aktivieren</translation>
 <translation id="7638300388094655454">Google Cast</translation>
 <translation id="7638764766629234761">Verwendung von Systembenachrichtigungen zulassen</translation>
 <translation id="7642740497103044368">Wenn die Richtlinie aktiviert ist, dürfen Richtlinien, die mit einem verwalteten Konto verknüpft sind, zu Richtlinien auf Computerebene zusammengeführt werden.
@@ -10145,6 +10148,15 @@
 <translation id="8319678975002906774">Mit dieser Richtlinie legst du für bestimmte Ursprünge die Werte für die verwaltete Konfiguration fest</translation>
 <translation id="8320149248919453401">Akkulademodus</translation>
 <translation id="8320576119308783142">Bildschirmtastatur in passenden Situationen anzeigen.</translation>
+<translation id="8321089199245028304">Mit dieser Richtlinie wird die Bedienungshilfe „Mimik-Steuerung“ aktiviert. Wenn die Mimik-Steuerung aktiv ist, kannst du den Mauszeiger mit Kopfbewegungen steuern und Systemaktionen mit Gesichtsbewegungen ausführen. So kannst du dein Gerät steuern, ohne die Hände verwenden zu müssen.
+
+Wenn diese Richtlinie aktiviert ist, ist die Mimik-Steuerung immer aktiviert.
+
+Ist die Richtlinie deaktiviert, ist die Mimik-Steuerung immer deaktiviert.
+
+Wenn die Richtlinie konfiguriert ist, kann sie von Nutzern nicht geändert oder überschrieben werden.
+
+Ist die Richtlinie nicht konfiguriert, ist die Mimik-Steuerung anfangs deaktiviert, kann jedoch von Nutzern jederzeit aktiviert werden.</translation>
 <translation id="8327651196906278510">Tabaufnahme für diese Ursprünge zulassen</translation>
 <translation id="8329434144708110">Authentifizierungsabläufe für die Synchronisierung von Passwörtern auslösen</translation>
 <translation id="8329984337216493753">Diese Richtlinie ist nur im Händlermodus aktiv.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index ec27cb99a04..7a57cd7 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -8207,6 +8207,7 @@
 <translation id="6583473893541367102">Jika kebijakan ini disetel, artinya Anda menentukan daftar URL yang polanya cocok dengan asal keamanan URL yang meminta. Jika terdapat kecocokan, akses ke perangkat perekaman video akan diberikan tanpa permintaan izin
 
       Untuk informasi selengkapnya tentang pola <ph name="URL_LABEL" /> yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Namun, perlu diperhatikan bahwa pola "*", yang cocok dengan URL apa pun, tidak didukung oleh kebijakan ini.</translation>
+<translation id="6583517553738784213">Nonaktifkan fitur kontrol dengan wajah</translation>
 <translation id="6584122839583172231">Setelan F12 menggunakan pintasan yang berisi tombol pengubah ctrl dan shift</translation>
 <translation id="6584541828182430328">Nonaktifkan tampilkan peringatan layar penuh</translation>
 <translation id="6588634282328239769">Tampilkan URL lengkap</translation>
@@ -8525,6 +8526,7 @@
       Jika kebijakan disetel ke Nonaktif, ikon fitur eksperimental browser akan dihapus dari toolbar.
 
       chrome://flags dan cara lain untuk menonaktifkan dan mengaktifkan fitur browser akan tetap berperilaku sebagaimana mestinya terlepas dari apakah kebijakan ini disetel ke Aktif atau Nonaktif.</translation>
+<translation id="6794273802619210652">Mengaktifkan fitur aksesibilitas kontrol dengan wajah</translation>
 <translation id="6795485990775913659">Hanya izinkan pencetakan tanpa PIN</translation>
 <translation id="6796215185873669533">Mengembalikan setelan browser untuk versi string Agen Pengguna ke defaultnya.</translation>
 <translation id="6800181452282128474">Jangan kueri Server Quirks</translation>
@@ -9646,6 +9648,7 @@
 <translation id="7635106595080609261">Jika kebijakan disetel ke Aktif atau tidak disetel, Chrome akan dapat menampilkan dialog pemilihan file, dan pengguna dapat membukanya.
 
       Jika kebijakan disetel ke Nonaktif, pesan akan muncul setiap kali pengguna melakukan tindakan yang memicu dialog pemilihan file, seperti mengimpor bookmark, mengupload file, atau menyimpan link. Pengguna dianggap telah mengklik Batal pada dialog pemilihan file.</translation>
+<translation id="7637522465980672147">Aktifkan fitur kontrol dengan wajah</translation>
 <translation id="7638300388094655454">Google Cast</translation>
 <translation id="7638764766629234761">Izinkan penggunaan notifikasi sistem</translation>
 <translation id="7642740497103044368">Jika kebijakan ini disetel ke Aktif, kebijakan yang terkait dengan akun terkelola akan diizinkan untuk digabungkan ke kebijakan tingkat perangkat.
@@ -10604,6 +10607,17 @@
 <translation id="8319678975002906774">Menyetel nilai konfigurasi terkelola bagi situs untuk sumber tertentu</translation>
 <translation id="8320149248919453401">Mode pengisian daya baterai</translation>
 <translation id="8320576119308783142">Tampilkan keyboard virtual jika diperlukan.</translation>
+<translation id="8321089199245028304">Mengaktifkan fitur aksesibilitas kontrol dengan wajah. Jika fitur kontrol dengan wajah aktif, Anda
+dapat menggunakan kepala untuk mengontrol kursor mouse dan menggunakan gestur wajah untuk melakukan
+tindakan sistem. Hal ini memungkinkan Anda mengontrol perangkat secara handsfree.
+
+Jika kebijakan ini disetel ke aktif, fitur kontrol dengan wajah akan selalu diaktifkan.
+
+Jika kebijakan ini disetel ke nonaktif, fitur kontrol dengan wajah akan selalu dinonaktifkan.
+
+Jika kebijakan ini ditetapkan, pengguna tidak dapat mengubah atau menggantinya.
+
+Jika kebijakan ini tidak disetel, fitur kontrol dengan wajah mula-mula akan dinonaktifkan, tetapi dapat diaktifkan oleh pengguna kapan saja.</translation>
 <translation id="8327651196906278510">Mengizinkan tangkapan Tab berdasarkan asal berikut</translation>
 <translation id="8329434144708110">Picu alur autentikasi untuk menyinkronkan sandi dengan penyedia SSO</translation>
 <translation id="8329984337216493753">Kebijakan ini aktif dalam mode eceran saja.
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index 5dc05db8..5c08007 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -554,6 +554,12 @@
 <translation id="1417888712677507140">Blocca le finestre di dialogo JavaScript attivate da un diverso frame secondario di origine.</translation>
 <translation id="1418387035898607074">Salta i controlli di Navigazione sicura per i file scaricati da fonti attendibili</translation>
 <translation id="1419020637569060510">Aggiungi limitazioni all'utilizzo di un account gestito come account secondario su ChromeOS</translation>
+<translation id="1423359855587524289">Se la policy viene attivata o se non viene configurata, l'app può utilizzare
+l'autorizzazione delle notifiche "temporanee" di iOS per presentare le notifiche nel
+Centro notifiche di iOS.
+
+Se la policy viene disattivata, l'app non utilizzerà notifiche
+temporanee.</translation>
 <translation id="142346659686073702">Consenti agli utenti non affiliati di usare Crostini</translation>
 <translation id="1423900783955065155">Questa policy consente di stabilire se una pagina con l'intestazione <ph name="CACHE_CONTROL_NO_STORE_NAME" /> può essere memorizzata o meno nella cache back-forward. L'impostazione del sito web per questa intestazione potrebbe non prevedere il ripristino della pagina dalla cache back-forward perché alcune informazioni sensibili potrebbero essere ancora visualizzate dopo il ripristino, anche se non sono più accessibili.
 
@@ -9085,6 +9091,7 @@
 <translation id="7366637365754181686">Attiva il reporting su cloud degli indicatori di sicurezza utente</translation>
 <translation id="7366948865469126526">Disattiva conversione unità di Risposte rapide</translation>
 <translation id="7367734504783638685">Sincronizzazione delle password tra fornitori di servizi SSO di terze parti e dispositivi Chrome</translation>
+<translation id="7372818045062294211">Consenti all'app di utilizzare l'autorizzazione delle notifiche temporanee</translation>
 <translation id="7372831798009983116">Attiva la funzione di accessibilità di clic automatico</translation>
 <translation id="7373200034079131670">Riavvia all'uscita dell'utente se si avvia Android o una VM.</translation>
 <translation id="7374784840090523241">Imposta come predefinita la creazione di passkey in altri spazi di archiviazione, ad esempio il profilo <ph name="PRODUCT_NAME" />.</translation>
@@ -10442,6 +10449,7 @@
 <translation id="8421202694245456861">Configura la funzionalità per i sottotitoli di <ph name="CLASS_TOOLS_NAME" /></translation>
 <translation id="8422658829373743789">Gestisci il nuovo comportamento per l'esecuzione di eventi sui controlli dei moduli disattivati</translation>
 <translation id="8423237137411858515">Mantieni i file locali in modalità di sola lettura</translation>
+<translation id="8424056332208748750">Non consentire all'app di utilizzare l'autorizzazione delle notifiche temporanee</translation>
 <translation id="8424255554404582727">Imposta la rotazione predefinita dello schermo, riapplicata a ogni riavvio</translation>
 <translation id="8426231401662877819">Ruota lo schermo in senso orario di 90°</translation>
 <translation id="8426326725481825773">Questa policy determina il comportamento della rimappatura dei tasti Inizio/Fine
@@ -10584,6 +10592,7 @@
 <translation id="8520064498689833152">Viene forzato l'uso almeno del livello medio di SafeSearch nella Ricerca Google e nella Modalità con restrizioni di YouTube</translation>
 <translation id="8520950040439618600">Consenti metodi di autenticazione con PIN e accoppiamento per gli host di accesso remoto</translation>
 <translation id="8524334245528364388">URL per un file JSON con un elenco di server di stampa.</translation>
+<translation id="8525282442896658040">Consente all'app di utilizzare l'autorizzazione delle notifiche temporanee su iOS</translation>
 <translation id="8525526490824335042">Container Linux</translation>
 <translation id="8526745614158856826">La configurazione della policy consente di elencare i siti a cui viene concessa automaticamente l'autorizzazione di accesso a tutti i dispositivi disponibili.
 
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index d74ac76..7ae8eaa 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -529,6 +529,9 @@
 <translation id="1417888712677507140">異なる生成元のサブフレームからトリガーされた JavaScript ダイアログをブロックします。</translation>
 <translation id="1418387035898607074">信頼できる提供元からのファイルのダウンロードに対してセーフ ブラウジング チェックをスキップする</translation>
 <translation id="1419020637569060510">ChromeOS で予備のアカウントとして管理対象アカウントを使用することに対する制限を追加する</translation>
+<translation id="1423359855587524289">このポリシーを有効に設定するか未設定のままにした場合、アプリは iOS の「暫定的な」通知許可を使用して iOS 通知センターに通知を表示できます。
+
+このポリシーを無効に設定した場合、アプリは暫定的な通知を使用しません。</translation>
 <translation id="142346659686073702">外部のユーザーに Crostini の使用を許可する</translation>
 <translation id="1423900783955065155">このポリシーでは、<ph name="CACHE_CONTROL_NO_STORE_NAME" /> ヘッダーを含むページをバックフォワード キャッシュに保存できるかどうかを制御します。ウェブサイトがこのヘッダーを設定している場合、バックフォワード キャッシュからページが復元されることを求めていない可能性があります。この設定がなければ、機密情報がアクセスできないようにされていても、復元後に表示される可能性があるためです。
 
@@ -7565,6 +7568,7 @@
 <translation id="6583473893541367102">このポリシーでは、リクエスト元 URL のセキュリティ オリジンと照合する URL パターン リストを指定できます。一致するものについては、動画キャプチャ デバイスへのアクセスが許可されます。その際、確認のメッセージは表示されません。
 
       有効な <ph name="URL_LABEL" /> パターンについて詳しくは、https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns をご覧ください。任意の URL に一致するパターン「*」は、このポリシーではサポートされません。</translation>
+<translation id="6583517553738784213">フェイスナビを無効にする</translation>
 <translation id="6584122839583172231">F12 の設定で Ctrl と Shift の修飾キーを含むショートカットを使用する</translation>
 <translation id="6584541828182430328">全画面表示の警告を無効にする</translation>
 <translation id="6588634282328239769">完全な URL を表示する</translation>
@@ -7862,6 +7866,7 @@
       このポリシーを無効に設定した場合、ブラウザの試験運用版機能のアイコンはツールバーから削除されます。
 
       ブラウザの各種機能のオンとオフを切り替えるための chrome://flags やその他の方法は、このポリシーが有効か無効にかかわらず、引き続き想定どおりに動作します。</translation>
+<translation id="6794273802619210652">フェイスナビのユーザー補助機能を有効にする</translation>
 <translation id="6795485990775913659">PIN なしの印刷のみを許可します</translation>
 <translation id="6796215185873669533">ユーザー エージェント文字列のバージョンとしてブラウザ設定を使用する。</translation>
 <translation id="6800181452282128474">Quirks サーバーにクエリを送信しない</translation>
@@ -8584,6 +8589,7 @@
 <translation id="7366637365754181686">ユーザーのセキュリティ シグナルのクラウド レポートを有効にする</translation>
 <translation id="7366948865469126526">クイック アンサーの単位変換を無効にする</translation>
 <translation id="7367734504783638685">第三者 SSO プロバイダと複数の Chrome デバイスとの間でパスワードを同期する</translation>
+<translation id="7372818045062294211">アプリに暫定的な通知許可の使用を許可する</translation>
 <translation id="7372831798009983116">「自動クリック」のユーザー補助機能を有効にする</translation>
 <translation id="7373200034079131670">Android または VM が起動している場合、ユーザーのログアウト時に再起動する。</translation>
 <translation id="7374784840090523241">パスキーの作成にデフォルトで <ph name="PRODUCT_NAME" /> プロフィールなど他の場所を使用します。</translation>
@@ -8854,6 +8860,7 @@
 <translation id="7635106595080609261">このポリシーを有効に設定するか未設定のままにした場合、Chrome およびユーザーはファイル選択ダイアログを表示できます。
 
       このポリシーを無効に設定した場合、ユーザーがファイル選択ダイアログを表示する操作(ブックマークの読み込み、ファイルのアップロード、リンクの保存など)を行うと、代わりにメッセージが表示され、ユーザーがファイル選択ダイアログで [キャンセル] をクリックした操作と同じ結果になります。</translation>
+<translation id="7637522465980672147">フェイスナビを有効にする</translation>
 <translation id="7638300388094655454">Google Cast</translation>
 <translation id="7638764766629234761">システム通知の使用を許可する</translation>
 <translation id="7642740497103044368">このポリシーを有効に設定した場合、管理対象アカウントに関連付けられているポリシーをマシンレベルのポリシーに統合できます。
@@ -9758,6 +9765,15 @@
 <translation id="8319678975002906774">Managed Configuration API で特定のオリジンのウェブサイトに返す値を設定します</translation>
 <translation id="8320149248919453401">バッテリー充電モード</translation>
 <translation id="8320576119308783142">必要に応じて画面キーボードを表示する。</translation>
+<translation id="8321089199245028304">フェイスナビのユーザー補助機能を有効にします。フェイスナビを有効にすると、頭の動きでマウスカーソルを制御したり、顔の動きでシステムを操作したりできます。これにより、デバイスをハンズフリーで操作できます。
+
+このポリシーを有効に設定した場合、フェイスナビは常に有効になります。
+
+このポリシーを無効に設定した場合、フェイスナビは常に無効になります。
+
+このポリシーを設定した場合、ユーザーが設定を変更またはオーバーライドすることはできません。
+
+このポリシーを未設定のままにした場合、フェイスナビは初期設定で無効になりますが、ユーザーはいつでも有効にできます。</translation>
 <translation id="8327651196906278510">指定オリジンによるタブキャプチャを許可する</translation>
 <translation id="8329434144708110">認証フローをトリガーしてパスワードを SSO プロバイダと同期する</translation>
 <translation id="8329984337216493753">このポリシーは小売りモードでのみアクティブになります。
@@ -9882,6 +9898,7 @@
 <translation id="8421202694245456861"><ph name="CLASS_TOOLS_NAME" /> の文字起こし機能の設定</translation>
 <translation id="8422658829373743789">無効化されたフォーム コントロールでのイベントのディスパッチに関する新しい動作を管理する</translation>
 <translation id="8423237137411858515">ローカル ファイルを読み取り専用モードのままにする</translation>
+<translation id="8424056332208748750">アプリに暫定的な通知許可の使用を許可しない</translation>
 <translation id="8424255554404582727">再起動のたびにデフォルトのディスプレイ回転方法を再適用する</translation>
 <translation id="8426231401662877819">画面を時計回りに 90 度回転</translation>
 <translation id="8426326725481825773">このポリシーでは、[キーの割り当て変更] サブページ内での Home / End キーの割り当て変更の動作を指定します。[キーの割り当て変更] サブページでは、ユーザーがキーボードのキーをカスタマイズできます。このポリシーを有効にした場合、ユーザーはこれらの特定の割り当て変更をカスタマイズできなくなります。このポリシーを未設定のままにした場合、検索キーを使用したショートカットがデフォルトとして機能し、ユーザーはショートカットを設定できます。</translation>
@@ -10022,6 +10039,7 @@
 <translation id="8520064498689833152">Google 検索と YouTube の制限付きモードで「中」以上のセーフサーチを強制的に適用する</translation>
 <translation id="8520950040439618600">リモート アクセスホストに PIN 認証方式とペア設定認証方式を許可する</translation>
 <translation id="8524334245528364388">プリント サーバーのリストを記載した JSON ファイルの URL です。</translation>
+<translation id="8525282442896658040">iOS で暫定的な通知許可を使用することをアプリに許可する</translation>
 <translation id="8525526490824335042">Linux コンテナ</translation>
 <translation id="8526745614158856826">このポリシーでは、使用可能なすべてのデバイスへのアクセスを自動的に許可するサイトのリストを指定できます。必ず有効な URL を指定してください。無効な URL を指定した場合、このポリシーは無視されます。URL のオリジン(スキーム、ホストとポート)のみが考慮されます。ChromeOS 上で、このポリシーは関連のあるユーザーにのみ適用されます。このポリシーは、<ph name="DEFAULT_WEB_HID_GUARD_SETTING_POLICY_NAME" />、<ph name="WEB_HID_ASK_FOR_URLS_POLICY_NAME" />、<ph name="WEB_HID_BLOCKED_FOR_URLS_POLICY_NAME" />、ユーザーの設定をオーバーライドします。</translation>
 <translation id="8528951285051082869">File Handling API を通じてファイル形式にアクセスすることをウェブアプリに許可しない</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index 223769cf..a385920 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -7950,6 +7950,7 @@
 <translation id="6583473893541367102">정책을 설정하면 URL 목록에 지정한 URL 패턴이 요청 URL의 보안 원본과 비교됩니다. 비교 후 일치 여부가 확인되면 동영상 캡처 기기에 액세스 권한이 부여되며 프롬프트가 표시되지 않습니다.
 
       유효한 <ph name="URL_LABEL" /> 패턴에 관해 자세히 알아보려면 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns를 참고하세요. 하지만 모든 URL과 일치하는 '*' 패턴은 이 정책에서 지원되지 않습니다.</translation>
+<translation id="6583517553738784213">페이스 컨트롤 사용 중지</translation>
 <translation id="6584122839583172231">F12 설정은 Ctrl 및 Shift 수정자가 포함된 단축키를 사용합니다.</translation>
 <translation id="6584541828182430328">전체 화면 알림 표시 사용 중지</translation>
 <translation id="6588634282328239769">전체 URL 표시</translation>
@@ -8268,6 +8269,7 @@
 정책을 '사용 안함'으로 설정하면 브라우저 실험 기능 아이콘이 툴바에서 삭제됩니다.
 
       chrome://flags 및 브라우저 기능을 사용 설정/중지하는 기타 수단은 정책의 '사용' 또는 '사용 안함' 여부와 관계없이 정상적으로 작동합니다.</translation>
+<translation id="6794273802619210652">페이스 컨트롤 접근성 기능 사용 설정</translation>
 <translation id="6795485990775913659">PIN이 없으면 인쇄만 허용</translation>
 <translation id="6796215185873669533">사용자 에이전트 문자열 버전의 브라우저 설정을 기본값으로 설정합니다.</translation>
 <translation id="6800181452282128474">Quirks 서버 쿼리 안함</translation>
@@ -9367,6 +9369,7 @@
 <translation id="7635106595080609261">이 정책을 사용 설정하거나 설정하지 않으면 Chrome에서 파일 선택 대화상자를 표시하고, 사용자가 열 수 있게 됩니다.
 
       정책을 사용 중지하면 사용자가 파일 선택 대화상자를 불러오는 작업을 할 때(예: 북마크 가져오기, 파일 업로드, 링크 저장 등)마다 메시지가 표시됩니다. 사용자가 파일 선택 대화상자에서 '취소'를 클릭한 것으로 간주됩니다.</translation>
+<translation id="7637522465980672147">페이스 컨트롤 사용 설정</translation>
 <translation id="7638300388094655454">Google Cast</translation>
 <translation id="7638764766629234761">시스템 알림 사용 허용</translation>
 <translation id="7642740497103044368">정책을 사용으로 설정하면 관리 계정과 연결된 정책을 시스템 수준 정책에 병합할 수 있습니다.
@@ -10290,6 +10293,17 @@
 <translation id="8319678975002906774">특정 웹사이트에 대한 관리형 구성을 특정 원본으로 설정합니다.</translation>
 <translation id="8320149248919453401">배터리 충전 모드</translation>
 <translation id="8320576119308783142">필요한 경우 터치 키보드를 표시합니다.</translation>
+<translation id="8321089199245028304">페이스 컨트롤 접근성 기능을 사용 설정합니다. 페이스 컨트롤이 활성화된 경우
+고개를 돌려 마우스 커서를 제어하고 얼굴 동작으로 시스템 작업을
+수행할 수 있습니다. 이 정책을 통해 핸즈프리로 기기를 제어할 수 있습니다.
+
+정책이 사용 설정되면 페이스 컨트롤이 항상 사용 설정됩니다.
+
+정책이 사용 중지되면 페이스 컨트롤이 항상 사용 중지됩니다.
+
+이 정책을 설정하면 사용자가 변경하거나 재정의할 수 없습니다.
+
+정책을 설정하지 않으면 페이스 컨트롤이 기본적으로 사용 중지되지만, 사용자는 언제든지 페이스 컨트롤을 사용 설정할 수 있습니다.</translation>
 <translation id="8327651196906278510">출처의 탭 캡처 허용</translation>
 <translation id="8329434144708110">SSO 제공업체와 비밀번호를 동기화할 수 있도록 인증 과정 트리거</translation>
 <translation id="8329984337216493753">이 정책은 판매 모드일 때만 사용할 수 있습니다.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index d0092c40..8e5306916 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -7869,6 +7869,7 @@
 <translation id="6583473893541367102">Чтобы задать это правило, нужно указать список URL, шаблоны которых будут сопоставляться с источником безопасности URL, запрашивающего доступ. В случае совпадения доступ видеозаписывающим устройствам будет предоставляться без запроса.
 
 Узнать больше о допустимых шаблонах <ph name="URL_LABEL" /> можно на странице https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Обратите внимание, что шаблон "*", соответствующий любому URL, не поддерживается для этого правила.</translation>
+<translation id="6583517553738784213">Отключить управление мимикой</translation>
 <translation id="6584122839583172231">Для вызова функции клавиши F12 используется сочетание клавиш с модификаторами Ctrl и Shift</translation>
 <translation id="6584541828182430328">Не показывать предупреждение о выходе из полноэкранного режима</translation>
 <translation id="6588634282328239769">Показывать полный URL</translation>
@@ -8175,6 +8176,7 @@
       Если правило отключено, значок экспериментальных функций на панели инструментов не показывается.
 
       Независимо от того, включено или отключено правило, chrome://flags и другие способы включения и отключения функций браузера будут работать как обычно.</translation>
+<translation id="6794273802619210652">Включение специальной возможности управления мимикой</translation>
 <translation id="6795485990775913659">Разрешить печать только без ввода PIN-кода</translation>
 <translation id="6796215185873669533">Использовать настройки браузера для указания версии в строке агента пользователя</translation>
 <translation id="6800181452282128474">Запретить отправку запросов на Quirks Server</translation>
@@ -9246,6 +9248,7 @@
 <translation id="7635106595080609261">Если это правило включено или не настроено, то пользователи смогут открывать в Chrome окна выбора файлов.
 
       Если правило отключено и пользователь выполняет действия, для которых нужно открыть окно выбора файлов (например, импортирует закладки, загружает файлы, сохраняет ссылки и т. д.), вместо окна отображается сообщение и предполагается, что пользователь нажал кнопку "Отмена" в окне выбора файлов.</translation>
+<translation id="7637522465980672147">Включить управление мимикой</translation>
 <translation id="7638300388094655454">Google Cast</translation>
 <translation id="7638764766629234761">Разрешить использование системных уведомлений</translation>
 <translation id="7642740497103044368">Если правило включено, правила, связанные с управляемым аккаунтом, могут быть объединены с правилами на уровне устройств.
@@ -10179,6 +10182,15 @@
 <translation id="8319678975002906774">Устанавливает значения управляемой конфигурации для сайтов, соответствующих заданным источникам</translation>
 <translation id="8320149248919453401">Режим заряда батареи</translation>
 <translation id="8320576119308783142">При необходимости открывать экранную клавиатуру</translation>
+<translation id="8321089199245028304">Позволяет включить специальную возможность управления мимикой. Когда она активна, вы можете перемещать указатель мыши движениями головы и использовать мимические жесты для выполнения системных действий. Это позволяет бесконтактно управлять устройством.
+
+Если правило включено, управление мимикой всегда активно.
+
+При отключенном правиле управление мимикой не работает.
+
+Если правило настроено, пользователи не могут изменить или переопределить его.
+
+Если оно не настроено, управление мимикой по умолчанию отключено, но пользователи могут включить его в любое время.</translation>
 <translation id="8327651196906278510">Разрешить захват вкладки этими источниками</translation>
 <translation id="8329434144708110">Запускать процесс аутентификации для синхронизации паролей, хранящихся у сторонних поставщиков услуг единого входа</translation>
 <translation id="8329984337216493753">Эти правила действуют только в коммерческой версии.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index 8fe1e035..604a1291 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -7829,6 +7829,7 @@
 <translation id="6583473893541367102">การตั้งค่านโยบายนี้เป็นการระบุรายการ URL ที่จะมีการจับคู่รูปแบบกับต้นทางการรักษาความปลอดภัยของ URL ที่ขอ หากรูปแบบตรงกัน ระบบจะให้สิทธิ์เข้าถึงอุปกรณ์จับภาพวิดีโอโดยไม่แสดงข้อความแจ้ง
 
       ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ <ph name="URL_LABEL" /> ที่ถูกต้องได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns อย่างไรก็ตาม โปรดทราบว่านโยบายนี้ไม่รองรับรูปแบบ "*" ที่ตรงกับ URL ใดก็ตาม</translation>
+<translation id="6583517553738784213">ปิดใช้การควบคุมด้วยใบหน้า</translation>
 <translation id="6584122839583172231">การตั้งค่า F12 ใช้แป้นพิมพ์ลัดที่มีแป้นกดร่วม Ctrl และ Shift</translation>
 <translation id="6584541828182430328">ปิดใช้การแสดงการแจ้งเตือนโหมดเต็มหน้าจอ</translation>
 <translation id="6588634282328239769">แสดง URL แบบเต็ม</translation>
@@ -8135,6 +8136,7 @@
       การตั้งค่านโยบายเป็น "ปิดใช้" จะนำไอคอนฟีเจอร์ทดลองของเบราว์เซอร์ออกจากแถบเครื่องมือ
 
       การใช้ chrome://flags รวมถึงการปิดและเปิดฟีเจอร์ของเบราว์เซอร์ด้วยวิธีการอื่นใดจะยังคงมีลักษณะการทำงานตามที่คาดไว้ไม่ว่าจะมีการ "เปิดใช้" หรือ "ปิดใช้" นโยบายนี้</translation>
+<translation id="6794273802619210652">เปิดใช้ฟีเจอร์การช่วยเหลือพิเศษสำหรับการควบคุมด้วยใบหน้า</translation>
 <translation id="6795485990775913659">อนุญาตให้พิมพ์เท่านั้นเมื่อไม่มี PIN</translation>
 <translation id="6796215185873669533">ใช้การตั้งค่าเบราว์เซอร์เป็นค่าเริ่มต้นสำหรับเวอร์ชันสตริงของ User-Agent</translation>
 <translation id="6800181452282128474">ไม่ส่งคำค้นหาไปยังเซิร์ฟเวอร์ Quirks</translation>
@@ -9201,6 +9203,7 @@
 <translation id="7635106595080609261">การตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ตั้งค่าจะทำให้ Chrome แสดงผลได้ และผู้ใช้จะเปิดกล่องโต้ตอบสำหรับการเลือกไฟล์ได้
 
       การตั้งค่านโยบายเป็น "ปิดใช้" หมายความว่าเมื่อผู้ใช้ดำเนินการที่เรียกใช้กล่องโต้ตอบสำหรับการเลือกไฟล์ เช่น การนำเข้าบุ๊กมาร์ก การอัปโหลดไฟล์ และการบันทึกลิงก์ จะมีข้อความปรากฏขึ้นแทน โดยถือว่าผู้ใช้ได้คลิก "ยกเลิก" ในกล่องโต้ตอบสำหรับการเลือกไฟล์ไว้</translation>
+<translation id="7637522465980672147">เปิดใช้การควบคุมด้วยใบหน้า</translation>
 <translation id="7638300388094655454">Google Cast</translation>
 <translation id="7638764766629234761">อนุญาตให้ใช้การแจ้งเตือนของระบบ</translation>
 <translation id="7642740497103044368">การตั้งค่านโยบายเป็น "เปิดใช้" จะอนุญาตให้นโยบายที่เกี่ยวข้องกับบัญชีที่จัดการสามารถผสานเข้ากับนโยบายระดับเครื่องได้
@@ -10116,6 +10119,15 @@
 <translation id="8319678975002906774">ตั้งค่าการกำหนดค่าที่มีการจัดการสำหรับต้นทางที่เจาะจงของเว็บไซต์</translation>
 <translation id="8320149248919453401">โหมดการชาร์จแบตเตอรี่</translation>
 <translation id="8320576119308783142">แสดงแป้นพิมพ์บนหน้าจอตามความเหมาะสม</translation>
+<translation id="8321089199245028304">เปิดใช้ฟีเจอร์การช่วยเหลือพิเศษสำหรับการควบคุมด้วยใบหน้า เมื่อการควบคุมด้วยใบหน้าทำงานอยู่ คุณจะใช้ศีรษะควบคุมเคอร์เซอร์เมาส์และใช้การแสดงสีหน้าเพื่อดำเนินการต่างๆ ของระบบได้ การดำเนินการนี้ช่วยให้คุณควบคุมอุปกรณ์ได้โดยไม่ต้องสัมผัส
+
+หากตั้งค่านโยบายนี้เป็นเปิดใช้ ระบบจะเปิดใช้การควบคุมด้วยใบหน้าไว้เสมอ
+
+หากตั้งค่านโยบายนี้เป็นปิดใช้ ระบบจะปิดใช้การควบคุมด้วยใบหน้าเอาไว้
+
+หากตั้งค่านโยบายนี้ ผู้ใช้จะเปลี่ยนหรือลบล้างไม่ได้
+
+หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะปิดใช้การควบคุมด้วยใบหน้าในขั้นต้น แต่ผู้ใช้เปิดใช้ได้ทุกเมื่อ</translation>
 <translation id="8327651196906278510">อนุญาตให้ต้นทางเหล่านี้จับภาพแท็บ</translation>
 <translation id="8329434144708110">เรียกใช้โฟลว์การตรวจสอบสิทธิ์เพื่อซิงค์รหัสผ่านกับผู้ให้บริการ SSO</translation>
 <translation id="8329984337216493753">นโยบายนี้ใช้งานได้ในโหมดปลีกเท่านั้น
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index c481f09..35756ea4 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -538,6 +538,9 @@
 <translation id="1417888712677507140">屏蔽从其他来源的子框架触发的 JavaScript 对话框。</translation>
 <translation id="1418387035898607074">不对从可信来源下载的文件执行安全浏览检查</translation>
 <translation id="1419020637569060510">针对在 Chrome 操作系统中将受管理的账号用作辅助账号的情况添加限制</translation>
+<translation id="1423359855587524289">如果此政策已启用或未设置,该应用可能会使用 iOS 的“临时”通知授权在 iOS 通知中心中显示通知。
+
+如果此政策已停用,该应用将不会使用临时通知。</translation>
 <translation id="142346659686073702">允许独立用户使用 Crostini</translation>
 <translation id="1423900783955065155">此政策旨在控制是否可将具有“<ph name="CACHE_CONTROL_NO_STORE_NAME" />”标头的网页储存在往返缓存中。设置了此标头的网站可能不希望从往返缓存中恢复相应网页,因为即使页面不再可访问,一些敏感信息仍然可能被显示出来。
 
@@ -1219,6 +1222,7 @@
 
 对于 <ph name="PRODUCT_NAME" />,此政策仅在已使用 <ph name="CLOUD_MANAGEMENT_ENROLLMENT_TOKEN" /> 注册相应设备后才有效。
 对于 <ph name="PRODUCT_OS_NAME" />,此政策一直有效。</translation>
+<translation id="187961648719201562">删除现有本地文件(自 137 版起受支持)</translation>
 <translation id="1883274744253492031">允许混合内容自动升级</translation>
 <translation id="1885782360784839335">允许使用整个标签页显示宣传内容</translation>
 <translation id="1888871729456797026">云政策在桌面设备上的注册令牌</translation>
@@ -6705,6 +6709,9 @@
 <translation id="5883754873839596178">通过设置此政策,您可以指定可同时连接到代理服务器的连接数上限。某些代理服务器无法处理由同一客户端同时发出的大量连接,您只需将此政策设为较小的值即可解决该问题。此政策的值应大于 6 且小于 100。众所周知,某些 Web 应用采用了挂起 GET,这样会消耗大量连接,因此如果打开的此类 Web 应用过多,将政策值设为小于 32 就可能会导致浏览器网络连接挂起。如果所设的政策值小于默认值,您需自担风险。
 
       如果您未设置此政策,系统将使用默认值 32。</translation>
+<translation id="5886280631293123880">此政策旨在让您临时重新启用一组已弃用和已移除的平台事件,这些事件称为“变更事件”。
+如果已启用此政策,系统会继续触发变更事件,即使已针对普通网络用户默认停用变更事件也是如此。如果已停用或未设置此政策,这些事件可能无法触发。
+此政策是一种临时的变通方案,在 M137 中将不再有效。</translation>
 <translation id="5887414688706570295">配置供远程访问主机使用的 TalkGadget 前缀,并禁止用户更改此设置。
 
           如果指定的话,该前缀将附加到 TalkGadge 基本名称之前,两者共同构成 TalkGadget 的完整域名。TalkGadget 基本域名为.talkgadget.google.com。
@@ -7802,6 +7809,7 @@
 <translation id="6583473893541367102">通过设置此政策,您可以指定一个网址列表,在其中列出与请求网址的安全源匹配的网址格式。如果找到了匹配项,系统会在不提示用户的情况下直接允许相应网址使用录像设备
 
       如需详细了解有效的 <ph name="URL_LABEL" /> 格式,请访问 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。但请注意,此政策不支持与任何网址匹配的“*”格式。</translation>
+<translation id="6583517553738784213">停用人脸操控</translation>
 <translation id="6584122839583172231">F12 设置使用包含 Ctrl 和 Shift 辅助键的快捷键</translation>
 <translation id="6584541828182430328">停用“显示全屏提醒”功能</translation>
 <translation id="6588634282328239769">显示完整网址</translation>
@@ -8108,6 +8116,7 @@
       如果此政策已停用,系统会从工具栏中移除浏览器实验性功能图标。
 
       无论此政策是已启用还是已停用,chrome://flags 和任何其他可用于开启和关闭浏览器功能的方法都能正常起作用。</translation>
+<translation id="6794273802619210652">启用人脸操控无障碍功能</translation>
 <translation id="6795485990775913659">仅允许在没有 PIN 码的情况下打印</translation>
 <translation id="6796215185873669533">将 User-Agent 字符串版本默认设为浏览器设置。</translation>
 <translation id="6800181452282128474">不向 Quirks Server 发送查询</translation>
@@ -8227,6 +8236,21 @@
 
 此政策取代了已弃用的 <ph name="WINDOW_PLACEMENT_ALLOWED_FOR_URLS_POLICY_NAME" /> 政策。</translation>
 <translation id="6894178810167845842">在新标签页中打开的页面网址</translation>
+<translation id="6895437634974956885">电池健康度可能会受到频繁充满电和充电时间过长等因素的影响。此政策提供三种选项,旨在优化充电行为并减轻这些因素的影响,最终延长电池寿命。
+
+如果您未设置此政策,用户可以使用“自适应充电”切换按钮来启用/停用“自适应充电”功能。
+
+如果此政策设为“1 - 标准”或未设置,电池会正常充电至 100%。这会停用自适应充电和受限充电模式。
+
+如果此政策设为“2 - 自适应”,设备会了解您的充电习惯,并视情况推迟将设备充满电的时间。这种机制有助于改善电池健康度。
+
+如果此政策设为“3 - 受限”,电池只会充电至 80% 左右,以最大限度延长其使用寿命。
+
+如果已设置 <ph name="DEVICE_POWER_BATTERY_CHARGING_OPTIMIZATION_POLICY_NAME" /> 政策,则它优先于 <ph name="DEVICE_POWER_ADAPTIVE_CHARGING_ENABLED_POLICY_NAME" /> 政策。
+
+如果未设置 <ph name="DEVICE_POWER_BATTERY_CHARGING_OPTIMIZATION_POLICY_NAME" /> 政策,则 <ph name="DEVICE_POWER_ADAPTIVE_CHARGING_ENABLED_POLICY_NAME" /> 政策会控制是否启用自适应充电功能。
+
+<ph name="DEVICE_POWER_ADAPTIVE_CHARGING_ENABLED_POLICY_NAME" /> 将被弃用。</translation>
 <translation id="6897730193187922386">禁止显示 <ph name="CLOUD_PRINT_NAME" />弃用消息</translation>
 <translation id="6899705656741990703">自动检测代理设置</translation>
 <translation id="6901462246839613666">允许显示推广内容</translation>
@@ -8882,6 +8906,7 @@
 <translation id="7366637365754181686">启用用户安全信号云报告功能</translation>
 <translation id="7366948865469126526">停用快速解答单位换算功能</translation>
 <translation id="7367734504783638685">第三方 SSO 提供商和 Chrome 设备之间的密码同步</translation>
+<translation id="7372818045062294211">允许该应用使用临时通知授权</translation>
 <translation id="7372831798009983116">启用“自动点击”无障碍功能</translation>
 <translation id="7373200034079131670">在用户退出后重新启动(如果 Android 或虚拟机已启动)。</translation>
 <translation id="7374784840090523241">默认在其他存储区(例如 <ph name="PRODUCT_NAME" /> 个人资料)中创建通行密钥。</translation>
@@ -9172,6 +9197,7 @@
 <translation id="7635106595080609261">如果此政策已启用或未设置,Chrome 便可显示文件选择对话框,而且用户可以打开这些对话框。
 
       如果此政策已停用,那么只要用户执行了会触发文件选择对话框的操作(例如导入书签、上传文件、保存链接,等等),系统就会显示一条消息,并会假定用户已在文件选择对话框中点击了“取消”。</translation>
+<translation id="7637522465980672147">启用人脸操控</translation>
 <translation id="7638300388094655454">Google Cast</translation>
 <translation id="7638764766629234761">允许使用系统通知</translation>
 <translation id="7642740497103044368">如果已启用此政策,与受管理的账号关联的政策便可被合并到计算机级政策中。
@@ -10082,6 +10108,15 @@
 <translation id="8319678975002906774">为特定来源的网站设定受管理配置值</translation>
 <translation id="8320149248919453401">电池充电模式</translation>
 <translation id="8320576119308783142">在适当的时候显示屏幕键盘。</translation>
+<translation id="8321089199245028304">启用人脸操控无障碍功能。当人脸操控功能处于启用状态时,您可以使用头部动作控制鼠标光标,并使用面部动作执行系统操作。这样,您无需动手即可控制设备。
+
+如果此政策已启用,人脸操控功能将始终处于启用状态。
+
+如果此政策已停用,人脸操控功能将始终处于停用状态。
+
+如果您设置此政策,用户便无法对其进行更改或覆盖。
+
+如果未设置此政策,人脸操控功能最初会处于停用状态,但用户可以随时启用该功能。</translation>
 <translation id="8327651196906278510">允许这些来源使用标签页截取功能</translation>
 <translation id="8329434144708110">触发身份验证流程,以便与 SSO 提供商同步密码</translation>
 <translation id="8329984337216493753">此政策仅在零售模式下有效。
@@ -10206,6 +10241,7 @@
 <translation id="8421202694245456861">配置“<ph name="CLASS_TOOLS_NAME" />”的字幕功能</translation>
 <translation id="8422658829373743789">控制针对已停用的表单控件分派事件的新行为</translation>
 <translation id="8423237137411858515">本地文件保持只读模式</translation>
+<translation id="8424056332208748750">不允许该应用使用临时通知授权</translation>
 <translation id="8424255554404582727">设置显示屏默认旋转角度,每次重新启动后都重新应用设置的角度</translation>
 <translation id="8426231401662877819">将屏幕顺时针旋转 90 度</translation>
 <translation id="8426326725481825773">此政策可决定在“重新映射按键”子页面中重新映射 Home/End 键的行为。用户可以在“重新映射按键”子页面自定义键盘按键。如果启用,此政策会阻止用户自定义这些特定的重新映射。如果未设置此政策,基于搜索键的快捷键将作为默认设置,并允许用户配置快捷键。</translation>
@@ -10343,6 +10379,7 @@
 <translation id="8520064498689833152">强制在 Google 搜索中使用级别至少为“中等”的安全搜索功能,也强制使用级别至少为“中等”的 YouTube 受限模式</translation>
 <translation id="8520950040439618600">允许远程访问主机使用 PIN 码和配对身份验证方法</translation>
 <translation id="8524334245528364388">包含一系列打印服务器的 JSON 文件的网址。</translation>
+<translation id="8525282442896658040">允许该应用在 iOS 上使用临时通知授权</translation>
 <translation id="8525526490824335042">Linux 容器</translation>
 <translation id="8526745614158856826">通过设置此政策,您可以罗列一些网址,从而指定自动授权哪些网站访问所有可用的设备。
 
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index 52b2926..2dc1b93 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -7695,6 +7695,7 @@
 <translation id="6583473893541367102">你可以透過這項政策指定網址清單,系統會將清單中的模式與要求網址的安全性來源進行比對。如果相符,系統會直接授予影片擷取裝置存取權限,不會顯示提示
 
       如要進一步瞭解有效的<ph name="URL_LABEL" />模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。不過請注意,這項政策不支援用「*」模式比對網址。</translation>
+<translation id="6583517553738784213">停用人臉操控功能</translation>
 <translation id="6584122839583172231">F12 設定採用含有 Ctrl 和 Shift 輔助鍵的快速鍵</translation>
 <translation id="6584541828182430328">停用顯示全螢幕警示的功能</translation>
 <translation id="6588634282328239769">顯示完整網址</translation>
@@ -8000,6 +8001,7 @@
       如果將這項政策設為停用,則會從工具列中移除瀏覽器實驗功能圖示。
 
       無論這項政策設為啟用或停用,chrome://flags 和其他開啟/關閉瀏覽器功能的方法都能正常運作。</translation>
+<translation id="6794273802619210652">啟用人臉操控無障礙功能</translation>
 <translation id="6795485990775913659">只在 PIN 碼停用時允許列印</translation>
 <translation id="6796215185873669533">將 User-Agent 字串版本預設為瀏覽器設定值。</translation>
 <translation id="6800181452282128474">不向 Quirks Server 發送查詢</translation>
@@ -9047,6 +9049,7 @@
 <translation id="7635106595080609261">如果將這項政策設為啟用或不設定,Chrome 可以顯示檔案選取對話方塊,使用者也可以開啟檔案選取對話方塊。
 
       如果將這項政策設為停用,只要使用者執行會開啟檔案選取對話方塊的動作 (例如匯入書籤、上傳檔案、儲存連結等),螢幕上就會改為顯示訊息。系統會視同使用者已按下檔案選取對話方塊上的 [取消]。</translation>
+<translation id="7637522465980672147">啟用人臉操控</translation>
 <translation id="7638300388094655454">Google Cast</translation>
 <translation id="7638764766629234761">允許使用系統通知</translation>
 <translation id="7642740497103044368">如果將這項政策設為啟用,與代管帳戶相關的政策就會合併到裝置層級政策。
@@ -9945,6 +9948,15 @@
 <translation id="8319678975002906774">設定要傳回指定來源網站的控管型設定值</translation>
 <translation id="8320149248919453401">充電模式</translation>
 <translation id="8320576119308783142">在適用情況顯示螢幕小鍵盤。</translation>
+<translation id="8321089199245028304">啟用人臉操控無障礙功能。人臉操控功能啟用後,就能用頭部控制滑鼠游標,並透過臉部表情執行系統動作,不必動手就能控制裝置。
+
+如果將這項政策設為啟用,系統就會一律啟用人臉操控功能。
+
+如果將這項政策設為停用,這項功能就會一律停用。
+
+設好這項政策後,使用者無法變更或覆寫設定。
+
+如果未設定這項政策,系統預設會停用人臉操控功能,但使用者隨時可以啟用。</translation>
 <translation id="8327651196906278510">依這些來源允許執行分頁擷取功能</translation>
 <translation id="8329434144708110">觸發驗證流程,藉此與單一登入 (SSO) 服務供應商同步處理密碼</translation>
 <translation id="8329984337216493753">這項政策只會在零售模式下啟用。
diff --git a/components/policy/resources/templates/policy_definitions/GenerativeAI/TabOrganizerSettings.yaml b/components/policy/resources/templates/policy_definitions/GenerativeAI/TabOrganizerSettings.yaml
index 7c6f182..fc4f462 100644
--- a/components/policy/resources/templates/policy_definitions/GenerativeAI/TabOrganizerSettings.yaml
+++ b/components/policy/resources/templates/policy_definitions/GenerativeAI/TabOrganizerSettings.yaml
@@ -1,5 +1,5 @@
 caption: Settings for Tab Organizer
-
+deprecated: true
 desc: |-
   Tab Organizer is an AI-based tool that automatically creates tab groups based on a user's open tabs. Suggestions are based on open tabs (but not page content).
 
@@ -39,7 +39,7 @@
 tags:
 - google-sharing
 supported_on:
-- chrome.*:121-
-- chrome_os:121-
+- chrome.*:121-136
+- chrome_os:121-136
 tags: []
 type: int-enum
diff --git a/components/policy/test/data/pref_mapping/GenAiDefaultSettings.json b/components/policy/test/data/pref_mapping/GenAiDefaultSettings.json
index b792b03..5e80e6eb 100644
--- a/components/policy/test/data/pref_mapping/GenAiDefaultSettings.json
+++ b/components/policy/test/data/pref_mapping/GenAiDefaultSettings.json
@@ -26,9 +26,6 @@
           "optimization_guide.model_execution.tab_compare_settings_enterprise_policy": {
             "value": 0
           },
-          "optimization_guide.model_execution.tab_organization_enterprise_policy_allowed": {
-            "value": 0
-          },
           "optimization_guide.model_execution.wallpaper_search_enterprise_policy_allowed": {
             "value": 0
           }
@@ -54,9 +51,6 @@
           "optimization_guide.model_execution.tab_compare_settings_enterprise_policy": {
             "value": 1
           },
-          "optimization_guide.model_execution.tab_organization_enterprise_policy_allowed": {
-            "value": 1
-          },
           "optimization_guide.model_execution.wallpaper_search_enterprise_policy_allowed": {
             "value": 1
           }
@@ -82,9 +76,6 @@
           "optimization_guide.model_execution.tab_compare_settings_enterprise_policy": {
             "value": 2
           },
-          "optimization_guide.model_execution.tab_organization_enterprise_policy_allowed": {
-            "value": 2
-          },
           "optimization_guide.model_execution.wallpaper_search_enterprise_policy_allowed": {
             "value": 2
           }
@@ -108,9 +99,6 @@
           "optimization_guide.model_execution.tab_compare_settings_enterprise_policy": {
             "default_value": 0
           },
-          "optimization_guide.model_execution.tab_organization_enterprise_policy_allowed": {
-            "default_value": 0
-          },
           "optimization_guide.model_execution.wallpaper_search_enterprise_policy_allowed": {
             "default_value": 0
           }
@@ -124,8 +112,7 @@
           "DevToolsGenAiSettings": 2,
           "HelpMeWriteSettings": 2,
           "HistorySearchSettings": 2,
-          "TabCompareSettings": 2,
-          "TabOrganizerSettings": 2
+          "TabCompareSettings": 2
         },
         "prefs": {
           "devtools.gen_ai_settings": {
@@ -143,9 +130,6 @@
           "optimization_guide.model_execution.tab_compare_settings_enterprise_policy": {
             "value": 2
           },
-          "optimization_guide.model_execution.tab_organization_enterprise_policy_allowed": {
-            "value": 2
-          },
           "optimization_guide.model_execution.wallpaper_search_enterprise_policy_allowed": {
             "value": 2
           }
@@ -193,9 +177,6 @@
           "optimization_guide.model_execution.tab_compare_settings_enterprise_policy": {
             "value": 0
           },
-          "optimization_guide.model_execution.tab_organization_enterprise_policy_allowed": {
-            "value": 0
-          },
           "optimization_guide.model_execution.wallpaper_search_enterprise_policy_allowed": {
             "value": 0
           },
@@ -243,9 +224,6 @@
           "optimization_guide.model_execution.tab_compare_settings_enterprise_policy": {
             "value": 1
           },
-          "optimization_guide.model_execution.tab_organization_enterprise_policy_allowed": {
-            "value": 1
-          },
           "optimization_guide.model_execution.wallpaper_search_enterprise_policy_allowed": {
             "value": 1
           },
@@ -275,8 +253,7 @@
           "HelpMeReadSettings": 2,
           "HelpMeWriteSettings": 2,
           "HistorySearchSettings": 2,
-          "TabCompareSettings": 2,
-          "TabOrganizerSettings": 2
+          "TabCompareSettings": 2
         },
         "prefs": {
           "ash.gen_ai_photo_editing_settings": {
@@ -309,9 +286,6 @@
           "optimization_guide.model_execution.tab_compare_settings_enterprise_policy": {
             "value": 2
           },
-          "optimization_guide.model_execution.tab_organization_enterprise_policy_allowed": {
-            "value": 2
-          },
           "optimization_guide.model_execution.wallpaper_search_enterprise_policy_allowed": {
             "value": 2
           },
diff --git a/components/policy/test/data/pref_mapping/TabOrganizerSettings.json b/components/policy/test/data/pref_mapping/TabOrganizerSettings.json
index 8661026..5868d79 100644
--- a/components/policy/test/data/pref_mapping/TabOrganizerSettings.json
+++ b/components/policy/test/data/pref_mapping/TabOrganizerSettings.json
@@ -1,20 +1,5 @@
 [
   {
-    "os": [
-      "win",
-      "linux",
-      "mac",
-      "chromeos"
-    ],
-    "simple_policy_pref_mapping_test": {
-      "pref_name": "optimization_guide.model_execution.tab_organization_enterprise_policy_allowed",
-      "default_value": 0,
-      "default_for_enterprise_users": 1,
-      "values_to_test": [
-        0,
-        1,
-        2
-      ]
-    }
+    "reason_for_missing_test": "Policy was removed"
   }
 ]
diff --git a/components/privacy_sandbox_strings.grd b/components/privacy_sandbox_strings.grd
index fd57806..adf5b0b 100644
--- a/components/privacy_sandbox_strings.grd
+++ b/components/privacy_sandbox_strings.grd
@@ -610,6 +610,37 @@
       <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LAST_TEXT" desc="This string notifies users that they can make changes to their ad topics in the “ad privacy” section of settings." formatter_data="android_java">
         You can make changes in ad privacy settings
       </message>
+      <!--Ad Topics ROW Notice v3 - Ads API UX Enhancements -->
+      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_TITLE_V3" desc="" translateable="false" formatter_data="android_java">
+        Personalize your experience while limiting what websites can learn about you
+      </message>
+      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_DESCRIPTION_V3" desc="" translateable="false" formatter_data="android_java">
+        Websites and their advertising partners can use your browsing history and activity on the sites you visit to personalize content and ads. Those sites can then share limited information with other sites to help them measure the performance of their ads.
+      </message>
+      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_CARD_1_V3" desc="" translateable="false" formatter_data="android_java">
+        Chrome uses privacy measures like encryption, noise, and aggregation to help limit the information shared with sites that use your topics and activity
+      </message>
+      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_CARD_2_V3" desc="" translateable="false" formatter_data="android_java">
+        Chrome regularly auto-deletes topics and sites that suggest ads for you
+      </message>
+      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_CARD_3_V3" desc="" translateable="false" formatter_data="android_java">
+        You can block specific topics and sites you don’t like at any time in Chrome settings
+      </message>
+      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_ADS_TOPIC_DESCRIPTION_V3" desc="" translateable="false" formatter_data="android_java">
+        Whether an ad or content you see is personalized can depend on many things, including these settings, your cookie settings, and if the site you’re viewing customizes your experience.
+      </message>
+      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_DROPDOWN_TITLE_V3" desc="" translateable="false" formatter_data="android_java">
+        More about how Chrome personalizes content and ads
+      </message>
+      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_SETTINGS_BUTTON_V3" desc="" translateable="false" formatter_data="android_java">
+        Settings
+      </message>
+      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_GOT_IT_BUTTON_V3" desc="" translateable="false" formatter_data="android_java">
+        Got it
+      </message>
+      <message name="IDS_PRIVACY_SANDBOX_M1_NOTICE_ROW_LAST_TEXT_V3" desc="" translateable="false" formatter_data="android_java">
+        You can make changes in ad privacy settings
+      </message>
       <!--Site suggested ads settings page - Ads API UX Enhancement-->
       <if expr="_google_chrome">
         <then>
diff --git a/components/regional_capabilities/BUILD.gn b/components/regional_capabilities/BUILD.gn
index 9874ace..dddd17a 100644
--- a/components/regional_capabilities/BUILD.gn
+++ b/components/regional_capabilities/BUILD.gn
@@ -12,6 +12,8 @@
     "eea_countries_ids.h",
     "regional_capabilities_metrics.cc",
     "regional_capabilities_metrics.h",
+    "regional_capabilities_prefs.cc",
+    "regional_capabilities_prefs.h",
     "regional_capabilities_service.cc",
     "regional_capabilities_service.h",
     "regional_capabilities_switches.cc",
@@ -28,8 +30,13 @@
 
   deps = [
     ":country_access_reason",
+    "//base/version_info",
     "//components/country_codes",
+    "//components/pref_registry",
     "//components/prefs",
+    "//components/search_engines:search_engine_pref_names",
+    "//third_party/search_engines_data:prepopulated_engines",
+    "//third_party/search_engines_data:regional_settings",
   ]
 
   if (is_android) {
diff --git a/components/regional_capabilities/DEPS b/components/regional_capabilities/DEPS
index c6b903f..384f04b7 100644
--- a/components/regional_capabilities/DEPS
+++ b/components/regional_capabilities/DEPS
@@ -2,12 +2,17 @@
   "+components/country_codes",
   "+components/keyed_service/core",
   "+components/prefs",
+  "+components/pref_registry",
   "+third_party/jni_zero",
   "+components/regional_capabilities/access",
+  "+third_party/search_engines_data",
 ]
 
 specific_include_rules = {
   ".*test\.cc": [
     "+components/sync_preferences",
   ],
+  ".*regional_capabilities_prefs\.cc": [
+    "+components/search_engines/search_engines_pref_names.h",
+  ]
 }
\ No newline at end of file
diff --git a/components/regional_capabilities/access/country_access_reason.h b/components/regional_capabilities/access/country_access_reason.h
index 5edb789c..14bb625 100644
--- a/components/regional_capabilities/access/country_access_reason.h
+++ b/components/regional_capabilities/access/country_access_reason.h
@@ -14,9 +14,6 @@
 namespace search_engines {
 class SearchEngineChoiceService;
 }
-namespace TemplateURLPrepopulateData {
-class Resolver;
-}
 
 namespace regional_capabilities {
 
@@ -32,10 +29,6 @@
   // Added with the initial access control migration, see crbug.com/328040066.
   kSearchEngineChoiceServiceCacheChoiceScreenData,
 
-  // Used for computing of the list of prepopulated search engines.
-  // Added with the initial access control migration, see crbug.com/328040066.
-  kTemplateURLPrepopulateDataResolution,
-
   // Used to determine whether the local database of search engines needs to
   // be refreshed with the latest prepopulated data set. The value obtained
   // from this access will be cached in the DB to compared later with the
@@ -64,7 +57,6 @@
   const CountryAccessReason reason;
 
  private:
-  friend class TemplateURLPrepopulateData::Resolver;
   friend class search_engines::SearchEngineChoiceService;
   friend class RegionalCapabilitiesService;
   friend class ::TemplateURLService;
diff --git a/components/regional_capabilities/regional_capabilities_country_id_unittest.cc b/components/regional_capabilities/regional_capabilities_country_id_unittest.cc
index 6e29318..bad779d 100644
--- a/components/regional_capabilities/regional_capabilities_country_id_unittest.cc
+++ b/components/regional_capabilities/regional_capabilities_country_id_unittest.cc
@@ -26,8 +26,8 @@
 
   CountryIdHolder country_id_holder(country_id);
 
-  auto actual_country_id = country_id_holder.GetRestricted(CountryAccessKey(
-      CountryAccessReason::kTemplateURLPrepopulateDataResolution));
+  auto actual_country_id = country_id_holder.GetRestricted(
+      CountryAccessKey(CountryAccessReason::kProfileInternalsDisplayInDebugUi));
 
   EXPECT_EQ(actual_country_id, country_id);
 }
diff --git a/components/regional_capabilities/regional_capabilities_prefs.cc b/components/regional_capabilities/regional_capabilities_prefs.cc
new file mode 100644
index 0000000..e9a5bd4
--- /dev/null
+++ b/components/regional_capabilities/regional_capabilities_prefs.cc
@@ -0,0 +1,37 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/regional_capabilities/regional_capabilities_prefs.h"
+
+#include <cstdint>
+
+#include "base/rand_util.h"
+#include "components/pref_registry/pref_registry_syncable.h"
+#include "components/prefs/pref_service.h"
+#include "components/search_engines/search_engines_pref_names.h"
+
+namespace regional_capabilities::prefs {
+
+void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
+  registry->RegisterInt64Pref(
+      ::prefs::kDefaultSearchProviderChoiceScreenRandomShuffleSeed, 0);
+}
+
+uint64_t GetShuffleSeed(PrefService& profile_prefs) {
+  uint64_t shuffle_seed = profile_prefs.GetInt64(
+      ::prefs::kDefaultSearchProviderChoiceScreenRandomShuffleSeed);
+
+  // Ensure that the generated seed is not 0 to avoid accidental re-seeding
+  // and re-shuffle next time we call this.
+  while (shuffle_seed == 0) {
+    shuffle_seed = base::RandUint64();
+    profile_prefs.SetInt64(
+        ::prefs::kDefaultSearchProviderChoiceScreenRandomShuffleSeed,
+        shuffle_seed);
+  }
+
+  return shuffle_seed;
+}
+
+}  // namespace regional_capabilities::prefs
diff --git a/components/regional_capabilities/regional_capabilities_prefs.h b/components/regional_capabilities/regional_capabilities_prefs.h
new file mode 100644
index 0000000..b618587
--- /dev/null
+++ b/components/regional_capabilities/regional_capabilities_prefs.h
@@ -0,0 +1,30 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_REGIONAL_CAPABILITIES_REGIONAL_CAPABILITIES_PREFS_H_
+#define COMPONENTS_REGIONAL_CAPABILITIES_REGIONAL_CAPABILITIES_PREFS_H_
+
+#include <cstdint>
+
+class PrefService;
+
+namespace user_prefs {
+class PrefRegistrySyncable;
+}
+
+// Namespace for collecting utilities associated with preferences used by the
+// regional_capabilities component.
+namespace regional_capabilities::prefs {
+
+void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
+
+// Returns a random number to use as a profile-constant seed for the random
+// shuffling of the choice screen elements.
+// The value is picked the first time this function is called for the profile,
+// is is guaranteed to be non-0.
+uint64_t GetShuffleSeed(PrefService& profile_prefs);
+
+}  // namespace regional_capabilities::prefs
+
+#endif  // COMPONENTS_REGIONAL_CAPABILITIES_REGIONAL_CAPABILITIES_PREFS_H_
diff --git a/components/regional_capabilities/regional_capabilities_service.cc b/components/regional_capabilities/regional_capabilities_service.cc
index 0e6c76d1..a2e55a3 100644
--- a/components/regional_capabilities/regional_capabilities_service.cc
+++ b/components/regional_capabilities/regional_capabilities_service.cc
@@ -5,6 +5,7 @@
 #include "components/regional_capabilities/regional_capabilities_service.h"
 
 #include <optional>
+#include <vector>
 
 #include "base/callback_list.h"
 #include "base/check_is_test.h"
@@ -18,6 +19,7 @@
 #include "components/regional_capabilities/regional_capabilities_metrics.h"
 #include "components/regional_capabilities/regional_capabilities_switches.h"
 #include "components/regional_capabilities/regional_capabilities_utils.h"
+#include "third_party/search_engines_data/resources/definitions/prepopulated_engines.h"
 
 #if BUILDFLAG(IS_ANDROID)
 #include "base/android/scoped_java_ref.h"
@@ -155,6 +157,23 @@
   return CountryIdHolder(GetCountryIdInternal());
 }
 
+std::vector<const TemplateURLPrepopulateData::PrepopulatedEngine*>
+RegionalCapabilitiesService::GetRegionalPrepopulatedEngines() {
+  if (HasSearchEngineCountryListOverride()) {
+    auto country_override = std::get<SearchEngineCountryListOverride>(
+        GetSearchEngineCountryOverride().value());
+
+    switch (country_override) {
+      case SearchEngineCountryListOverride::kEeaAll:
+        return GetAllEeaRegionPrepopulatedEngines();
+      case SearchEngineCountryListOverride::kEeaDefault:
+        return GetDefaultPrepopulatedEngines();
+    }
+  }
+
+  return GetPrepopulatedEngines(GetCountryIdInternal(), profile_prefs_.get());
+}
+
 bool RegionalCapabilitiesService::IsInEeaCountry() {
   return regional_capabilities::IsEeaCountry(GetCountryIdInternal());
 }
diff --git a/components/regional_capabilities/regional_capabilities_service.h b/components/regional_capabilities/regional_capabilities_service.h
index 41c20c18..d6b6119 100644
--- a/components/regional_capabilities/regional_capabilities_service.h
+++ b/components/regional_capabilities/regional_capabilities_service.h
@@ -6,6 +6,7 @@
 #define COMPONENTS_REGIONAL_CAPABILITIES_REGIONAL_CAPABILITIES_SERVICE_H_
 
 #include <optional>
+#include <vector>
 
 #include "base/functional/callback_forward.h"
 #include "base/memory/raw_ref.h"
@@ -19,6 +20,10 @@
 
 class PrefService;
 
+namespace TemplateURLPrepopulateData {
+struct PrepopulatedEngine;
+}
+
 namespace regional_capabilities {
 
 class CountryIdHolder;
@@ -81,6 +86,9 @@
   // more details.
   CountryIdHolder GetCountryId();
 
+  std::vector<const TemplateURLPrepopulateData::PrepopulatedEngine*>
+  GetRegionalPrepopulatedEngines();
+
   // Returns whether the profile country is a EEA member.
   //
   // Testing note: To control the value this returns in manual or automated
diff --git a/components/regional_capabilities/regional_capabilities_utils.cc b/components/regional_capabilities/regional_capabilities_utils.cc
index 578ac4ce..e1d4f00 100644
--- a/components/regional_capabilities/regional_capabilities_utils.cc
+++ b/components/regional_capabilities/regional_capabilities_utils.cc
@@ -4,17 +4,55 @@
 
 #include "components/regional_capabilities/regional_capabilities_utils.h"
 
+#include <algorithm>
 #include <optional>
+#include <random>
 #include <string>
 #include <variant>
 
 #include "base/command_line.h"
+#include "base/containers/to_vector.h"
 #include "components/country_codes/country_codes.h"
 #include "components/regional_capabilities/eea_countries_ids.h"
+#include "components/regional_capabilities/regional_capabilities_prefs.h"
 #include "components/regional_capabilities/regional_capabilities_switches.h"
+#include "third_party/search_engines_data/resources/definitions/prepopulated_engines.h"
+#include "third_party/search_engines_data/resources/definitions/regional_settings.h"
 
 namespace regional_capabilities {
 
+namespace {
+
+using country_codes::CountryId;
+using TemplateURLPrepopulateData::PrepopulatedEngine;
+using TemplateURLPrepopulateData::RegionalSettings;
+
+// The number of search engines for each country falling into the "top"
+// category.
+constexpr size_t kTopSearchEnginesThreshold = 5;
+
+// Returns regional settings appropriate for the provided country. If no
+// specific regional settings are defined, returns the default settings.
+const RegionalSettings& GetRegionalSettings(CountryId country_id) {
+  auto iter = TemplateURLPrepopulateData::kRegionalSettings.find(country_id);
+  if (iter == TemplateURLPrepopulateData::kRegionalSettings.end()) {
+    // Fallback to default country.
+    iter = TemplateURLPrepopulateData::kRegionalSettings.find(CountryId());
+  }
+
+  return *iter->second;
+}
+
+void ShufflePrepopulatedEngines(std::vector<const PrepopulatedEngine*>& engines,
+                                PrefService& prefs) {
+  std::default_random_engine generator;
+  generator.seed(prefs::GetShuffleSeed(prefs));
+
+  std::shuffle(engines.begin(), engines.end(), generator);
+}
+
+}  // namespace
+
 bool IsEeaCountry(country_codes::CountryId country_id) {
   // The `HasSearchEngineCountryListOverride()` check is here for compatibility
   // with the way EEA presence was checked from `search_engines`. But it should
@@ -57,4 +95,50 @@
       country_override.value());
 }
 
+std::vector<const PrepopulatedEngine*> GetPrepopulatedEngines(
+    CountryId country_id,
+    PrefService& prefs) {
+  const RegionalSettings& regional_settings = GetRegionalSettings(country_id);
+  std::vector<const PrepopulatedEngine*> engines;
+
+  if (regional_capabilities::IsEeaCountry(country_id)) {
+    engines = base::ToVector(regional_settings.search_engines);
+    ShufflePrepopulatedEngines(engines, prefs);
+  } else {
+    size_t num_top_engines = std::min(regional_settings.search_engines.size(),
+                                      kTopSearchEnginesThreshold);
+    engines = base::ToVector(
+        base::span(regional_settings.search_engines).first(num_top_engines));
+  }
+
+  return engines;
+}
+
+std::vector<const PrepopulatedEngine*> GetAllEeaRegionPrepopulatedEngines() {
+  std::vector<const PrepopulatedEngine*> result;
+
+  // We use a `flat_set` to filter out engines that have the same prepopulated
+  // id. For example, `yahoo_fr` and `yahoo_de` have the same prepopulated id
+  // because they point to the same search engine so we only want to record one
+  // instance.
+  base::flat_set<int> used_engines;
+  for (CountryId eea_country_id :
+       regional_capabilities::kEeaChoiceCountriesIds) {
+    const auto& search_engines =
+        GetRegionalSettings(eea_country_id).search_engines;
+
+    for (const auto* search_engine : search_engines) {
+      if (auto [_, added] = used_engines.emplace(search_engine->id); added) {
+        result.push_back(search_engine);
+      }
+    }
+  }
+
+  return result;
+}
+
+std::vector<const PrepopulatedEngine*> GetDefaultPrepopulatedEngines() {
+  return base::ToVector(GetRegionalSettings(CountryId()).search_engines);
+}
+
 }  // namespace regional_capabilities
diff --git a/components/regional_capabilities/regional_capabilities_utils.h b/components/regional_capabilities/regional_capabilities_utils.h
index 79f9c8e..9067213 100644
--- a/components/regional_capabilities/regional_capabilities_utils.h
+++ b/components/regional_capabilities/regional_capabilities_utils.h
@@ -7,8 +7,17 @@
 
 #include <optional>
 #include <variant>
+#include <vector>
 
-#include "components/country_codes/country_codes.h"
+class PrefService;
+
+namespace country_codes {
+class CountryId;
+}
+
+namespace TemplateURLPrepopulateData {
+struct PrepopulatedEngine;
+}
 
 namespace regional_capabilities {
 
@@ -39,6 +48,18 @@
 // return the default list or the list of all eea engines.
 bool HasSearchEngineCountryListOverride();
 
+// Returns the prepopulated engines for the given country.
+std::vector<const TemplateURLPrepopulateData::PrepopulatedEngine*>
+GetPrepopulatedEngines(country_codes::CountryId country_id, PrefService& prefs);
+
+// Returns all the prepopulated engines that are used in the EEA region.
+std::vector<const TemplateURLPrepopulateData::PrepopulatedEngine*>
+GetAllEeaRegionPrepopulatedEngines();
+
+// Returns the set of search engines that is used when the country is unknown.
+std::vector<const TemplateURLPrepopulateData::PrepopulatedEngine*>
+GetDefaultPrepopulatedEngines();
+
 }  // namespace regional_capabilities
 
 #endif  // COMPONENTS_REGIONAL_CAPABILITIES_REGIONAL_CAPABILITIES_UTILS_H_
diff --git a/components/saved_tab_groups/internal/android/java/src/org/chromium/components/tab_group_sync/TabGroupSyncServiceAndroidUnitTest.java b/components/saved_tab_groups/internal/android/java/src/org/chromium/components/tab_group_sync/TabGroupSyncServiceAndroidUnitTest.java
index e5d31ff3..381f3ad 100644
--- a/components/saved_tab_groups/internal/android/java/src/org/chromium/components/tab_group_sync/TabGroupSyncServiceAndroidUnitTest.java
+++ b/components/saved_tab_groups/internal/android/java/src/org/chromium/components/tab_group_sync/TabGroupSyncServiceAndroidUnitTest.java
@@ -251,4 +251,9 @@
             LocalTabGroupId localTabGroupId, int localTabId, String tabTitle) {
         mService.onTabSelected(localTabGroupId, localTabId, tabTitle);
     }
+
+    @CalledByNative
+    public void testUpdateArchivalStatus(String uuid, boolean archivalStatus) {
+        mService.updateArchivalStatus(uuid, archivalStatus);
+    }
 }
diff --git a/components/saved_tab_groups/internal/android/java/src/org/chromium/components/tab_group_sync/TabGroupSyncServiceImpl.java b/components/saved_tab_groups/internal/android/java/src/org/chromium/components/tab_group_sync/TabGroupSyncServiceImpl.java
index 095343b5..7d873c36 100644
--- a/components/saved_tab_groups/internal/android/java/src/org/chromium/components/tab_group_sync/TabGroupSyncServiceImpl.java
+++ b/components/saved_tab_groups/internal/android/java/src/org/chromium/components/tab_group_sync/TabGroupSyncServiceImpl.java
@@ -245,6 +245,14 @@
                         eventDetails.closingSource);
     }
 
+    @Override
+    public void updateArchivalStatus(String syncTabGroupId, boolean archivalStatus) {
+        if (mNativePtr == 0) return;
+        assert syncTabGroupId != null;
+        TabGroupSyncServiceImplJni.get()
+                .updateArchivalStatus(mNativePtr, this, syncTabGroupId, archivalStatus);
+    }
+
     @CalledByNative
     private void clearNativePtr() {
         mNativePtr = 0;
@@ -428,5 +436,11 @@
                 int localTabId,
                 int openingSource,
                 int closingSource);
+
+        void updateArchivalStatus(
+                long nativeTabGroupSyncServiceAndroid,
+                TabGroupSyncServiceImpl caller,
+                String syncTabGroupId,
+                boolean archivalStatus);
     }
 }
diff --git a/components/saved_tab_groups/internal/android/tab_group_sync_service_android.cc b/components/saved_tab_groups/internal/android/tab_group_sync_service_android.cc
index 7730d8a1..75464bf 100644
--- a/components/saved_tab_groups/internal/android/tab_group_sync_service_android.cc
+++ b/components/saved_tab_groups/internal/android/tab_group_sync_service_android.cc
@@ -420,4 +420,14 @@
   tab_group_sync_service_->RecordTabGroupEvent(event_details);
 }
 
+void TabGroupSyncServiceAndroid::UpdateArchivalStatus(
+    JNIEnv* env,
+    const JavaParamRef<jobject>& j_caller,
+    const JavaParamRef<jstring>& j_sync_group_id,
+    const jboolean j_archival_status) {
+  auto sync_group_id = JavaStringToUuid(env, j_sync_group_id);
+  tab_group_sync_service_->UpdateArchivalStatus(sync_group_id,
+                                                j_archival_status);
+}
+
 }  // namespace tab_groups
diff --git a/components/saved_tab_groups/internal/android/tab_group_sync_service_android.h b/components/saved_tab_groups/internal/android/tab_group_sync_service_android.h
index 1b3619d77..ce4bb8f 100644
--- a/components/saved_tab_groups/internal/android/tab_group_sync_service_android.h
+++ b/components/saved_tab_groups/internal/android/tab_group_sync_service_android.h
@@ -161,6 +161,11 @@
                            jint j_opening_source,
                            jint j_closing_source);
 
+  void UpdateArchivalStatus(JNIEnv* env,
+                            const JavaParamRef<jobject>& j_caller,
+                            const JavaParamRef<jstring>& j_sync_group_id,
+                            const jboolean j_archival_status);
+
  private:
   // A reference to the Java counterpart of this class.  See
   // TabGroupSyncServiceImpl.java.
diff --git a/components/saved_tab_groups/internal/android/tab_group_sync_service_android_unittest.cc b/components/saved_tab_groups/internal/android/tab_group_sync_service_android_unittest.cc
index ef6bfa66..6cf61b0b 100644
--- a/components/saved_tab_groups/internal/android/tab_group_sync_service_android_unittest.cc
+++ b/components/saved_tab_groups/internal/android/tab_group_sync_service_android_unittest.cc
@@ -408,4 +408,16 @@
       non_grouped_tab_id, j_tab_title);
 }
 
+TEST_F(TabGroupSyncServiceAndroidTest, UpdateArchivalStatus) {
+  auto* env = AttachCurrentThread();
+
+  base::Uuid uuid = base::Uuid::ParseCaseInsensitive(kTestUuid);
+  auto j_uuid = UuidToJavaString(env, uuid);
+
+  EXPECT_CALL(tab_group_sync_service_, UpdateArchivalStatus(uuid, true))
+      .Times(1);
+  Java_TabGroupSyncServiceAndroidUnitTest_testUpdateArchivalStatus(
+      env, j_test_, j_uuid, true);
+}
+
 }  // namespace tab_groups
diff --git a/components/saved_tab_groups/internal/saved_tab_group_model.cc b/components/saved_tab_groups/internal/saved_tab_group_model.cc
index 755c540..0e35fad 100644
--- a/components/saved_tab_groups/internal/saved_tab_group_model.cc
+++ b/components/saved_tab_groups/internal/saved_tab_group_model.cc
@@ -966,4 +966,19 @@
   }
 }
 
+void SavedTabGroupModel::UpdateArchivalStatus(const base::Uuid& id,
+                                              bool archival_status) {
+  SavedTabGroup* const group = GetMutableGroup(id);
+  CHECK(group);
+  std::optional<base::Time> archival_time;
+  if (archival_status) {
+    archival_time = base::Time::Now();
+  }
+  group->SetArchivalTime(archival_time);
+
+  for (auto& observer : observers_) {
+    observer.SavedTabGroupUpdatedLocally(id, /*tab_guid=*/std::nullopt);
+  }
+}
+
 }  // namespace tab_groups
diff --git a/components/saved_tab_groups/internal/saved_tab_group_model.h b/components/saved_tab_groups/internal/saved_tab_group_model.h
index a060bdcd..4d6c305 100644
--- a/components/saved_tab_groups/internal/saved_tab_group_model.h
+++ b/components/saved_tab_groups/internal/saved_tab_group_model.h
@@ -248,6 +248,9 @@
   void OnSyncBridgeUpdateTypeChanged(
       SyncBridgeUpdateType sync_bridge_update_type);
 
+  // Update the archival status and archival timestamp of the local tab group.
+  void UpdateArchivalStatus(const base::Uuid& id, bool archivalStatus);
+
  private:
   // Returns mutable group containing tab with ID `saved_tab_guid`, otherwise
   // returns null.
diff --git a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc
index 6b16b6f..f457bea 100644
--- a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc
+++ b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc
@@ -716,8 +716,12 @@
         change->data().specifics.shared_tab_group_data().guid()));
   }
 
-  // TODO(crbug.com/370719750): resolve and handle tabs missing groups later.
-  // ResolveTabsMissingGroups(write_batch.get());
+  // Note that ResolveTabsMissingGroups() must be called after all the tab
+  // updates are applied to the model to correctly handle unique positions.
+  if (std::optional<syncer::ModelError> error =
+          ResolveTabsMissingGroups(*metadata_change_list)) {
+    return error;
+  }
 
   ongoing_write_batch_->TakeMetadataChangesFrom(
       std::move(metadata_change_list));
@@ -1570,6 +1574,37 @@
   }
 }
 
+std::optional<syncer::ModelError>
+SharedTabGroupDataSyncBridge::ResolveTabsMissingGroups(
+    syncer::MetadataChangeList& metadata_change_list) {
+  // This method should only be called when there is an ongoing write batch,
+  // for example during a remote update.
+  CHECK(ongoing_write_batch_);
+  for (const auto& [tab_guid, tab_missing_group] : tabs_missing_groups_) {
+    base::Uuid group_guid = base::Uuid::ParseLowercase(
+        tab_missing_group.specifics.tab().shared_tab_group_guid());
+    const SavedTabGroup* group = model_wrapper_->GetGroup(group_guid);
+    if (!group) {
+      // The group still does not exist in the model.
+      continue;
+    }
+
+    // The group exists in the model, simulate a remote update for the tab. Note
+    // that `tab_ids_with_pending_model_update` is empty because all the tabs in
+    // the model are already updated (and other tabs missing groups are still
+    // not in the model).
+    if (std::optional<syncer::ModelError> error =
+            ApplyRemoteTabUpdate(tab_missing_group.specifics,
+                                 &metadata_change_list, *ongoing_write_batch_,
+                                 /*tab_ids_with_pending_model_update=*/{},
+                                 tab_missing_group.collaboration_metadata,
+                                 tab_missing_group.creation_time)) {
+      return error;
+    }
+  }
+  return std::nullopt;
+}
+
 SharedTabGroupDataSyncBridge::TabMissingGroup::TabMissingGroup(
     sync_pb::SharedTabGroupDataSpecifics specifics,
     syncer::CollaborationMetadata collaboration_metadata,
diff --git a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.h b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.h
index 11e1782e..a504b344 100644
--- a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.h
+++ b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.h
@@ -207,6 +207,11 @@
   void FixLocalTabGroupIDsForSharedGroupsDuringFeatureEnabling(
       std::vector<proto::SharedTabGroupData>& stored_entries);
 
+  // Resolves tabs missing groups by adding them to the model if a corresponding
+  // group exists in the model.
+  std::optional<syncer::ModelError> ResolveTabsMissingGroups(
+      syncer::MetadataChangeList& metadata_change_list);
+
   SEQUENCE_CHECKER(sequence_checker_);
 
   // In charge of actually persisting changes to disk, or loading previous data.
diff --git a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge_unittest.cc b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge_unittest.cc
index 0e60405..902bff7e 100644
--- a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge_unittest.cc
+++ b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge_unittest.cc
@@ -70,6 +70,7 @@
 using testing::Eq;
 using testing::Invoke;
 using testing::InvokeWithoutArgs;
+using testing::IsEmpty;
 using testing::IsNull;
 using testing::NotNull;
 using testing::Pointee;
@@ -2330,6 +2331,44 @@
   run_loop2.Run();
 }
 
+TEST_F(SharedTabGroupDataSyncBridgeTest,
+       ShouldResolveTabsMissingGroupsOnRemoteUpdate) {
+  const CollaborationId kCollaborationId("collaboration");
+  const base::Uuid kMissingGroupGuid = base::Uuid::GenerateRandomV4();
+  ASSERT_TRUE(InitializeBridgeAndModel());
+
+  // Add a tab missing group remotely.
+  sync_pb::SharedTabGroupDataSpecifics tab_specifics =
+      MakeTabSpecifics("tab title", GURL("http://google.com/1"),
+                       kMissingGroupGuid, GenerateRandomUniquePosition());
+  ApplySingleEntityChange(
+      CreateAddEntityChange(tab_specifics, kCollaborationId));
+
+  std::vector<syncer::EntityData> entity_data_list =
+      ExtractEntityDataFromBatch(bridge()->GetAllDataForDebugging());
+
+  // Verify that the model is still empty but the tab missing group is stored.
+  ASSERT_THAT(entity_data_list,
+              UnorderedElementsAre(HasTabEntityData(
+                  "tab title", "http://google.com/1", kCollaborationId)));
+  ASSERT_THAT(model()->saved_tab_groups(), IsEmpty());
+
+  // Add the missing group entry remotely.
+  sync_pb::SharedTabGroupDataSpecifics group_specifics =
+      MakeTabGroupSpecifics("group title", sync_pb::SharedTabGroup::CYAN);
+  group_specifics.set_guid(kMissingGroupGuid.AsLowercaseString());
+  ApplySingleEntityChange(
+      CreateAddEntityChange(group_specifics, kCollaborationId));
+
+  // Both the group and the tab should be present in the model.
+  ASSERT_THAT(model()->saved_tab_groups(),
+              ElementsAre(HasSharedGroupMetadata(
+                  "group title", tab_groups::TabGroupColorId::kCyan,
+                  kCollaborationId)));
+  EXPECT_THAT(model()->saved_tab_groups().front().saved_tabs(),
+              ElementsAre(HasTabMetadata("tab title", "http://google.com/1")));
+}
+
 // The number of tabs to test the correct ordering of remote updates.
 constexpr size_t kNumTabsForOrderTest = 5;
 
diff --git a/components/saved_tab_groups/internal/tab_group_sync_service_impl.cc b/components/saved_tab_groups/internal/tab_group_sync_service_impl.cc
index 2ec0b9d..22dbc828 100644
--- a/components/saved_tab_groups/internal/tab_group_sync_service_impl.cc
+++ b/components/saved_tab_groups/internal/tab_group_sync_service_impl.cc
@@ -1057,6 +1057,18 @@
   metrics_logger_->LogEvent(event_details, group, tab);
 }
 
+void TabGroupSyncServiceImpl::UpdateArchivalStatus(const base::Uuid& sync_id,
+                                                   bool archival_status) {
+  VLOG(2) << __func__;
+
+  std::optional<SavedTabGroup> group = GetGroup(sync_id);
+  if (!group.has_value()) {
+    return;
+  }
+
+  model_->UpdateArchivalStatus(sync_id, archival_status);
+}
+
 TabGroupSyncMetricsLogger*
 TabGroupSyncServiceImpl::GetTabGroupSyncMetricsLogger() {
   return metrics_logger_.get();
diff --git a/components/saved_tab_groups/internal/tab_group_sync_service_impl.h b/components/saved_tab_groups/internal/tab_group_sync_service_impl.h
index c768262f..fb9bf74 100644
--- a/components/saved_tab_groups/internal/tab_group_sync_service_impl.h
+++ b/components/saved_tab_groups/internal/tab_group_sync_service_impl.h
@@ -159,6 +159,10 @@
   std::set<LocalTabID> GetSelectedTabs() override;
 
   void RecordTabGroupEvent(const EventDetails& event_details) override;
+
+  void UpdateArchivalStatus(const base::Uuid& sync_id,
+                            bool archival_status) override;
+
   TabGroupSyncMetricsLogger* GetTabGroupSyncMetricsLogger() override;
 
   base::WeakPtr<syncer::DataTypeControllerDelegate>
diff --git a/components/saved_tab_groups/internal/tab_group_sync_service_unittest.cc b/components/saved_tab_groups/internal/tab_group_sync_service_unittest.cc
index e829d6f..03fc970 100644
--- a/components/saved_tab_groups/internal/tab_group_sync_service_unittest.cc
+++ b/components/saved_tab_groups/internal/tab_group_sync_service_unittest.cc
@@ -1372,6 +1372,31 @@
                                     1u);
 }
 
+TEST_F(TabGroupSyncServiceTest, UpdateArchivalStatus) {
+  auto group = tab_group_sync_service_->GetGroup(group_1_.saved_guid());
+  EXPECT_TRUE(group.has_value());
+
+  // Verify the archive status is defaulted to off.
+  EXPECT_FALSE(group->archival_time().has_value());
+
+  // Expect the observers to be called each time the status is updated.
+  EXPECT_CALL(*observer_, OnTabGroupUpdated(UuidEq(group_1_.saved_guid()),
+                                            Eq(TriggerSource::LOCAL)))
+      .Times(2);
+
+  // Set the archival status and verify.
+  tab_group_sync_service_->UpdateArchivalStatus(group_1_.saved_guid(), true);
+  group = tab_group_sync_service_->GetGroup(group_1_.saved_guid());
+  WaitForPostedTasks();
+  EXPECT_TRUE(group->archival_time().has_value());
+
+  // Reset the archival status and verify.
+  tab_group_sync_service_->UpdateArchivalStatus(group_1_.saved_guid(), false);
+  group = tab_group_sync_service_->GetGroup(group_1_.saved_guid());
+  WaitForPostedTasks();
+  EXPECT_FALSE(group->archival_time().has_value());
+}
+
 TEST_F(TabGroupSyncServiceTest, UpdateLocalTabId) {
   auto tab_guid = group_1_.saved_tabs()[0].saved_tab_guid();
   auto local_tab_id_2 = test::GenerateRandomTabID();
diff --git a/components/saved_tab_groups/public/android/java/src/org/chromium/components/tab_group_sync/TabGroupSyncService.java b/components/saved_tab_groups/public/android/java/src/org/chromium/components/tab_group_sync/TabGroupSyncService.java
index 9bcfd6d..e960fe7 100644
--- a/components/saved_tab_groups/public/android/java/src/org/chromium/components/tab_group_sync/TabGroupSyncService.java
+++ b/components/saved_tab_groups/public/android/java/src/org/chromium/components/tab_group_sync/TabGroupSyncService.java
@@ -234,7 +234,7 @@
      * @param localGroupId The local ID of the group to be returned.
      * @return The associated {@link SavedTabGroup}.
      */
-    SavedTabGroup getGroup(LocalTabGroupId localGroupId);
+    @Nullable SavedTabGroup getGroup(LocalTabGroupId localGroupId);
 
     /**
      * Updates the in-memory mapping between sync and local tab group IDs.
@@ -308,4 +308,12 @@
      *     associated tab group info.
      */
     void recordTabGroupEvent(EventDetails eventDetails);
+
+    /**
+     * Update the archival status of the local tab group.
+     *
+     * @param syncTabGroupId The sync ID of the tab group to be updated.
+     * @param archivalStatus Whether the tab group should be archived locally or not.
+     */
+    void updateArchivalStatus(String syncTabGroupId, boolean archivalStatus);
 }
diff --git a/components/saved_tab_groups/public/tab_group_sync_service.h b/components/saved_tab_groups/public/tab_group_sync_service.h
index fb79d14b..a7a85e30 100644
--- a/components/saved_tab_groups/public/tab_group_sync_service.h
+++ b/components/saved_tab_groups/public/tab_group_sync_service.h
@@ -363,6 +363,11 @@
   // close tab group events only, but see implementation for more details.
   virtual void RecordTabGroupEvent(const EventDetails& event_details) = 0;
 
+  // Method to update the archival status via timestamp of the local tab group.
+  // No timestamp indicates that the tab group is not currently archived.
+  virtual void UpdateArchivalStatus(const base::Uuid& sync_id,
+                                    bool archival_status) = 0;
+
   // For accessing the centralized metrics logger.
   virtual TabGroupSyncMetricsLogger* GetTabGroupSyncMetricsLogger() = 0;
 
diff --git a/components/saved_tab_groups/test_support/fake_tab_group_sync_service.cc b/components/saved_tab_groups/test_support/fake_tab_group_sync_service.cc
index 175392b2..f1dadfe 100644
--- a/components/saved_tab_groups/test_support/fake_tab_group_sync_service.cc
+++ b/components/saved_tab_groups/test_support/fake_tab_group_sync_service.cc
@@ -402,6 +402,11 @@
   // No op.
 }
 
+void FakeTabGroupSyncService::UpdateArchivalStatus(const base::Uuid& sync_id,
+                                                   bool archival_status) {
+  // No op.
+}
+
 TabGroupSyncMetricsLogger*
 FakeTabGroupSyncService::GetTabGroupSyncMetricsLogger() {
   return nullptr;
diff --git a/components/saved_tab_groups/test_support/fake_tab_group_sync_service.h b/components/saved_tab_groups/test_support/fake_tab_group_sync_service.h
index 731a11a..02315ea 100644
--- a/components/saved_tab_groups/test_support/fake_tab_group_sync_service.h
+++ b/components/saved_tab_groups/test_support/fake_tab_group_sync_service.h
@@ -94,6 +94,8 @@
       const std::optional<std::string>& cache_guid) const override;
   bool WasTabGroupClosedLocally(const base::Uuid& sync_id) const override;
   void RecordTabGroupEvent(const EventDetails& event_details) override;
+  void UpdateArchivalStatus(const base::Uuid& sync_id,
+                            bool archival_status) override;
   TabGroupSyncMetricsLogger* GetTabGroupSyncMetricsLogger() override;
   base::WeakPtr<syncer::DataTypeControllerDelegate>
   GetSavedTabGroupControllerDelegate() override;
diff --git a/components/saved_tab_groups/test_support/mock_tab_group_sync_service.h b/components/saved_tab_groups/test_support/mock_tab_group_sync_service.h
index 979fc03e..635029b 100644
--- a/components/saved_tab_groups/test_support/mock_tab_group_sync_service.h
+++ b/components/saved_tab_groups/test_support/mock_tab_group_sync_service.h
@@ -118,6 +118,7 @@
               (const base::Uuid& sync_id),
               (const));
   MOCK_METHOD(void, RecordTabGroupEvent, (const EventDetails&));
+  MOCK_METHOD(void, UpdateArchivalStatus, (const base::Uuid&, bool));
   MOCK_METHOD(TabGroupSyncMetricsLogger*, GetTabGroupSyncMetricsLogger, ());
 
   MOCK_METHOD(syncer::DataTypeSyncBridge*, bridge, ());
diff --git a/components/search_engines/BUILD.gn b/components/search_engines/BUILD.gn
index edf7779..005e0e6 100644
--- a/components/search_engines/BUILD.gn
+++ b/components/search_engines/BUILD.gn
@@ -29,7 +29,6 @@
     "search_engine_choice/search_engine_choice_service.h",
     "search_engine_choice/search_engine_choice_utils.cc",
     "search_engine_choice/search_engine_choice_utils.h",
-    "search_engines_pref_names.h",
     "search_host_to_urls_map.cc",
     "search_host_to_urls_map.h",
     "search_terms_data.cc",
@@ -60,6 +59,7 @@
   ]
 
   public_deps = [
+    ":search_engine_pref_names",
     ":search_engine_type",
     ":search_engine_utils",
     ":search_engines_switches",
@@ -72,7 +72,6 @@
     "//third_party/metrics_proto",
     "//third_party/omnibox_proto",
     "//third_party/search_engines_data:prepopulated_engines",
-    "//third_party/search_engines_data:regional_settings",
   ]
 
   deps = [
@@ -168,6 +167,10 @@
   sources = [ "search_engine_type.h" ]
 }
 
+source_set("search_engine_pref_names") {
+  sources = [ "search_engines_pref_names.h" ]
+}
+
 static_library("test_support") {
   testonly = true
   sources = [
@@ -193,6 +196,7 @@
     "//components/regional_capabilities:test_support",
     "//components/sync_preferences:test_support",
     "//testing/gtest",
+    "//third_party/search_engines_data:regional_settings",
   ]
 }
 
diff --git a/components/search_engines/search_engine_choice/search_engine_choice_service_test_base.cc b/components/search_engines/search_engine_choice/search_engine_choice_service_test_base.cc
index dcb25fc..38b94db 100644
--- a/components/search_engines/search_engine_choice/search_engine_choice_service_test_base.cc
+++ b/components/search_engines/search_engine_choice/search_engine_choice_service_test_base.cc
@@ -10,6 +10,7 @@
 #include "components/country_codes/country_codes.h"
 #include "components/metrics/metrics_pref_names.h"
 #include "components/policy/policy_constants.h"
+#include "components/regional_capabilities/regional_capabilities_prefs.h"
 #include "components/regional_capabilities/regional_capabilities_switches.h"
 #include "components/regional_capabilities/regional_capabilities_test_utils.h"
 #include "components/search_engines/search_engine_choice/search_engine_choice_metrics_service_accessor.h"
@@ -27,6 +28,7 @@
   TemplateURLService::RegisterProfilePrefs(pref_service_.registry());
   DefaultSearchManager::RegisterProfilePrefs(pref_service_.registry());
   TemplateURLPrepopulateData::RegisterProfilePrefs(pref_service_.registry());
+  regional_capabilities::prefs::RegisterProfilePrefs(pref_service_.registry());
   local_state_.registry()->RegisterBooleanPref(
       metrics::prefs::kMetricsReportingEnabled, true);
   local_state_.registry()->RegisterInt64Pref(
diff --git a/components/search_engines/search_engine_choice/search_engine_choice_utils_unittest.cc b/components/search_engines/search_engine_choice/search_engine_choice_utils_unittest.cc
index cc8ae2e..3c030b11 100644
--- a/components/search_engines/search_engine_choice/search_engine_choice_utils_unittest.cc
+++ b/components/search_engines/search_engine_choice/search_engine_choice_utils_unittest.cc
@@ -22,6 +22,7 @@
 #include "components/policy/core/common/policy_types.h"
 #include "components/policy/policy_constants.h"
 #include "components/prefs/testing_pref_service.h"
+#include "components/regional_capabilities/regional_capabilities_prefs.h"
 #include "components/search_engines/search_engine_type.h"
 #include "components/search_engines/search_engines_pref_names.h"
 #include "components/search_engines/template_url_data_util.h"
@@ -43,6 +44,8 @@
  public:
   SearchEngineChoiceUtilsTest() {
     TemplateURLPrepopulateData::RegisterProfilePrefs(pref_service_.registry());
+    regional_capabilities::prefs::RegisterProfilePrefs(
+        pref_service_.registry());
   }
 
   ~SearchEngineChoiceUtilsTest() override = default;
diff --git a/components/search_engines/template_url_prepopulate_data.cc b/components/search_engines/template_url_prepopulate_data.cc
index 795611c..9255cc9 100644
--- a/components/search_engines/template_url_prepopulate_data.cc
+++ b/components/search_engines/template_url_prepopulate_data.cc
@@ -27,87 +27,18 @@
 #include "components/search_engines/template_url_data.h"
 #include "components/search_engines/template_url_data_util.h"
 #include "third_party/search_engines_data/resources/definitions/prepopulated_engines.h"
-#include "third_party/search_engines_data/resources/definitions/regional_settings.h"
 
 namespace TemplateURLPrepopulateData {
 
 // Helpers --------------------------------------------------------------------
 
 namespace {
-// The number of search engines for each country falling into the "top"
-// category.
-constexpr size_t kTopSearchEnginesThreshold = 5;
 
 inline std::unique_ptr<TemplateURLData> PrepopulatedEngineToTemplateURLData(
-    const TemplateURLPrepopulateData::PrepopulatedEngine* engine) {
+    const PrepopulatedEngine* engine) {
   return TemplateURLDataFromPrepopulatedEngine(*engine);
 }
 
-// Returns regional settings appropriate for the current country. If no specific
-// regional settings are defined, returns the default settings.
-const RegionalSettings& GetRegionalSettings(CountryId country_id) {
-  auto iter = kRegionalSettings.find(country_id);
-  if (iter == kRegionalSettings.end()) {
-    // Fallback to default country.
-    iter = kRegionalSettings.find(CountryId());
-  }
-
-  return *iter->second;
-}
-
-std::vector<std::unique_ptr<TemplateURLData>>
-GetPrepopulatedEnginesForEeaRegionCountries(CountryId country_id,
-                                            PrefService& prefs) {
-  CHECK(regional_capabilities::IsEeaCountry(country_id));
-
-  uint64_t profile_seed = prefs.GetInt64(
-      prefs::kDefaultSearchProviderChoiceScreenRandomShuffleSeed);
-  // Ensure that the generated seed is not 0 to avoid accidental re-seeding
-  // and re-shuffle next time we call this.
-  while (profile_seed == 0) {
-    profile_seed = base::RandUint64();
-    prefs.SetInt64(prefs::kDefaultSearchProviderChoiceScreenRandomShuffleSeed,
-                   profile_seed);
-  }
-
-  std::vector<std::unique_ptr<TemplateURLData>> t_urls =
-      base::ToVector(GetRegionalSettings(country_id).search_engines,
-                     &PrepopulatedEngineToTemplateURLData);
-
-  std::default_random_engine generator;
-  generator.seed(profile_seed);
-  std::shuffle(t_urls.begin(), t_urls.end(), generator);
-
-  CHECK_LE(t_urls.size(), kMaxEeaPrepopulatedEngines);
-  return t_urls;
-}
-
-std::vector<std::unique_ptr<TemplateURLData>> GetPrepopulatedTemplateURLData(
-    CountryId country_id,
-    PrefService& prefs) {
-  if (regional_capabilities::HasSearchEngineCountryListOverride()) {
-    auto country_override =
-        std::get<regional_capabilities::SearchEngineCountryListOverride>(
-            regional_capabilities::GetSearchEngineCountryOverride().value());
-
-    switch (country_override) {
-      case regional_capabilities::SearchEngineCountryListOverride::kEeaAll:
-        return GetAllEeaRegionPrepopulatedEngines();
-      case regional_capabilities::SearchEngineCountryListOverride::kEeaDefault:
-        return GetDefaultPrepopulatedEngines();
-    }
-  }
-
-  if (regional_capabilities::IsEeaCountry(country_id)) {
-    return GetPrepopulatedEnginesForEeaRegionCountries(country_id, prefs);
-  }
-
-  const auto& engines = GetRegionalSettings(country_id).search_engines;
-  size_t num_top_engines = std::min(engines.size(), kTopSearchEnginesThreshold);
-  return base::ToVector(base::span(engines).first(num_top_engines),
-                        &PrepopulatedEngineToTemplateURLData);
-}
-
 // These values are persisted to logs. Entries should not be renumbered and
 // numeric values should never be reused.
 enum class SearchProviderOverrideStatus {
@@ -153,12 +84,13 @@
 
 std::unique_ptr<TemplateURLData> FindPrepopulatedEngineInternal(
     PrefService& prefs,
-    CountryId country_id,
+    std::vector<const TemplateURLPrepopulateData::PrepopulatedEngine*>
+        regional_prepopulated_engines,
     int prepopulated_id,
     bool use_first_as_fallback) {
   // This could be more efficient. We load all URLs but keep only one.
   std::vector<std::unique_ptr<TemplateURLData>> prepopulated_engines =
-      GetPrepopulatedEngines(prefs, country_id);
+      GetPrepopulatedEngines(prefs, regional_prepopulated_engines);
   if (prepopulated_engines.empty()) {
     // Not expected to be a real possibility, branch to be removed when this is
     // verified.
@@ -187,8 +119,6 @@
   country_codes::RegisterProfilePrefs(registry);
   registry->RegisterListPref(prefs::kSearchProviderOverrides);
   registry->RegisterIntegerPref(prefs::kSearchProviderOverridesVersion, -1);
-  registry->RegisterInt64Pref(
-      prefs::kDefaultSearchProviderChoiceScreenRandomShuffleSeed, 0);
 }
 
 int GetDataVersion(PrefService* prefs) {
@@ -200,7 +130,8 @@
 
 std::vector<std::unique_ptr<TemplateURLData>> GetPrepopulatedEngines(
     PrefService& prefs,
-    CountryId country_id) {
+    std::vector<const TemplateURLPrepopulateData::PrepopulatedEngine*>
+        regional_prepopulated_engines) {
   // If there is a set of search engines in the preferences file, it overrides
   // the built-in set.
   std::vector<std::unique_ptr<TemplateURLData>> t_urls =
@@ -209,13 +140,17 @@
     return t_urls;
   }
 
-  return GetPrepopulatedTemplateURLData(country_id, prefs);
+  return base::ToVector(regional_prepopulated_engines,
+                        &PrepopulatedEngineToTemplateURLData);
 }
 
-std::unique_ptr<TemplateURLData> GetPrepopulatedEngine(PrefService& prefs,
-                                                       CountryId country_id,
-                                                       int prepopulated_id) {
-  return FindPrepopulatedEngineInternal(prefs, country_id, prepopulated_id,
+std::unique_ptr<TemplateURLData> GetPrepopulatedEngine(
+    PrefService& prefs,
+    std::vector<const TemplateURLPrepopulateData::PrepopulatedEngine*>
+        regional_prepopulated_engines,
+    int prepopulated_id) {
+  return FindPrepopulatedEngineInternal(prefs, regional_prepopulated_engines,
+                                        prepopulated_id,
                                         /*use_first_as_fallback=*/false);
 }
 
@@ -224,20 +159,23 @@
 std::vector<std::unique_ptr<TemplateURLData>> GetLocalPrepopulatedEngines(
     const std::string& country_code,
     PrefService& prefs) {
-  CountryId country_id(country_code);
+  country_codes::CountryId country_id(country_code);
   if (!country_id.IsValid()) {
     LOG(ERROR) << "Unknown country code specified: " << country_code;
     return std::vector<std::unique_ptr<TemplateURLData>>();
   }
 
-  return GetPrepopulatedTemplateURLData(country_id, prefs);
+  return base::ToVector(
+      regional_capabilities::GetPrepopulatedEngines(country_id, prefs),
+      &PrepopulatedEngineToTemplateURLData);
 }
 
 #endif
 
 std::unique_ptr<TemplateURLData> GetPrepopulatedEngineFromFullList(
     PrefService& prefs,
-    CountryId country_id,
+    std::vector<const TemplateURLPrepopulateData::PrepopulatedEngine*>
+        regional_prepopulated_engines,
     int prepopulated_id) {
   // TODO(crbug.com/40940777): Refactor to better share code with
   // `GetPrepopulatedEngine()`.
@@ -258,9 +196,9 @@
   // We look in the profile country's prepopulated set first. This is intended
   // to help using the right entry for the case where we have multiple ones in
   // the full list that share a same prepopulated id.
-  const auto& engines = GetRegionalSettings(country_id).search_engines;
-  if (auto iter = std::ranges::find_if(engines, engine_matcher);
-      iter != engines.end()) {
+  if (auto iter =
+          std::ranges::find_if(regional_prepopulated_engines, engine_matcher);
+      iter != regional_prepopulated_engines.end()) {
     return PrepopulatedEngineToTemplateURLData(*iter);
   }
 
@@ -286,8 +224,10 @@
 
 std::unique_ptr<TemplateURLData> GetPrepopulatedFallbackSearch(
     PrefService& prefs,
-    CountryId country_id) {
-  return FindPrepopulatedEngineInternal(prefs, country_id, google.id,
+    std::vector<const TemplateURLPrepopulateData::PrepopulatedEngine*>
+        regional_prepopulated_engines) {
+  return FindPrepopulatedEngineInternal(prefs, regional_prepopulated_engines,
+                                        google.id,
                                         /*use_first_as_fallback=*/true);
 }
 
@@ -295,33 +235,5 @@
   return kAllEngines;
 }
 
-std::vector<std::unique_ptr<TemplateURLData>>
-GetAllEeaRegionPrepopulatedEngines() {
-  std::vector<std::unique_ptr<TemplateURLData>> result;
-
-  // We use a `flat_set` to filter out engines that have the same prepopulated
-  // id. For example, `yahoo_fr` and `yahoo_de` have the same prepopulated id
-  // because they point to the same search engine so we only want to record one
-  // instance.
-  base::flat_set<int> used_engines;
-  for (CountryId eea_country_id :
-       regional_capabilities::kEeaChoiceCountriesIds) {
-    const auto& search_engines =
-        GetRegionalSettings(eea_country_id).search_engines;
-
-    for (const auto* engine : search_engines) {
-      if (auto [_, added] = used_engines.emplace(engine->id); added) {
-        result.push_back(PrepopulatedEngineToTemplateURLData(engine));
-      }
-    }
-  }
-
-  return result;
-}
-
-std::vector<std::unique_ptr<TemplateURLData>> GetDefaultPrepopulatedEngines() {
-  return base::ToVector(GetRegionalSettings(CountryId()).search_engines,
-                        &PrepopulatedEngineToTemplateURLData);
-}
 
 }  // namespace TemplateURLPrepopulateData
diff --git a/components/search_engines/template_url_prepopulate_data.h b/components/search_engines/template_url_prepopulate_data.h
index 612c90b..dcfd1d23 100644
--- a/components/search_engines/template_url_prepopulate_data.h
+++ b/components/search_engines/template_url_prepopulate_data.h
@@ -12,9 +12,7 @@
 #include <vector>
 
 #include "base/containers/span.h"
-#include "base/memory/raw_ptr.h"
 #include "build/build_config.h"
-#include "components/country_codes/country_codes.h"
 
 class PrefService;
 struct TemplateURLData;
@@ -25,9 +23,6 @@
 
 namespace TemplateURLPrepopulateData {
 
-// The ID of a country. See `//components/country_codes` for details.
-using CountryId = country_codes::CountryId;
-
 struct PrepopulatedEngine;
 
 extern const int kMaxPrepopulatedEngineID;
@@ -37,10 +32,14 @@
 //
 // Note: If this is increased, please also increase the declared variant count
 // for the `Search.ChoiceScreenShowedEngineAt.Index{Index}` histogram.
+// TODO(crbug.com/408932087): Investigate moving it to the file that actually
+// populates these, `//c/regional_capabilities/r*c*_util.cc`.
 inline constexpr size_t kMaxEeaPrepopulatedEngines = 8;
 
 // The maximum number of prepopulated search engines that can be returned in
 // in the rest of the world by `GetPrepopulatedEngines()`.
+// TODO(crbug.com/408932087): Investigate deduping it with the constant
+// `kTopSearchEnginesThreshold` in `//c/regional_capabilities/r*c*_util.cc`.
 inline constexpr size_t kMaxRowPrepopulatedEngines = 5;
 
 void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
@@ -50,27 +49,33 @@
 // file then it returns the version specified there.
 int GetDataVersion(PrefService* prefs);
 
-// Returns the prepopulated URLs for the given country.
+// Resolves the prepopulated Template URLs to use, resolving priority between
+// regional data and profile-specific data.
 std::vector<std::unique_ptr<TemplateURLData>> GetPrepopulatedEngines(
     PrefService& prefs,
-    CountryId country_id);
+    std::vector<const TemplateURLPrepopulateData::PrepopulatedEngine*>
+        regional_prepopulated_engines);
 
 // Returns the prepopulated search engine with the given `prepopulated_id`
-// from the given country's known prepopulated search engines, or `nullptr`
-// if it's not known there.
-std::unique_ptr<TemplateURLData> GetPrepopulatedEngine(PrefService& prefs,
-                                                       CountryId country_id,
-                                                       int prepopulated_id);
+// or `nullptr` if it's not known there.
+// See `GetPrepopulatedEngines()` for more about how we get prepopulated
+// template URLs.
+std::unique_ptr<TemplateURLData> GetPrepopulatedEngine(
+    PrefService& prefs,
+    std::vector<const TemplateURLPrepopulateData::PrepopulatedEngine*>
+        regional_prepopulated_engines,
+    int prepopulated_id);
 
 // Returns the prepopulated search engine with the given `prepopulated_id`
 // from the full list of known prepopulated search engines, or `nullptr` if
 // it's not known there.
-// `country_id` is used to ensure we prioritise returning a search engine
-// relevant for the given country, for cases where the `prepopulated_id` could
-// be associated with multiple country-specific variants.
+// The region-specific list is used to ensure we prioritise returning a search
+// engine relevant for the given country, for cases where the `prepopulated_id`
+// could be associated with multiple country-specific variants.
 std::unique_ptr<TemplateURLData> GetPrepopulatedEngineFromFullList(
     PrefService& prefs,
-    CountryId country_id,
+    std::vector<const TemplateURLPrepopulateData::PrepopulatedEngine*>
+        regional_prepopulated_engines,
     int prepopulated_id);
 
 #if BUILDFLAG(IS_ANDROID)
@@ -88,27 +93,20 @@
 // Returns the fallback default search provider, currently hardcoded to be
 // Google, or whichever one is the first of the list if Google is not in the
 // list of prepopulated search engines.
-// Search provider overrides are read from `prefs`, so they won't be used if
-// it's null.
-// `country_id` is used to ensure we prioritise returning a search engine
-// relevant for the given country, for cases where the `prepopulated_id` could
-// be associated with multiple country-specific variants.
+// Search provider overrides are read from `prefs`.
+// The region-specific list is used to ensure we prioritise returning a search
+// engine relevant for the given country, for cases where the `prepopulated_id`
+// could be associated with multiple country-specific variants.
 // May return `nullptr` if for some reason there are no prepopulated search
 // engines available.
 std::unique_ptr<TemplateURLData> GetPrepopulatedFallbackSearch(
     PrefService& prefs,
-    CountryId country_id);
+    std::vector<const TemplateURLPrepopulateData::PrepopulatedEngine*>
+        regional_prepopulated_engines);
 
 // Returns all prepopulated engines for all locales.
 const base::span<const PrepopulatedEngine* const> GetAllPrepopulatedEngines();
 
-// Returns all the prepopulated engines that are used in the EEA region.
-std::vector<std::unique_ptr<TemplateURLData>>
-GetAllEeaRegionPrepopulatedEngines();
-
-// Returns the set of search engines that is used when the country is unknown.
-std::vector<std::unique_ptr<TemplateURLData>> GetDefaultPrepopulatedEngines();
-
 }  // namespace TemplateURLPrepopulateData
 
 #endif  // COMPONENTS_SEARCH_ENGINES_TEMPLATE_URL_PREPOPULATE_DATA_H_
diff --git a/components/search_engines/template_url_prepopulate_data_resolver.cc b/components/search_engines/template_url_prepopulate_data_resolver.cc
index ff3a78df..ab14d28 100644
--- a/components/search_engines/template_url_prepopulate_data_resolver.cc
+++ b/components/search_engines/template_url_prepopulate_data_resolver.cc
@@ -7,7 +7,6 @@
 #include <optional>
 
 #include "components/prefs/pref_service.h"
-#include "components/regional_capabilities/access/country_access_reason.h"
 #include "components/regional_capabilities/regional_capabilities_country_id.h"
 #include "components/regional_capabilities/regional_capabilities_service.h"
 #include "components/regional_capabilities/regional_capabilities_utils.h"
@@ -15,9 +14,6 @@
 #include "components/search_engines/template_url_data.h"
 #include "components/search_engines/template_url_prepopulate_data.h"
 
-using regional_capabilities::CountryAccessKey;
-using regional_capabilities::CountryAccessReason;
-
 namespace TemplateURLPrepopulateData {
 
 Resolver::Resolver(
@@ -29,22 +25,14 @@
     const {
   return TemplateURLPrepopulateData::GetPrepopulatedEngines(
       profile_prefs_.get(),
-      // TODO(crbug.com/328040066): Refactor the `TemplateURLPrepopulateData`
-      // helpers to accept `CountryIdHolder` and extract the raw country ID
-      // only where it needs to be used.
-      regional_capabilities_->GetCountryId().GetRestricted(CountryAccessKey(
-          CountryAccessReason::kTemplateURLPrepopulateDataResolution)));
+      regional_capabilities_->GetRegionalPrepopulatedEngines());
 }
 
 std::unique_ptr<TemplateURLData> Resolver::GetPrepopulatedEngine(
     int prepopulated_id) const {
   return TemplateURLPrepopulateData::GetPrepopulatedEngine(
       profile_prefs_.get(),
-      // TODO(crbug.com/328040066): Refactor the `TemplateURLPrepopulateData`
-      // helpers to accept `CountryIdHolder` and extract the raw country ID
-      // only where it needs to be used.
-      regional_capabilities_->GetCountryId().GetRestricted(CountryAccessKey(
-          CountryAccessReason::kTemplateURLPrepopulateDataResolution)),
+      regional_capabilities_->GetRegionalPrepopulatedEngines(),
       prepopulated_id);
 }
 
@@ -52,22 +40,14 @@
     int prepopulated_id) const {
   return TemplateURLPrepopulateData::GetPrepopulatedEngineFromFullList(
       profile_prefs_.get(),
-      // TODO(crbug.com/328040066): Refactor the `TemplateURLPrepopulateData`
-      // helpers to accept `CountryIdHolder` and extract the raw country ID
-      // only where it needs to be used.
-      regional_capabilities_->GetCountryId().GetRestricted(CountryAccessKey(
-          CountryAccessReason::kTemplateURLPrepopulateDataResolution)),
+      regional_capabilities_->GetRegionalPrepopulatedEngines(),
       prepopulated_id);
 }
 
 std::unique_ptr<TemplateURLData> Resolver::GetFallbackSearch() const {
   return TemplateURLPrepopulateData::GetPrepopulatedFallbackSearch(
       profile_prefs_.get(),
-      // TODO(crbug.com/328040066): Refactor the `TemplateURLPrepopulateData`
-      // helpers to accept `CountryIdHolder` and extract the raw country ID
-      // only where it needs to be used.
-      regional_capabilities_->GetCountryId().GetRestricted(CountryAccessKey(
-          CountryAccessReason::kTemplateURLPrepopulateDataResolution)));
+      regional_capabilities_->GetRegionalPrepopulatedEngines());
 }
 
 std::optional<BuiltinKeywordsMetadata>
diff --git a/components/search_engines/template_url_service_test_util.cc b/components/search_engines/template_url_service_test_util.cc
index 22eaa3f..4205b18b 100644
--- a/components/search_engines/template_url_service_test_util.cc
+++ b/components/search_engines/template_url_service_test_util.cc
@@ -10,9 +10,11 @@
 #include "components/country_codes/country_codes.h"
 #include "components/metrics/metrics_pref_names.h"
 #include "components/os_crypt/async/browser/test_utils.h"
+#include "components/regional_capabilities/regional_capabilities_prefs.h"
 #include "components/regional_capabilities/regional_capabilities_service.h"
 #include "components/regional_capabilities/regional_capabilities_switches.h"
 #include "components/regional_capabilities/regional_capabilities_test_utils.h"
+#include "components/regional_capabilities/regional_capabilities_utils.h"
 #include "components/search_engines/keyword_table.h"
 #include "components/search_engines/search_engine_choice/search_engine_choice_service.h"
 #include "components/search_engines/search_terms_data.h"
@@ -26,6 +28,7 @@
     user_prefs::PrefRegistrySyncable* registry) {
   TemplateURLService::RegisterProfilePrefs(registry);
   TemplateURLPrepopulateData::RegisterProfilePrefs(registry);
+  regional_capabilities::prefs::RegisterProfilePrefs(registry);
   DefaultSearchManager::RegisterProfilePrefs(registry);
 }
 
@@ -149,7 +152,7 @@
   template_url_service_load_waiter_.WaitForLoadComplete(template_url_service());
 
   ASSERT_EQ(GetKeywordTemplateURLs().size(),
-            TemplateURLPrepopulateData::GetDefaultPrepopulatedEngines().size());
+            regional_capabilities::GetDefaultPrepopulatedEngines().size());
 }
 
 void LoadedTemplateURLServiceUnitTestBase::TearDown() {
diff --git a/components/signin/core/browser/signin_metrics_service.cc b/components/signin/core/browser/signin_metrics_service.cc
index b07e48a..9aabff0 100644
--- a/components/signin/core/browser/signin_metrics_service.cc
+++ b/components/signin/core/browser/signin_metrics_service.cc
@@ -184,6 +184,7 @@
     case signin_metrics::AccessPoint::kHistoryPage:
     case signin_metrics::AccessPoint::kCollaborationJoinTabGroup:
     case signin_metrics::AccessPoint::kHistorySyncOptinExpansionPill:
+    case signin_metrics::AccessPoint::kWidget:
       return;
   }
 
diff --git a/components/signin/public/base/signin_metrics.cc b/components/signin/public/base/signin_metrics.cc
index ef6e1ac0..3307f3c 100644
--- a/components/signin/public/base/signin_metrics.cc
+++ b/components/signin/public/base/signin_metrics.cc
@@ -464,6 +464,7 @@
     case AccessPoint::kDriveFilePickerIos:
     case AccessPoint::kHistoryPage:
     case AccessPoint::kHistorySyncOptinExpansionPill:
+    case AccessPoint::kWidget:
       NOTREACHED() << "Access point " << static_cast<int>(access_point)
                    << " is not supposed to log signin user actions.";
     case AccessPoint::kCollaborationShareTabGroup:
@@ -748,6 +749,7 @@
     case AccessPoint::kHistoryPage:
     case AccessPoint::kCollaborationJoinTabGroup:
     case AccessPoint::kHistorySyncOptinExpansionPill:
+    case AccessPoint::kWidget:
       NOTREACHED() << "Signin_Impression_From* user actions are not recorded "
                       "for access point "
                    << static_cast<int>(access_point);
diff --git a/components/signin/public/base/signin_metrics.h b/components/signin/public/base/signin_metrics.h
index 2eb423d5..0286609 100644
--- a/components/signin/public/base/signin_metrics.h
+++ b/components/signin/public/base/signin_metrics.h
@@ -269,10 +269,13 @@
   // Access point triggered when a user attempts to opt-in to history sync from
   // the history sync opt-in expanded pill.
   kHistorySyncOptinExpansionPill = 77,
+  // Access point triggered when the account used in widget is different from
+  // the one used in the app. iOS only.
+  kWidget = 78,
   // Add values above this line with a corresponding label to the
   // "SigninAccessPoint" enum in
   // tools/metrics/histograms/metadata/signin/enums.xml.
-  kMaxValue = kHistorySyncOptinExpansionPill,  // This must be last.
+  kMaxValue = kWidget,  // This must be last.
 };
 // LINT.ThenChange(/tools/metrics/histograms/metadata/signin/enums.xml)
 
diff --git a/components/signin/public/base/signin_metrics_unittest.cc b/components/signin/public/base/signin_metrics_unittest.cc
index 4f07e9ca..4d66ee2 100644
--- a/components/signin/public/base/signin_metrics_unittest.cc
+++ b/components/signin/public/base/signin_metrics_unittest.cc
@@ -225,6 +225,8 @@
         return "CollaborationJoinTabGroup";
       case AccessPoint::kHistorySyncOptinExpansionPill:
         return "HistorySyncOptinExpansionPill";
+      case AccessPoint::kWidget:
+        return "Widget";
     }
   }
 };
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb
index 26a43613..c1056e0 100644
--- a/components/strings/components_strings_am.xtb
+++ b/components/strings/components_strings_am.xtb
@@ -1923,6 +1923,7 @@
 <translation id="4282346679996504092">የዚህ ምርት ማንቂያዎች ጠፍተዋል እና ዕልባቱ ተወግዷል</translation>
 <translation id="4285498937028063278">ይንቀሉ</translation>
 <translation id="4287495839370498922">በChrome ውስጥ የተሻሻለ የማስታወቂያ ግላዊነት</translation>
+<translation id="4288101205645068104">ተሽከርካሪን ይሰርዙ</translation>
 <translation id="4290920330097335010">መቼም አትፍቀድ</translation>
 <translation id="4296207570293932800">አዲስ የማስታወቂያ የግላዊነት ባህሪ አሁን ይገኛል</translation>
 <translation id="4297502707443874121">የገጽ <ph name="THUMBNAIL_PAGE" /> ድንክዬ</translation>
@@ -4197,6 +4198,7 @@
 <translation id="8280630997017109758">መሳቢያ 11</translation>
 <translation id="8281730697546299650">ሌሎች የማስታወቂያ የግላዊነት ባህሪያት አሁን ይገኛሉ</translation>
 <translation id="8281886186245836920">ዝለል</translation>
+<translation id="8282292167096638950">የመንጃ ፈቃድን ይሰርዙ</translation>
 <translation id="8282409409360764263">የጓሮ ጥገና</translation>
 <translation id="8282947398454257691">የእርስዎን ልዩ የመሣሪያ ለይቶ ማወቂያ ይወቁ</translation>
 <translation id="8284769179630993263">በChrome ቅንብሮች ውስጥ የጥንቃቄ አሰሳ እና ሌሎችንም ያቀናብሩ</translation>
@@ -4224,6 +4226,7 @@
 <translation id="8321476692217554900">ማሳወቂያዎች</translation>
 <translation id="8322402665880479974">አልጋዎች እና የራስጌ ቦርዶች</translation>
 <translation id="8323505966575306467">ለይለፍ ቃላቶችዎ ተጨማሪ ጥበቃ ያክሉ</translation>
+<translation id="832547548543012337">ፓስፖርትን ይሰርዙ</translation>
 <translation id="832567874344484841">የቁርስ ምግቦች</translation>
 <translation id="8329068931308448247">#14 ፖስታ</translation>
 <translation id="8332188693563227489">የ<ph name="HOST_NAME" /> መዳረሻ ተከልክሏል</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index f5b2c94..a635ace0 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -528,6 +528,7 @@
 <translation id="1890171020361705182">لعبة الديناصور. ديناصور في صورة متقطعة يتفادى عوائق نباتات الصبار عن طريق الزحف والقفز أثناء المرور في صحراء قاحلة. عند سماع صوت التنبيه، انقر على الشاشة للقفز فوق العوائق.</translation>
 <translation id="1898423065542865115">التصفية</translation>
 <translation id="1901443836186977402">{1,plural, =1{هذا الخادم لم يتمكن من إثبات أنه <ph name="DOMAIN" />، لقد انتهت صلاحية شهادة الأمان الخاصة به في آخر يوم. يمكن أن يكون سبب ذلك خطأ في الضبط أو أن مخترِقًا يعترض اتصالك. تم ضبط ساعة الكمبيوتر حاليًا على <ph name="CURRENT_DATE" />. هل الساعة صحيحة؟ إذا لم تكن كذلك، يجب تصحيح ساعة النظام، ثم إعادة تحميل هذه الصفحة.}zero{هذا الخادم لم يتمكن من إثبات أنه <ph name="DOMAIN" />، لقد انتهت صلاحية شهادة الأمان الخاصة به منذ # يوم. ويمكن أن يكون سبب ذلك خطأ في الضبط أو أن مخترِقًا يعترض الاتصال. تم ضبط ساعة الكمبيوتر حاليًا على <ph name="CURRENT_DATE" />. هل الساعة صحيحة؟ إذا لم تكن كذلك، يجب تصحيح ساعة النظام، ثم إعادة تحميل هذه الصفحة.}two{هذا الخادم لم يتمكن من إثبات أنه <ph name="DOMAIN" />، لقد انتهت صلاحية شهادة الأمان الخاصة به منذ يومين. ويمكن أن يكون سبب ذلك خطأ في الضبط أو أن مخترِقًا يعترض الاتصال. تم ضبط ساعة الكمبيوتر حاليًا على <ph name="CURRENT_DATE" />. هل الساعة صحيحة؟ إذا لم تكن كذلك، يجب تصحيح ساعة النظام، ثم إعادة تحميل هذه الصفحة.}few{هذا الخادم لم يتمكن من إثبات أنه <ph name="DOMAIN" />، لقد انتهت صلاحية شهادة الأمان الخاصة به منذ # أيام. ويمكن أن يكون سبب ذلك خطأ في الضبط أو أن مخترِقًا يعترض الاتصال. تم ضبط ساعة الكمبيوتر حاليًا على <ph name="CURRENT_DATE" />. هل الساعة صحيحة؟ إذا لم تكن كذلك، يجب تصحيح ساعة النظام، ثم إعادة تحميل هذه الصفحة.}many{هذا الخادم لم يتمكن من إثبات أنه <ph name="DOMAIN" />، لقد انتهت صلاحية شهادة الأمان الخاصة به منذ # يومًا. ويمكن أن يكون سبب ذلك خطأ في الضبط أو أن مخترِقًا يعترض الاتصال. تم ضبط ساعة الكمبيوتر حاليًا على <ph name="CURRENT_DATE" />. هل الساعة صحيحة؟ إذا لم تكن كذلك، يجب تصحيح ساعة النظام، ثم إعادة تحميل هذه الصفحة.}other{هذا الخادم لم يتمكن من إثبات أنه <ph name="DOMAIN" />، لقد انتهت صلاحية شهادة الأمان الخاصة به منذ # يوم. ويمكن أن يكون سبب ذلك خطأ في الضبط أو أن مخترِقًا يعترض الاتصال. تم ضبط ساعة الكمبيوتر حاليًا على <ph name="CURRENT_DATE" />. هل الساعة صحيحة؟ إذا لم تكن كذلك، يجب تصحيح ساعة النظام، ثم إعادة تحميل هذه الصفحة.}}</translation>
+<translation id="190166348986967700">‏سيبدأ المشرف تحميل ملفاتك إلى <ph name="CLOUD_PROVIDER" /> في ‎<ph name="DATE_TIME" />. لذا يُرجى إبقاء جهازك متصلاً حتى تكتمل عملية تحميل الملف. وأثناء عملية التحميل، ستتمكّن من قراءة الملفات المخزَّنة على الجهاز فقط.</translation>
 <translation id="1902576642799138955">فترة الصلاحية</translation>
 <translation id="1908217026282415406">استخدام الكاميرا وتحريكها</translation>
 <translation id="1908690643053136980">لا يسمح المشرف باستخدام <ph name="PERMISSION" /> لهذا الموقع الإلكتروني</translation>
@@ -759,7 +760,7 @@
 <translation id="2292556288342944218">تم حظر دخولك إلى الإنترنت</translation>
 <translation id="2293443924986248631">عند تفعيل هذه الميزة، لا يمكن للمواقع الإلكترونية استخدام ملفات تعريف الارتباط لتتبّع نشاط تصفحّك على الإنترنت. وقد تتوقف الميزات عن العمل في بعض المواقع الإلكترونية.</translation>
 <translation id="2295831393422400053">يجب تفعيل إعداد "تحسين عمليات البحث والتصفُّح" لاستخدام ميزة "مساعدة في الكتابة".</translation>
-<translation id="2296244067976588032">‏مفتاح المرور • iCloud Keychain</translation>
+<translation id="2296244067976588032">‏مفتاح المرور • سلسلة مفاتيح iCloud</translation>
 <translation id="2296331629987861142">يمكنك التسديد على أقساط سهلة الدفع (وفقًا للأهلية ومع تطبيق رسوم)</translation>
 <translation id="2300306941146563769">لم يتم التحميل</translation>
 <translation id="2301098101308036335">قائمة المواقع الإلكترونية التي تمت زيارتها ووقت زيارتها</translation>
@@ -2156,6 +2157,7 @@
 <translation id="473775607612524610">تحديث</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> اقتراحات البحث</translation>
 <translation id="4742407542027196863">إدارة كلمات المرور…</translation>
+<translation id="474270528725216349">من موقع إلكتروني واحد على الأقل على الأجهزة التي تمت مزامنتها</translation>
 <translation id="4743275772928623722">تم تحديث نظامك لكن تعذَّر استرداد بعض تطبيقاتك وملفاتك. سيتم تنزيل تطبيقاتك تلقائيًا مرة أخرى.</translation>
 <translation id="4744514002166662487">إنشاء عرض تقديمي</translation>
 <translation id="4744603770635761495">المسار التنفيذي</translation>
@@ -2286,6 +2288,7 @@
 <translation id="495170559598752135">إجراءات</translation>
 <translation id="4953689047182316270">الاستجابة لأحداث إمكانية الوصول</translation>
 <translation id="4957080528849277028">‏زر عرض سجلّ Chrome: انقر على هذا الزر لعرض سجلّ التصفّح وإدارته في إعدادات Chrome.</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{بالإضافة إلى موقع إلكتروني واحد}zero{بالإضافة إلى # موقع إلكتروني}two{بالإضافة إلى موقعَين إلكترونيَين}few{بالإضافة إلى # مواقع إلكترونية}many{بالإضافة إلى # موقعًا إلكترونيًا}other{بالإضافة إلى # موقع إلكتروني}}</translation>
 <translation id="4958444002117714549">توسيع القائمة</translation>
 <translation id="4960068118612257147">‏يمكنك إجراء تغييرات في إعدادات "الخصوصية في عرض الإعلانات" على Chrome.</translation>
 <translation id="4960203958361543136">اختيار محرك البحث</translation>
@@ -2620,8 +2623,10 @@
 <translation id="553377674408670169">وظائف تعليمية</translation>
 <translation id="5534785731327961487">صفقة جيدة الآن</translation>
 <translation id="5536214594743852365">عرض القسم "<ph name="SECTION" />"</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{بالإضافة إلى موقع إلكتروني واحد (المزيد على الأجهزة التي تمت مزامنتها)}zero{بالإضافة إلى # موقع إلكتروني (المزيد على الأجهزة التي تمت مزامنتها)}two{بالإضافة إلى موقعَين إلكترونيَين (المزيد على الأجهزة التي تمت مزامنتها)}few{بالإضافة إلى # مواقع إلكترونية (المزيد على الأجهزة التي تمت مزامنتها)}many{بالإضافة إلى # موقعًا إلكترونيًا (المزيد على الأجهزة التي تمت مزامنتها)}other{بالإضافة إلى # موقع إلكتروني (المزيد على الأجهزة التي تمت مزامنتها)}}</translation>
 <translation id="553782666181800029">‏ظرف Chou 2</translation>
 <translation id="5538270463355278784">وضع ملء الشاشة تلقائيًا</translation>
+<translation id="5538859347764346097">‫<ph name="KEYWORD_SHORTCUT" />، بحث في <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="5539243836947087108">Raft</translation>
 <translation id="5540224163453853">تعذر العثور على المقالة المطلوبة</translation>
 <translation id="5540969246441091044">فروسية</translation>
@@ -2780,6 +2785,7 @@
 <translation id="5838278095973806738">يجب عدم إدخال معلومات حسّاسة على هذا الموقع (مثل كلمات المرور أو بطاقات الائتمان) لأنه قد تتم سرقتها من قِبل المهاجمين.</translation>
 <translation id="5838732667866024867">يمكنك استخدام السهم المتّجه لليسار أو لليمين لمراجعة تغييرات السعر على الرسم البياني.</translation>
 <translation id="5840318881868981258">‏سيتم حفظ التعديل في حسابك على Google،‏ <ph name="ACCOUNT" />.</translation>
+<translation id="5841007907672481419">من <ph name="TYPE_1" /></translation>
 <translation id="5841338463993781099">هل تريد الحفظ في الحساب؟</translation>
 <translation id="5843987376989109187">هذه اللغة غير متوفّرة بعد.
     <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
@@ -2793,6 +2799,7 @@
 <translation id="5863515189965725638">‏تعديل رقم الحساب بصيغة IBAN</translation>
 <translation id="5863847714970149516">قد تحاول الصفحة التالية تحصيل رسوم منك</translation>
 <translation id="5866257070973731571">إضافة رقم الهاتف</translation>
+<translation id="5866327164731551901">من <ph name="TYPE_1" /> <ph name="TYPE_2" /></translation>
 <translation id="5866898949289125849">أنت تطّلع على صفحة أدوات المطوّرين.</translation>
 <translation id="5869405914158311789">لا يمكن الوصول إلى الموقع الإلكتروني هذا</translation>
 <translation id="5869522115854928033">كلمات المرور المحفوظة</translation>
@@ -3502,6 +3509,7 @@
 <translation id="7075452647191940183">الطلب كبير جدًا</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
+<translation id="7079783554682867524">من <ph name="TYPE_1" /> (المزيد على الأجهزة التي تمت مزامنتها)</translation>
 <translation id="7081311540357715807">بائعو تجزئة للمواد الغذائية ومنتجات البقالة</translation>
 <translation id="7083258188081898530">الدُرج 9</translation>
 <translation id="7086090958708083563">طلب التحميل مقدّم من المستخدم</translation>
@@ -4159,6 +4167,7 @@
 <translation id="8216640997712497593">14 × 18 بوصة</translation>
 <translation id="8218327578424803826">الموقع الذي تم تعيينه:</translation>
 <translation id="8220602974062798186">هل تريد حظر "<ph name="TOPIC" />" وأي مواضيع ذات صلة؟</translation>
+<translation id="8226408512771130794">‫<ph name="KEYWORD_SHORTCUT" />، سؤال <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="8228419419708659934">عرض صفحتين</translation>
 <translation id="8228477714872026922">هناك طلب من <ph name="ORIGIN" /> بالوصول إلى جهاز على شبكتك:</translation>
 <translation id="822925450938886901">‏للاطّلاع على المعلومات الإضافية والسياسات التي قد تنطبق عليك، افتح chrome://management في المتصفِّح.</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb
index 6ff233a..a1bdc42 100644
--- a/components/strings/components_strings_bs.xtb
+++ b/components/strings/components_strings_bs.xtb
@@ -528,7 +528,7 @@
 <translation id="1890171020361705182">Igra s dinosaurom. Pikselizirani dinosaur izbjegava kaktuse i pterodaktile dok trči pustim krajolicima. Kada čujete zvučni signal, dodirnite da preskačete prepreke.</translation>
 <translation id="1898423065542865115">Filtriranje</translation>
 <translation id="1901443836186977402">{1,plural, =1{Ovaj server ne može dokazati da pripada domeni <ph name="DOMAIN" />; njegova potvrda sigurnosti je istekla jučer. Uzrok tome može biti pogrešna konfiguracija ili napadač koji je prekinuo vašu vezu. Sat na vašem računaru je trenutno postavljen na <ph name="CURRENT_DATE" />. Je li to uredu? Ako nije, trebate podesiti sistemski sat i zatim osvježiti stranicu.}one{Ovaj server ne može dokazati da pripada domeni <ph name="DOMAIN" />; njegova potvrda sigurnosti je istekla prije # dan. Uzrok tome može biti pogrešna konfiguracija ili napadač koji je prekinuo vašu vezu. Sat na vašem računaru je trenutno postavljen na <ph name="CURRENT_DATE" />. Je li to uredu? Ako nije, trebate podesiti sistemski sat i zatim osvježiti stranicu.}few{Ovaj server ne može dokazati da pripada domeni <ph name="DOMAIN" />; njegova potvrda sigurnosti je istekla prije # dana. Uzrok tome može biti pogrešna konfiguracija ili napadač koji je prekinuo vašu vezu. Sat na vašem računaru je trenutno postavljen na <ph name="CURRENT_DATE" />. Je li to uredu? Ako nije, trebate podesiti sistemski sat i zatim osvježiti stranicu.}other{Ovaj server ne može dokazati da pripada domeni <ph name="DOMAIN" />; njegova potvrda sigurnosti je istekla prije # dana. Uzrok tome može biti pogrešna konfiguracija ili napadač koji je prekinuo vašu vezu. Sat na vašem računaru je trenutno postavljen na <ph name="CURRENT_DATE" />. Je li to uredu? Ako nije, trebate podesiti sistemski sat i zatim osvježiti stranicu.}}</translation>
-<translation id="190166348986967700">Administrator će početi prenositi vaše datoteke na uslugu <ph name="CLOUD_PROVIDER" /> <ph name="DATE_TIME" />. Neka uređaj ostane povezan dok se prijenos datoteka ne dovrši. Tijekom prijenosa moći ćete čitati samo lokalne datoteke.</translation>
+<translation id="190166348986967700">Administrator će početi otpremati fajlove na uslugu <ph name="CLOUD_PROVIDER" /> <ph name="DATE_TIME" />. Ostavite uređaj povezan dok se otpremanje fajlova ne završi. Tokom otpremanja ćete moći samo čitati lokalne fajlove.</translation>
 <translation id="1902576642799138955">Period važenja</translation>
 <translation id="1908217026282415406">Korištenje kamere i pomjeranje</translation>
 <translation id="1908690643053136980">Administrator nije dao odobrenje "<ph name="PERMISSION" />" ovoj web lokaciji</translation>
@@ -2155,7 +2155,7 @@
 <translation id="473775607612524610">Ažuriraj</translation>
 <translation id="4738601419177586157">Prijedlog za pretraživanje: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Upravljanje lozinkama…</translation>
-<translation id="474270528725216349">S najmanje jedne web-lokacije na sinkroniziranim uređajima</translation>
+<translation id="474270528725216349">S najmanje 1 web lokacije na sinhroniziranim uređajima</translation>
 <translation id="4743275772928623722">Sistem je ažuriran, ali neke aplikacije i fajlovi se nisu mogli vratiti. Vaše aplikacije će se automatski ponovo preuzeti.</translation>
 <translation id="4744514002166662487">Kreiraj prezentaciju</translation>
 <translation id="4744603770635761495">Izvršna putanja</translation>
@@ -2286,7 +2286,7 @@
 <translation id="495170559598752135">Radnje</translation>
 <translation id="4953689047182316270">Odgovori na događaje vezane za pristupačnost</translation>
 <translation id="4957080528849277028">Dugme Upravljaj historijom Chromea, aktivirajte da pregledate historiju pregledanja i upravljate njome u postavkama Chromea</translation>
-<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{i još jedna web-lokacija}one{i još # web-lokacija}few{i još # web-lokacije}other{i još # web-lokacija}}</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{i još 1 web lokacija}one{i još # web lokacija}few{i još # web lokacije}other{i još # web lokacija}}</translation>
 <translation id="4958444002117714549">Proširi listu</translation>
 <translation id="4960068118612257147">Možete unijeti promjene u postavkama privatnosti pri izloženosti oglasima u Chromeu</translation>
 <translation id="4960203958361543136">Odaberite pretraživač</translation>
@@ -2621,10 +2621,10 @@
 <translation id="553377674408670169">Poslovi u obrazovanju</translation>
 <translation id="5534785731327961487">Dobra ponuda sada</translation>
 <translation id="5536214594743852365">Prikaži odjeljak "<ph name="SECTION" />"</translation>
-<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{i još 1 web-lokacija (više na sinkroniziranim uređajima)}one{i još # web-lokacija (više na sinkroniziranim uređajima)}few{i još # web-lokacije (više na sinkroniziranim uređajima)}other{i još # web-lokacija (više na sinkroniziranim uređajima)}}</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{i još 1 web lokacija (i druge na sinhroniziranim uređajima)}one{i još # web lokacija (i druge na sinhroniziranim uređajima)}few{i još # web lokacije (i druge na sinhroniziranim uređajima)}other{i još # web lokacija (i druge na sinhroniziranim uređajima)}}</translation>
 <translation id="553782666181800029">Koverta Chou 2</translation>
 <translation id="5538270463355278784">automatski prikaz preko cijelog ekrana</translation>
-<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />, Pretraži <ph name="KEYWORD_SUFFIX" /></translation>
+<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />, pretraživanje usluge <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="5539243836947087108">Baza</translation>
 <translation id="5540224163453853">Traženi članak nije pronađen.</translation>
 <translation id="5540969246441091044">Konjički sportovi</translation>
@@ -3507,7 +3507,7 @@
 <translation id="7075452647191940183">Zahtjev je prevelik</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
-<translation id="7079783554682867524">Izvor: <ph name="TYPE_1" /> (više na sinkroniziranim uređajima)</translation>
+<translation id="7079783554682867524">Izvor: <ph name="TYPE_1" /> (i druge na sinhroniziranim uređajima)</translation>
 <translation id="7081311540357715807">Maloprodaja hrane i namirnica</translation>
 <translation id="7083258188081898530">Ladica 9</translation>
 <translation id="7086090958708083563">Otpremanje je zatražio korisnik</translation>
@@ -4164,7 +4164,7 @@
 <translation id="8216640997712497593">14 x 18 in</translation>
 <translation id="8218327578424803826">Dodijeljena lokacija:</translation>
 <translation id="8220602974062798186">Blokirati temu <ph name="TOPIC" /> i sve povezane teme?</translation>
-<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />, Pitajte <ph name="KEYWORD_SUFFIX" /></translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />, postavljanje pitanja asistentu <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="8228419419708659934">Prikaži na dvije stranice</translation>
 <translation id="8228477714872026922"><ph name="ORIGIN" /> želi pristupiti uređaju na vašoj mreži:</translation>
 <translation id="822925450938886901">Za dodatne informacije i pravila koja se možda primjenjuju otvorite chrome://management u pregledniku.</translation>
diff --git a/components/strings/components_strings_cy.xtb b/components/strings/components_strings_cy.xtb
index 52afe48b..1df708a 100644
--- a/components/strings/components_strings_cy.xtb
+++ b/components/strings/components_strings_cy.xtb
@@ -528,6 +528,7 @@
 <translation id="1890171020361705182">Gêm Dino. Mae deinosor picsel yn osgoi cacti a pterodactyliaid wrth iddo redeg ar draws tirwedd anghyfannedd. Pan fyddwch yn clywed ciw sain, tapiwch i neidio dros rwystrau.</translation>
 <translation id="1898423065542865115">Hidlo</translation>
 <translation id="1901443836186977402">{1,plural, =1{Ni allai'r gweinydd hwn brofi ei fod yn <ph name="DOMAIN" />; gwnaeth ei dystysgrif ddiogelwch ddarfod o fewn y diwrnod diwethaf. Gall hyn gael ei achosi gan gamffurfweddiad neu ymosodwr yn rhyng-gipio'ch cysylltiad. Ar hyn o bryd mae cloc eich cyfrifiadur wedi'i osod i <ph name="CURRENT_DATE" />. A yw hynny'n edrych yn iawn? Os na, dylech gywiro cloc eich system ac ail-lwythwch y dudalen hon.}zero{Ni allai'r gweinydd hwn brofi ei fod yn <ph name="DOMAIN" />; gwnaeth ei dystysgrif ddiogelwch ddarfod # diwrnod yn ôl. Gall hyn gael ei achosi gan gamffurfweddiad neu ymosodwr yn rhyng-gipio'ch cysylltiad. Ar hyn o bryd mae cloc eich cyfrifiadur wedi'i osod i <ph name="CURRENT_DATE" />. A yw hynny'n edrych yn iawn? Os na, dylech gywiro cloc eich system ac ail-lwythwch y dudalen hon.}two{Ni allai'r gweinydd hwn brofi ei fod yn <ph name="DOMAIN" />; gwnaeth ei dystysgrif ddiogelwch ddarfod # ddiwrnod yn ôl. Gall hyn gael ei achosi gan gamffurfweddiad neu ymosodwr yn rhyng-gipio'ch cysylltiad. Ar hyn o bryd mae cloc eich cyfrifiadur wedi'i osod i <ph name="CURRENT_DATE" />. A yw hynny'n edrych yn iawn? Os na, dylech gywiro cloc eich system ac ail-lwythwch y dudalen hon.}few{Ni allai'r gweinydd hwn brofi ei fod yn <ph name="DOMAIN" />; gwnaeth ei dystysgrif ddiogelwch ddarfod # diwrnod yn ôl. Gall hyn gael ei achosi gan gamffurfweddiad neu ymosodwr yn rhyng-gipio'ch cysylltiad. Ar hyn o bryd mae cloc eich cyfrifiadur wedi'i osod i <ph name="CURRENT_DATE" />. A yw hynny'n edrych yn iawn? Os na, dylech gywiro cloc eich system ac ail-lwythwch y dudalen hon.}many{Ni allai'r gweinydd hwn brofi ei fod yn <ph name="DOMAIN" />; gwnaeth ei dystysgrif ddiogelwch ddarfod # diwrnod yn ôl. Gall hyn gael ei achosi gan gamffurfweddiad neu ymosodwr yn rhyng-gipio'ch cysylltiad. Ar hyn o bryd mae cloc eich cyfrifiadur wedi'i osod i <ph name="CURRENT_DATE" />. A yw hynny'n edrych yn iawn? Os na, dylech gywiro cloc eich system ac ail-lwythwch y dudalen hon.}other{Ni allai'r gweinydd hwn brofi ei fod yn <ph name="DOMAIN" />; gwnaeth ei dystysgrif ddiogelwch ddarfod # diwrnod yn ôl. Gall hyn gael ei achosi gan gamffurfweddiad neu ymosodwr yn rhyng-gipio'ch cysylltiad. Ar hyn o bryd mae cloc eich cyfrifiadur wedi'i osod i <ph name="CURRENT_DATE" />. A yw hynny'n edrych yn iawn? Os na, dylech gywiro cloc eich system ac ail-lwythwch y dudalen hon.}}</translation>
+<translation id="190166348986967700">Bydd eich gweinyddwr yn dechrau uwchlwytho'ch ffeiliau i <ph name="CLOUD_PROVIDER" /> ar <ph name="DATE_TIME" />. Cadwch eich dyfais wedi'i chysylltu nes bod eich uwchlwythiad ffeil wedi'i gwblhau. Wrth uwchlwytho, dim ond ffeiliau lleol y byddwch yn gallu eu darllen.</translation>
 <translation id="1902576642799138955">Cyfnod Dilysrwydd</translation>
 <translation id="1908217026282415406">Symudiad a defnydd camera</translation>
 <translation id="1908690643053136980">Nid yw eich gweinyddwr yn caniatáu <ph name="PERMISSION" /> ar gyfer y wefan hon</translation>
@@ -1924,6 +1925,7 @@
 <translation id="4282346679996504092">Mae hysbysiadau ar gyfer y cynnyrch hwn wedi'u diffodd a'r nod tudalen wedi'i ddileu</translation>
 <translation id="4285498937028063278">Dad-binio</translation>
 <translation id="4287495839370498922">Preifatrwydd hysbyseb gwell yn Chrome</translation>
+<translation id="4288101205645068104">Dileu cerbyd</translation>
 <translation id="4290920330097335010">Peidio byth â chaniatáu</translation>
 <translation id="4296207570293932800">Nodwedd preifatrwydd hysbyseb newydd ar gael nawr</translation>
 <translation id="4297502707443874121">Mân-lun ar gyfer tudalen <ph name="THUMBNAIL_PAGE" /></translation>
@@ -2153,6 +2155,7 @@
 <translation id="473775607612524610">Diweddaru</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> awgrym chwilio</translation>
 <translation id="4742407542027196863">Rheoli cyfrineiriau…</translation>
+<translation id="474270528725216349">Gan o leiaf 1 wefan ar ddyfeisiau sydd wedi'u cysoni</translation>
 <translation id="4743275772928623722">Diweddarwyd eich system ond nid oedd modd adfer rhai o'ch apiau a'ch ffeiliau. Bydd eich apiau yn cael eu lawrlwytho eto yn awtomatig.</translation>
 <translation id="4744514002166662487">Creu cyflwyniad</translation>
 <translation id="4744603770635761495">Llwybr Gweithredadwy</translation>
@@ -2283,6 +2286,7 @@
 <translation id="495170559598752135">Gweithrediadau</translation>
 <translation id="4953689047182316270">Ymateb i Ddigwyddiadau Hygyrchedd</translation>
 <translation id="4957080528849277028">Botwm gweld eich hanes Chrome, gweithredwch i weld a rheoli eich hanes pori yn y gosodiadau Chrome</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{+ 1 wefan}zero{+ # gwefannau}two{+ # wefan}few{+ # gwefan}many{+ # gwefan}other{+ # gwefan}}</translation>
 <translation id="4958444002117714549">Ehangu'r rhestr</translation>
 <translation id="4960068118612257147">Gallwch wneud newidiadau yng ngosodiadau preifatrwydd hysbysebion Chrome</translation>
 <translation id="4960203958361543136">Dewiswch Eich Peiriant Chwilio</translation>
@@ -2617,8 +2621,10 @@
 <translation id="553377674408670169">Swyddi Addysg</translation>
 <translation id="5534785731327961487">Bargen Dda Nawr</translation>
 <translation id="5536214594743852365">Dangos yr adran "<ph name="SECTION" />"</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{+1 wefan (rhagor ar ddyfeisiau sydd wedi'u cysoni)}zero{+ # gwefannau (rhagor ar ddyfeisiau sydd wedi'u cysoni)}two{+ # wefan (rhagor ar ddyfeisiau sydd wedi'u cysoni)}few{+ # gwefan (rhagor ar ddyfeisiau sydd wedi'u cysoni)}many{+ # gwefan (rhagor ar ddyfeisiau sydd wedi'u cysoni)}other{+ # gwefan (rhagor ar ddyfeisiau sydd wedi'u cysoni)}}</translation>
 <translation id="553782666181800029">Amlen Chou 2</translation>
 <translation id="5538270463355278784">sgrîn lawn awtomatig</translation>
+<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />, Chwilio <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="5539243836947087108">Rafft</translation>
 <translation id="5540224163453853">Methu â dod o hyd i'r erthygl y gofynnwyd amdani.</translation>
 <translation id="5540969246441091044">Marchogol</translation>
@@ -2777,6 +2783,7 @@
 <translation id="5838278095973806738">Ni ddylech roi unrhyw wybodaeth sensitif ar y wefan hon (er enghraifft, cyfrineiriau neu gardiau credyd), oherwydd gallai ymosodwyr ei dwyn.</translation>
 <translation id="5838732667866024867">Gallwch ddefnyddio'r saeth chwith/dde i adolygu newidiadau pris ar y graff</translation>
 <translation id="5840318881868981258">Yn eich Cyfrif Google, <ph name="ACCOUNT" /></translation>
+<translation id="5841007907672481419">O <ph name="TYPE_1" /></translation>
 <translation id="5841338463993781099">Cadw yn y cyfrif?</translation>
 <translation id="5843987376989109187">Nid yw'r iaith hon yn cael ei chefnogi eto.
     <ph name="BEGIN_LINK" />Dysgu rhagor<ph name="END_LINK" /></translation>
@@ -2790,6 +2797,7 @@
 <translation id="5863515189965725638">Golygu'r IBAN</translation>
 <translation id="5863847714970149516">Gallai'r dudalen rydych ar fin mynd arni geisio codi tâl arnoch</translation>
 <translation id="5866257070973731571">Ychwanegu Rhif Ffôn</translation>
+<translation id="5866327164731551901">O <ph name="TYPE_1" /> <ph name="TYPE_2" /></translation>
 <translation id="5866898949289125849">Rydych yn edrych ar dudalen offer datblygwyr</translation>
 <translation id="5869405914158311789">Methu â chyrraedd y wefan hon</translation>
 <translation id="5869522115854928033">Cyfrineiriau sydd wedi'u cadw</translation>
@@ -3499,6 +3507,7 @@
 <translation id="7075452647191940183">Mae'r cais yn rhy fawr</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
+<translation id="7079783554682867524">O <ph name="TYPE_1" /> (rhagor ar ddyfeisiau sydd wedi'u cysoni)</translation>
 <translation id="7081311540357715807">Manwerthwyr Bwyd a Groser</translation>
 <translation id="7083258188081898530">Hambwrdd 9</translation>
 <translation id="7086090958708083563">Mae defnyddiwr wedi gofyn i uwchlwytho</translation>
@@ -4154,6 +4163,7 @@
 <translation id="8216640997712497593">14 x 18 modfedd</translation>
 <translation id="8218327578424803826">Lleoliad a Aseiniwyd:</translation>
 <translation id="8220602974062798186">Rhwystro <ph name="TOPIC" /> ac unrhyw bynciau cysylltiedig?</translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />, Gofyn i <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="8228419419708659934">Gwedd ddwy dudalen</translation>
 <translation id="8228477714872026922">Mae <ph name="ORIGIN" /> eisiau cyrchu dyfais ar eich rhwydwaith:</translation>
 <translation id="822925450938886901">I gael gwybodaeth ychwanegol a pholisïau a allai fod yn berthnasol, agorwch chrome://management yn eich porwr.</translation>
@@ -4197,6 +4207,7 @@
 <translation id="8280630997017109758">Hambwrdd 11</translation>
 <translation id="8281730697546299650">Nodweddion preifatrwydd hysbysebion eraill ar gael nawr</translation>
 <translation id="8281886186245836920">Neidio</translation>
+<translation id="8282292167096638950">Dileu trwydded yrru</translation>
 <translation id="8282409409360764263">Cynnal a Chadw Iard</translation>
 <translation id="8282947398454257691">Gwybod dynodwr eich dyfais unigryw</translation>
 <translation id="8284769179630993263">Rheoli eich Pori'n Ddiogel a rhagor yng ngosodiadau Chrome</translation>
@@ -4224,6 +4235,7 @@
 <translation id="8321476692217554900">hysbysiadau</translation>
 <translation id="8322402665880479974">Gwelyau a Phenfyrddau</translation>
 <translation id="8323505966575306467">Ychwanegu mwy o amddiffyniad at eich cyfrineiriau</translation>
+<translation id="832547548543012337">Dileu pasbort</translation>
 <translation id="832567874344484841">Bwydydd Brecwast</translation>
 <translation id="8329068931308448247">Amlen #14</translation>
 <translation id="8332188693563227489">Rhwystrwyd mynediad at <ph name="HOST_NAME" /></translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb
index 176ddcc..bda3db05 100644
--- a/components/strings/components_strings_da.xtb
+++ b/components/strings/components_strings_da.xtb
@@ -1290,7 +1290,7 @@
 <translation id="3248329428895535435">Vis ikke for dette website</translation>
 <translation id="3249102948665905108">Filupload til <ph name="CLOUD_PROVIDER" /> er gennemført med fejl</translation>
 <translation id="3252772880526154546">Arkitektur</translation>
-<translation id="3253225298092156258">Ikke tilgængeligt</translation>
+<translation id="3253225298092156258">Ikke tilgængelig</translation>
 <translation id="3254301855501243548">18 x 22 tommer</translation>
 <translation id="3255926992597692024">Chromium forsøger at ændre indstillinger for udfyldning af betalingsmetoder.</translation>
 <translation id="3259648571731540213"><ph name="CREATE_GOOGLE_CALENDAR_EVENT_FOCUSED_FRIENDLY_MATCH_TEXT" />, tryk på Tab-tasten efterfulgt af Enter for hurtigt at oprette en ny begivenhed i Google Kalender</translation>
@@ -1924,6 +1924,7 @@
 <translation id="4282346679996504092">Underretninger for dette produkt er deaktiveret, og bogmærket er fjernet</translation>
 <translation id="4285498937028063278">Frigør</translation>
 <translation id="4287495839370498922">Forbedret privatliv vedrørende annoncering i Chrome</translation>
+<translation id="4288101205645068104">Slet køretøj</translation>
 <translation id="4290920330097335010">Tillad aldrig</translation>
 <translation id="4296207570293932800">En ny privatlivsfunktion for annoncer er nu tilgængelig</translation>
 <translation id="4297502707443874121">Miniature for siden <ph name="THUMBNAIL_PAGE" /></translation>
@@ -4198,6 +4199,7 @@
 <translation id="8280630997017109758">Bakke 11</translation>
 <translation id="8281730697546299650">Andre privatlivsfunktioner til annoncer er nu tilgængelige</translation>
 <translation id="8281886186245836920">Spring over</translation>
+<translation id="8282292167096638950">Slet kørekort</translation>
 <translation id="8282409409360764263">Havepleje</translation>
 <translation id="8282947398454257691">Kende dit unikke enheds-id</translation>
 <translation id="8284769179630993263">Administrer Beskyttet browsing m.m. i Chrome-indstillingerne</translation>
@@ -4225,6 +4227,7 @@
 <translation id="8321476692217554900">notifikationer</translation>
 <translation id="8322402665880479974">Senge og hovedgærder</translation>
 <translation id="8323505966575306467">Få bedre beskyttelse af dine adgangskoder</translation>
+<translation id="832547548543012337">Slet pas</translation>
 <translation id="832567874344484841">Morgenmadsprodukter</translation>
 <translation id="8329068931308448247">Konvolut nr. 14</translation>
 <translation id="8332188693563227489">Adgangen til <ph name="HOST_NAME" /> blev nægtet</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb
index 09e05d8..be5276d 100644
--- a/components/strings/components_strings_de.xtb
+++ b/components/strings/components_strings_de.xtb
@@ -1923,6 +1923,7 @@
 <translation id="4282346679996504092">Benachrichtigungen zu diesem Produkt wurden deaktiviert und das Lesezeichen wurde entfernt</translation>
 <translation id="4285498937028063278">Loslösen</translation>
 <translation id="4287495839370498922">Erweiterter Datenschutz bei Anzeigen in Chrome</translation>
+<translation id="4288101205645068104">Fahrzeug löschen</translation>
 <translation id="4290920330097335010">Nie erlauben</translation>
 <translation id="4296207570293932800">Neue Funktion zum Datenschutz bei Werbung verfügbar</translation>
 <translation id="4297502707443874121">Miniaturansicht für Seite <ph name="THUMBNAIL_PAGE" /></translation>
@@ -4205,6 +4206,7 @@
 <translation id="8280630997017109758">Fach 11</translation>
 <translation id="8281730697546299650">Weitere Funktionen zum Datenschutz bei Werbung jetzt verfügbar</translation>
 <translation id="8281886186245836920">Überspringen</translation>
+<translation id="8282292167096638950">Führerschein löschen</translation>
 <translation id="8282409409360764263">Hof- und Vorgartenpflege</translation>
 <translation id="8282947398454257691">Deine eindeutige Geräte-ID abrufen</translation>
 <translation id="8284769179630993263">Safe Browsing und mehr in den Chrome-Einstellungen verwalten</translation>
@@ -4232,6 +4234,7 @@
 <translation id="8321476692217554900">Benachrichtigungen</translation>
 <translation id="8322402665880479974">Betten und Kopfteile</translation>
 <translation id="8323505966575306467">Noch mehr Schutz für deine Passwörter</translation>
+<translation id="832547548543012337">Ausweis löschen</translation>
 <translation id="832567874344484841">Lebensmittel und Speisen fürs Frühstück</translation>
 <translation id="8329068931308448247">Umschlag Nr. 14</translation>
 <translation id="8332188693563227489">Der Zugriff auf <ph name="HOST_NAME" /> wurde verweigert</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb
index 67dda8ee..6e35ec2a 100644
--- a/components/strings/components_strings_el.xtb
+++ b/components/strings/components_strings_el.xtb
@@ -528,6 +528,7 @@
 <translation id="1890171020361705182">Παιχνίδι Dino. Ένας δεινόσαυρος με εφέ pixel αποφεύγει κάκτους και πτεροδάκτυλους καθώς τρέχει σε ένα έρημο τοπίο. Όταν ακούσετε ένα ηχητικό σήμα, πατήστε για να πηδήξετε πάνω από τα εμπόδια.</translation>
 <translation id="1898423065542865115">Φιλτράρισμα</translation>
 <translation id="1901443836186977402">{1,plural, =1{Αυτός ο διακομιστής δεν μπορούσε να αποδείξει ότι είναι <ph name="DOMAIN" />. Το πιστοποιητικό ασφαλείας του έληξε την τελευταία ημέρα. Αυτό μπορεί να οφείλεται σε εσφαλμένη διαμόρφωση ή σε κάποιον εισβολέα που παρεμβαίνει στη σύνδεσή σας. Το ρολόι του υπολογιστή σας έχει ρυθμιστεί για τις <ph name="CURRENT_DATE" />. Σας φαίνεται σωστό; Εάν όχι, θα πρέπει να διορθώσετε το ρολόι του συστήματός σας και έπειτα να ανανεώσετε αυτήν τη σελίδα.}other{Ο διακομιστής δεν μπόρεσε να αποδείξει ότι είναι <ph name="DOMAIN" />. Το πιστοποιητικό ασφαλείας του έληξε πριν από # ημέρες. Αυτό μπορεί να οφείλεται σε εσφαλμένη διαμόρφωση ή σε κάποιον εισβολέα που παρεμβαίνει στη σύνδεσή σας. Το ρολόι του υπολογιστή σας έχει ρυθμιστεί για τις <ph name="CURRENT_DATE" />. Σας φαίνεται σωστό; Εάν όχι, θα πρέπει να διορθώσετε το ρολόι του συστήματός σας και έπειτα να ανανεώσετε αυτήν τη σελίδα.}}</translation>
+<translation id="190166348986967700">Ο διαχειριστής σας θα ξεκινήσει τη μεταφόρτωση των αρχείων σας στον πάροχο <ph name="CLOUD_PROVIDER" /> στις <ph name="DATE_TIME" />. Διατηρήστε τη συσκευή σας συνδεδεμένη μέχρι να ολοκληρωθεί η μεταφόρτωση του αρχείου. Κατά τη διάρκεια της μεταφόρτωσης, θα μπορείτε να διαβάζετε μόνο τοπικά αρχεία.</translation>
 <translation id="1902576642799138955">Περίοδος εγκυρότητας</translation>
 <translation id="1908217026282415406">Χρήση και μετακίνηση κάμερας</translation>
 <translation id="1908690643053136980">Ο διαχειριστής σας δεν επιτρέπει την άδεια <ph name="PERMISSION" /> για αυτόν τον ιστότοπο</translation>
@@ -1925,6 +1926,7 @@
 <translation id="4282346679996504092">Οι ειδοποιήσεις για αυτό το προϊόν έχουν απενεργοποιηθεί και ο σελιδοδείκτης καταργήθηκε.</translation>
 <translation id="4285498937028063278">Ξεκαρφίτσωμα</translation>
 <translation id="4287495839370498922">Βελτιωμένο απόρρητο διαφημίσεων στο Chrome</translation>
+<translation id="4288101205645068104">Διαγραφή οχήματος</translation>
 <translation id="4290920330097335010">Να μην επιτρέπεται ποτέ</translation>
 <translation id="4296207570293932800">Η νέα λειτουργία απορρήτου διαφημίσεων είναι πλέον διαθέσιμη</translation>
 <translation id="4297502707443874121">Μικρογραφία για τη σελίδα <ph name="THUMBNAIL_PAGE" /></translation>
@@ -2154,6 +2156,7 @@
 <translation id="473775607612524610">Ενημέρωση</translation>
 <translation id="4738601419177586157">Πρόταση αναζήτησης <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Διαχείριση κωδικών πρόσβασης…</translation>
+<translation id="474270528725216349">Από τουλάχιστον 1 ιστότοπο στις συγχρονισμένες συσκευές</translation>
 <translation id="4743275772928623722">Το σύστημά σας ενημερώθηκε αλλά δεν ήταν δυνατή η ανάκτηση ορισμένων εφαρμογών και αρχείων. Η λήψη των εφαρμογών θα επαναληφθεί αυτόματα.</translation>
 <translation id="4744514002166662487">Δημιουργία παρουσίασης</translation>
 <translation id="4744603770635761495">Διαδρομή εκτελέσιμου</translation>
@@ -2284,6 +2287,7 @@
 <translation id="495170559598752135">Ενέργειες</translation>
 <translation id="4953689047182316270">Απάντηση σε συμβάντα προσβασιμότητας</translation>
 <translation id="4957080528849277028">Κουμπί Προβολή ιστορικού Chrome, ενεργοποιήστε το για να δείτε και διαχειριστείτε το ιστορικό περιήγησης από τις ρυθμίσεις του Chrome</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{+ 1 ιστότοπος}other{+ # ιστότοποι}}</translation>
 <translation id="4958444002117714549">Ανάπτυξη λίστας</translation>
 <translation id="4960068118612257147">Μπορείτε να κάνετε αλλαγές στις ρυθμίσεις απορρήτου διαφημίσεων του Chrome</translation>
 <translation id="4960203958361543136">Επιλογή μηχανής αναζήτησης</translation>
@@ -2619,8 +2623,10 @@
 <translation id="553377674408670169">Θέσεις εργασίας στην εκπαίδευση</translation>
 <translation id="5534785731327961487">Καλή προσφορά τώρα</translation>
 <translation id="5536214594743852365">Εμφάνιση της ενότητας "<ph name="SECTION" />"</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{+ 1 ιστότοπος (επιπλέον στις συγχρονισμένες συσκευές)}other{# ιστότοποι (επιπλέον στις συγχρονισμένες συσκευές)}}</translation>
 <translation id="553782666181800029">Φάκελος Chou 2</translation>
 <translation id="5538270463355278784">αυτόματη πλήρης οθόνη</translation>
+<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />, αναζήτηση <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="5539243836947087108">Βάση</translation>
 <translation id="5540224163453853">Δεν ήταν δυνατή η εύρεση του άρθρου που ζητήσατε.</translation>
 <translation id="5540969246441091044">Ιππασία</translation>
@@ -2779,6 +2785,7 @@
 <translation id="5838278095973806738">Δεν θα πρέπει να εισαγάγετε ευαίσθητες πληροφορίες σε αυτόν τον ιστότοπο (για παράδειγμα, κωδικούς πρόσβασης ή πιστωτικές κάρτες), επειδή ενδέχεται να υποκλαπούν από εισβολείς.</translation>
 <translation id="5838732667866024867">Μπορείτε να χρησιμοποιήσετε το αριστερό/δεξί βέλος για να δείτε στο γράφημα τις αλλαγές στις τιμές</translation>
 <translation id="5840318881868981258">Στον Λογαριασμό σας Google, <ph name="ACCOUNT" /></translation>
+<translation id="5841007907672481419">Από <ph name="TYPE_1" /></translation>
 <translation id="5841338463993781099">Αποθήκευση στον λογαριασμό;</translation>
 <translation id="5843987376989109187">Αυτή η γλώσσα δεν υποστηρίζεται ακόμη.
     <ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation>
@@ -2792,6 +2799,7 @@
 <translation id="5863515189965725638">Επεξεργασία IBAN</translation>
 <translation id="5863847714970149516">Η σελίδα που ακολουθεί μπορεί να προσπαθήσει να σας χρεώσει</translation>
 <translation id="5866257070973731571">Προσθήκη αριθμού τηλεφώνου</translation>
+<translation id="5866327164731551901">Από <ph name="TYPE_1" /> <ph name="TYPE_2" /></translation>
 <translation id="5866898949289125849">Προβάλετε μια σελίδα εργαλείων προγραμματιστή.</translation>
 <translation id="5869405914158311789">Δεν είναι δυνατή η πρόσβαση σε αυτόν τον ιστότοπο</translation>
 <translation id="5869522115854928033">Αποθηκευμένοι κωδικοί πρόσβασης</translation>
@@ -3502,6 +3510,7 @@
 <translation id="7075452647191940183">Το αίτημα είναι πολύ μεγάλο</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
+<translation id="7079783554682867524">Από <ph name="TYPE_1" /> (επιπλέον στις συγχρονισμένες συσκευές)</translation>
 <translation id="7081311540357715807">Πωλητές λιανικής τροφίμων και ειδών παντοπωλείου</translation>
 <translation id="7083258188081898530">Δίσκος 9</translation>
 <translation id="7086090958708083563">Ζητήθηκε μεταφόρτωση από έναν χρήστη.</translation>
@@ -4158,6 +4167,7 @@
 <translation id="8216640997712497593">14 x 18 ίντσες</translation>
 <translation id="8218327578424803826">Εκχωρημένη τοποθεσία:</translation>
 <translation id="8220602974062798186">Να αποκλειστεί το θέμα <ph name="TOPIC" /> και τυχόν άλλα σχετικά θέματα;</translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />, ερώτηση σε <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="8228419419708659934">Προβολή δύο σελίδων</translation>
 <translation id="8228477714872026922">Ο ιστότοπος <ph name="ORIGIN" /> θέλει να αποκτήσει πρόσβαση σε μια συσκευή στο δίκτυό σας:</translation>
 <translation id="822925450938886901">Για πρόσθετες πληροφορίες και πολιτικές που ενδέχεται να ισχύουν, μεταβείτε στο chrome://management, στο πρόγραμμα περιήγησης που χρησιμοποιείτε.</translation>
@@ -4201,6 +4211,7 @@
 <translation id="8280630997017109758">Τροφοδότης χαρτιού 11</translation>
 <translation id="8281730697546299650">Άλλες διαθέσιμες λειτουργίες απορρήτου διαφημίσεων</translation>
 <translation id="8281886186245836920">Παράβλεψη</translation>
+<translation id="8282292167096638950">Διαγραφή διπλώματος οδήγησης</translation>
 <translation id="8282409409360764263">Συντήρηση αυλής</translation>
 <translation id="8282947398454257691">Πρόσβαση στο μοναδικό αναγνωριστικό της συσκευής σας</translation>
 <translation id="8284769179630993263">Διαχειριστείτε την Ασφαλή περιήγηση και άλλες επιλογές από τις ρυθμίσεις του Chrome</translation>
@@ -4228,6 +4239,7 @@
 <translation id="8321476692217554900">ειδοποιήσεις</translation>
 <translation id="8322402665880479974">Κρεβάτια και προσκέφαλα</translation>
 <translation id="8323505966575306467">Προσθέστε περισσότερη προστασία στους κωδικούς πρόσβασής σας</translation>
+<translation id="832547548543012337">Διαγραφή διαβατηρίου</translation>
 <translation id="832567874344484841">Τρόφιμα για πρωινό</translation>
 <translation id="8329068931308448247">Φάκελος #14</translation>
 <translation id="8332188693563227489">Απορρίφθηκε η πρόσβαση στο κεντρικό υπολογιστή <ph name="HOST_NAME" /></translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb
index f18af74..2f195e2b 100644
--- a/components/strings/components_strings_fa.xtb
+++ b/components/strings/components_strings_fa.xtb
@@ -528,6 +528,7 @@
 <translation id="1890171020361705182">بازی داینو. دایناسوری نقطه‌ای همان‌طور که در دشتی دورافتاده می‌دود، موقع رسیدن به کاکتوس‌ها و پتروداکتیل‌ها جاخالی می‌دهد. وقتی صدای نشانه صوتی را شنیدید، برای پریدن از روی موانع تک‌ضرب بزنید.</translation>
 <translation id="1898423065542865115">فیلتر کردن</translation>
 <translation id="1901443836186977402">{1,plural, =1{این سرور نتوانست اثبات کند که <ph name="DOMAIN" /> است؛ گواهی امنیتی آن روز گذشته منقضی شده است. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجمی درحال رهگیری اتصالتان باشد. ساعت رایانه‌تان درحال‌حاضر روی <ph name="CURRENT_DATE" /> تنظیم شده است. آیا درست است؟ اگر نه، باید ساعت سیستم را درست کنید و سپس این صفحه را بازآورید.}one{این سرور نتوانست اثبات کند که <ph name="DOMAIN" /> است؛ گواهینامه امنیتی آن # روز پیش منقضی شده است. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجمی درحال رهگیری اتصالتان باشد. ساعت رایانه‌تان درحال‌حاضر روی <ph name="CURRENT_DATE" /> تنظیم شده است. آیا درست است؟ اگر نه، باید ساعت سیستم را درست کنید و سپس این صفحه را بازآورید.}other{این سرور نتوانست اثبات کند که <ph name="DOMAIN" /> است؛ گواهینامه امنیتی آن # روز پیش منقضی شده است. ممکن است علت این موضوع پیکربندی اشتباه باشد یا مهاجمی درحال رهگیری اتصالتان باشد. ساعت رایانه‌تان درحال‌حاضر روی <ph name="CURRENT_DATE" /> تنظیم شده است. آیا درست است؟ اگر نه، باید ساعت سیستم را درست کنید و سپس این صفحه را بازآورید.}}</translation>
+<translation id="190166348986967700">‏سرپرست شما در ‎<ph name="DATE_TIME" /> شروع به بارگذاری فایل‌هایتان در <ph name="CLOUD_PROVIDER" /> خواهد کرد. تا زمانی‌که بارگذاری فایل کامل نشده است، ارتباط دستگاه را قطع نکنید. درطول فرایند بارگذاری، فقط می‌توانید فایل‌های محلی را بخوانید.</translation>
 <translation id="1902576642799138955">مدت اعتبار</translation>
 <translation id="1908217026282415406">استفاده از دوربین و حرکت دادن آن</translation>
 <translation id="1908690643053136980">سرپرست شما <ph name="PERMISSION" /> را برای این سایت مجاز نکرده است</translation>
@@ -2153,6 +2154,7 @@
 <translation id="473775607612524610">به‌روزرسانی</translation>
 <translation id="4738601419177586157">پیشنهاد جستجوی <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">مدیریت گذرواژه‌ها…</translation>
+<translation id="474270528725216349">از حداقل ۱ سایت در دستگاه‌های همگام‌سازی‌شده</translation>
 <translation id="4743275772928623722">سیستم شما به‌روزرسانی شد، اما برخی‌از برنامه‌ها و فایل‌هایتان بازیابی نشدند. برنامه‌هایتان دوباره به‌طور خودکار بارگیری می‌شوند.</translation>
 <translation id="4744514002166662487">ایجاد ارائه</translation>
 <translation id="4744603770635761495">مسیر قابل اجرا</translation>
@@ -2283,6 +2285,7 @@
 <translation id="495170559598752135">کنش‌ها</translation>
 <translation id="4953689047182316270">پاسخ دادن به رویدادهای مربوط به دسترس‌پذیری</translation>
 <translation id="4957080528849277028">‏دکمه «مشاهده سابقه Chrome»؛ برای مشاهده و مدیریت سابقه مرور در تنظیمات Chrome، آن را فعال کنید</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{‫+ ۱ سایت}one{‫+ # سایت}other{‫+ # سایت}}</translation>
 <translation id="4958444002117714549">بزرگ کردن فهرست</translation>
 <translation id="4960068118612257147">‏می‌توانید تغییرات موردنظرتان را در تنظیمات حریم خصوصی آگهی Chrome اعمال کنید</translation>
 <translation id="4960203958361543136">موتور جستجو را انتخاب کنید</translation>
@@ -2617,8 +2620,10 @@
 <translation id="553377674408670169">مشاغل آموزشی</translation>
 <translation id="5534785731327961487">معامله خوب</translation>
 <translation id="5536214594743852365">نمایش بخش «<ph name="SECTION" />»</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{‫+ ۱ سایت (موارد بیشتر در دستگاه‌های همگام‌سازی‌شده)}one{‫+ # سایت (موارد بیشتر در دستگاه‌های همگام‌سازی‌شده)}other{‫+ # سایت (موارد بیشتر در دستگاه‌های همگام‌سازی‌شده)}}</translation>
 <translation id="553782666181800029">پاکت چو ۲</translation>
 <translation id="5538270463355278784">تمام‌صفحه خودکار</translation>
+<translation id="5538859347764346097">‫<ph name="KEYWORD_SHORTCUT" />، جستجوی <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="5539243836947087108">«رفت»</translation>
 <translation id="5540224163453853">مقاله درخواستی یافت نشد.</translation>
 <translation id="5540969246441091044">اسب‌سواری</translation>
@@ -2777,6 +2782,7 @@
 <translation id="5838278095973806738">نباید هیچ اطلاعات حساسی (مثل گذرواژه یا کارت اعتباری) را در این سایت وارد کنید، زیرا ممکن است مهاجمین آن‌ها را سرقت کنند.</translation>
 <translation id="5838732667866024867">برای بررسی تغییرات قیمت در گراف می‌توانید از کلید چپ‌بَر/ راست‌بَر استفاده کنید</translation>
 <translation id="5840318881868981258">‏در «حساب Google» شما، <ph name="ACCOUNT" /></translation>
+<translation id="5841007907672481419">از <ph name="TYPE_1" /></translation>
 <translation id="5841338463993781099">در حساب ذخیره شود؟</translation>
 <translation id="5843987376989109187">هنوز از این زبان پشتیبانی نمی‌شود.
     <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation>
@@ -2790,6 +2796,7 @@
 <translation id="5863515189965725638">‏ویرایش IBAN</translation>
 <translation id="5863847714970149516">صفحه پیش‌رو ممکن است تلاش کند از شما پول دریافت کند</translation>
 <translation id="5866257070973731571">افزودن شماره تلفن</translation>
+<translation id="5866327164731551901">از <ph name="TYPE_1" />‏ <ph name="TYPE_2" /></translation>
 <translation id="5866898949289125849">درحال مشاهده یک صفحه ابزار برنامه‌نویس هستید</translation>
 <translation id="5869405914158311789">دسترسی به این سایت امکان‌پذیر نیست</translation>
 <translation id="5869522115854928033">گذرواژه‌های ذخیره‌شده</translation>
@@ -3499,6 +3506,7 @@
 <translation id="7075452647191940183">درخواست خیلی بزرگ است</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
+<translation id="7079783554682867524">از <ph name="TYPE_1" /> (موارد بیشتر در دستگاه‌های همگام‌سازی‌شده)</translation>
 <translation id="7081311540357715807">خرده‌فروشی خواروبار و مواد غذایی</translation>
 <translation id="7083258188081898530">سینی ۹</translation>
 <translation id="7086090958708083563">بارگذاری درخواست‌شده توسط کاربر</translation>
@@ -4155,6 +4163,7 @@
 <translation id="8216640997712497593">۱۸ × ۱۴ اینچ</translation>
 <translation id="8218327578424803826">مکان اختصاص یافته:</translation>
 <translation id="8220602974062798186"><ph name="TOPIC" /> و همه موضوع‌های مرتبط مسدود شود؟</translation>
+<translation id="8226408512771130794">‫<ph name="KEYWORD_SHORTCUT" />، پرسیدن از <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="8228419419708659934">نمای دوصفحه‌ای</translation>
 <translation id="8228477714872026922"><ph name="ORIGIN" /> می‌خواهد به دستگاهی در شبکه شما دسترسی داشته باشد:</translation>
 <translation id="822925450938886901">‏برای اطلاعات بیشتر و خط‌مشی‌هایی که ممکن است اعمال شود، chrome://management را در مرورگرتان باز کنید.</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index 1e18ae1e..7e584af 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -4163,7 +4163,7 @@
 <translation id="8216640997712497593">14 x 18 in</translation>
 <translation id="8218327578424803826">Itinakdang Lokasyon:</translation>
 <translation id="8220602974062798186">I-block ang <ph name="TOPIC" /> at anumang kaugnay na paksa?</translation>
-<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />, Magtanong sa <ph name="KEYWORD_SUFFIX" /></translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />, Mag-ask sa <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="8228419419708659934">Dalawang page na view</translation>
 <translation id="8228477714872026922">Gustong ma-access ng <ph name="ORIGIN" /> ang isang device sa iyong network:</translation>
 <translation id="822925450938886901">Para sa karagdagang impormasyon at mga patakaran na posibleng malapat, buksan ang chrome://management sa iyong browser.</translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb
index 9bc8af5..cb5be79 100644
--- a/components/strings/components_strings_fr-CA.xtb
+++ b/components/strings/components_strings_fr-CA.xtb
@@ -1924,6 +1924,7 @@
 <translation id="4282346679996504092">Les alertes pour ce produit ont été désactivées, et le favori a été supprimé</translation>
 <translation id="4285498937028063278">Annuler l'épinglage</translation>
 <translation id="4287495839370498922">Confidentialité améliorée des annonces dans Chrome</translation>
+<translation id="4288101205645068104">Supprimer le véhicule</translation>
 <translation id="4290920330097335010">Ne jamais autoriser</translation>
 <translation id="4296207570293932800">Nouvelle fonctionnalité de confidentialité des annonces maintenant offerte</translation>
 <translation id="4297502707443874121">Miniature pour la page <ph name="THUMBNAIL_PAGE" /></translation>
@@ -4197,6 +4198,7 @@
 <translation id="8280630997017109758">Bac 11</translation>
 <translation id="8281730697546299650">Autres fonctionnalités de confidentialité des annonces désormais offertes</translation>
 <translation id="8281886186245836920">Ignorer</translation>
+<translation id="8282292167096638950">Supprimer le permis de conduire</translation>
 <translation id="8282409409360764263">Entretien de terrain</translation>
 <translation id="8282947398454257691">Connaître votre identifiant d'appareil unique</translation>
 <translation id="8284769179630993263">Gérez votre navigation sécurisée et plus encore dans les paramètres de Chrome</translation>
@@ -4224,6 +4226,7 @@
 <translation id="8321476692217554900">Notifications</translation>
 <translation id="8322402665880479974">Lits et têtes de lit</translation>
 <translation id="8323505966575306467">Ajouter plus de protection à vos mots de passe</translation>
+<translation id="832547548543012337">Supprimer le passeport</translation>
 <translation id="832567874344484841">Aliments pour le déjeuner</translation>
 <translation id="8329068931308448247">Enveloppe nᵒ 14</translation>
 <translation id="8332188693563227489">Accès à l'adresse <ph name="HOST_NAME" /> refusé</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb
index c2efae6..242639e 100644
--- a/components/strings/components_strings_gu.xtb
+++ b/components/strings/components_strings_gu.xtb
@@ -1924,6 +1924,7 @@
 <translation id="4282346679996504092">આ પ્રોડક્ટ માટેના અલર્ટ બંધ કરવામાં આવ્યા છે અને બુકમાર્ક કાઢી નાખવામાં આવી છે</translation>
 <translation id="4285498937028063278">અનપિન કરો</translation>
 <translation id="4287495839370498922">Chromeમાં જાહેરાત સંબંધી વધારેલી પ્રાઇવસી</translation>
+<translation id="4288101205645068104">વાહન ડિલીટ કરો</translation>
 <translation id="4290920330097335010">ક્યારેય મંજૂરી આપશો નહીં</translation>
 <translation id="4296207570293932800">જાહેરાત સંબંધિત પ્રાઇવસીની નવી સુવિધા હવે ઉપલબ્ધ છે</translation>
 <translation id="4297502707443874121">પેજ <ph name="THUMBNAIL_PAGE" /> માટે થંબનેલ</translation>
@@ -4198,6 +4199,7 @@
 <translation id="8280630997017109758">ટ્રે 11</translation>
 <translation id="8281730697546299650">જાહેરાત સંબંધિત અન્ય પ્રાઇવસી સુવિધાઓ હવે ઉપલબ્ધ છે</translation>
 <translation id="8281886186245836920">છોડો</translation>
+<translation id="8282292167096638950">ડ્રાઇવિંગ લાઇસન્સ ડિલીટ કરો</translation>
 <translation id="8282409409360764263">વાડાની જાળવણી</translation>
 <translation id="8282947398454257691">તમારા અનન્ય ઉપકરણ ઓળખકર્તાને જાણો</translation>
 <translation id="8284769179630993263">Chrome સેટિંગમાં Safe Browsing જેવી તમારી બીજી ઘણી સુવિધાઓ મેનેજ કરો</translation>
@@ -4225,6 +4227,7 @@
 <translation id="8321476692217554900">નોટિફિકેશન</translation>
 <translation id="8322402665880479974">પથારી અને ઓશિકા</translation>
 <translation id="8323505966575306467">તમારા પાસવર્ડ માટે વધારે સંરક્ષણ ઉમેરો</translation>
+<translation id="832547548543012337">પાસપોર્ટ ડિલીટ કરો</translation>
 <translation id="832567874344484841">સવારના નાસ્તામાં લેવાતું ભોજન</translation>
 <translation id="8329068931308448247">એન્વલપ #14</translation>
 <translation id="8332188693563227489"><ph name="HOST_NAME" /> ની ઍક્સેસ નકારાઈ હતી</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index 6e25a21..1d51a12 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -1924,6 +1924,7 @@
 <translation id="4282346679996504092">इस प्रॉडक्ट के लिए, सूचनाएं पाने की सुविधा बंद कर दी गई है और बुकमार्क को हटा दिया गया है</translation>
 <translation id="4285498937028063278">अनपिन करें</translation>
 <translation id="4287495839370498922">Chrome पर विज्ञापन देखने वालों की निजता बनाए रखने वाली बेहतर सुविधा</translation>
+<translation id="4288101205645068104">वाहन की जानकारी मिटाएं</translation>
 <translation id="4290920330097335010">कभी भी अनुमति न दें</translation>
 <translation id="4296207570293932800">विज्ञापन देखने वाले की निजता बनाए रखने की नई सुविधाएं अब उपलब्ध हैं</translation>
 <translation id="4297502707443874121">पेज <ph name="THUMBNAIL_PAGE" /> का थंबनेल</translation>
@@ -4198,6 +4199,7 @@
 <translation id="8280630997017109758">ट्रे 11</translation>
 <translation id="8281730697546299650">विज्ञापन देखने वाले की निजता बनाए रखने से जुड़ी अन्य सुविधाएं अब उपलब्ध हैं</translation>
 <translation id="8281886186245836920">अभी नहीं</translation>
+<translation id="8282292167096638950">ड्राइविंग लाइसेंस की जानकारी मिटाएं</translation>
 <translation id="8282409409360764263">यार्ड और लॉन का रखरखाव</translation>
 <translation id="8282947398454257691">आपका अद्वितीय डिवाइस पहचानकर्ता पता करना</translation>
 <translation id="8284769179630993263">Chrome की सेटिंग में Safe Browsing वगैरह को मैनेज करें</translation>
@@ -4225,6 +4227,7 @@
 <translation id="8321476692217554900">सूचनाएं</translation>
 <translation id="8322402665880479974">बेड और हेडबोर्ड</translation>
 <translation id="8323505966575306467">अपने पासवर्ड को और सुरक्षित बनाएं</translation>
+<translation id="832547548543012337">पासपोर्ट की जानकारी मिटाएं</translation>
 <translation id="832567874344484841">नाश्ते के विकल्प</translation>
 <translation id="8329068931308448247">#14 साइज़ का लिफ़ाफ़ा</translation>
 <translation id="8332188693563227489"><ph name="HOST_NAME" /> का एक्सेस देने से मना किया गया था</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb
index cc607e7..7f9ee1e 100644
--- a/components/strings/components_strings_id.xtb
+++ b/components/strings/components_strings_id.xtb
@@ -1924,6 +1924,7 @@
 <translation id="4282346679996504092">Notifikasi untuk produk ini telah dinonaktifkan dan bookmark dihapus</translation>
 <translation id="4285498937028063278">Lepaskan</translation>
 <translation id="4287495839370498922">Privasi iklan yang lebih baik di Chrome</translation>
+<translation id="4288101205645068104">Hapus kendaraan</translation>
 <translation id="4290920330097335010">Jangan pernah izinkan</translation>
 <translation id="4296207570293932800">Fitur privasi iklan baru kini tersedia</translation>
 <translation id="4297502707443874121">Thumbnail untuk halaman <ph name="THUMBNAIL_PAGE" /></translation>
@@ -4196,6 +4197,7 @@
 <translation id="8280630997017109758">Baki 11</translation>
 <translation id="8281730697546299650">Fitur privasi iklan lainnya kini tersedia</translation>
 <translation id="8281886186245836920">Lewati</translation>
+<translation id="8282292167096638950">Hapus surat izin mengemudi</translation>
 <translation id="8282409409360764263">Perawatan Halaman</translation>
 <translation id="8282947398454257691">Mengetahui pengenal perangkat unik Anda</translation>
 <translation id="8284769179630993263">Kelola Safe Browsing dan lainnya di setelan Chrome</translation>
@@ -4223,6 +4225,7 @@
 <translation id="8321476692217554900">notifikasi</translation>
 <translation id="8322402665880479974">Tempat Tidur &amp; Ranjang</translation>
 <translation id="8323505966575306467">Tambahkan lebih banyak perlindungan untuk sandi Anda</translation>
+<translation id="832547548543012337">Hapus paspor</translation>
 <translation id="832567874344484841">Makanan untuk Sarapan</translation>
 <translation id="8329068931308448247">Envelope #14</translation>
 <translation id="8332188693563227489">Akses ke <ph name="HOST_NAME" /> ditolak</translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb
index 2171d5e..f5b49d5 100644
--- a/components/strings/components_strings_is.xtb
+++ b/components/strings/components_strings_is.xtb
@@ -528,6 +528,7 @@
 <translation id="1890171020361705182">Risaeðluleikur. Pixluð risaeðla sneiðir hjá kaktusum og flugeðlum þegar hún hleypur í gegnum eyðimörk. Ýttu til að hoppa yfir hindranir um leið og hljóðmerki heyrist.</translation>
 <translation id="1898423065542865115">Síur</translation>
 <translation id="1901443836186977402">{1,plural, =1{Þessi þjónn gat ekki sannað að hann væri <ph name="DOMAIN" />; öryggisvottorð hans rann út síðastliðinn sólarhring. Þetta kann að orsakast af rangri stillingu eða tölvuþrjóti sem hefur komist inn í tenginguna. Klukka tölvunnar þinnar er sem stendur stillt á <ph name="CURRENT_DATE" />. Er það rétt? Ef ekki skaltu leiðrétta klukkuna og endurhlaða þessa síðu.}one{Þessi þjónn gat ekki sannað að hann væri <ph name="DOMAIN" />; öryggisvottorð hans rann út fyrir # degi. Þetta kann að orsakast af vanstillingu eða tölvuþrjóti sem komist hefur inn í tenginguna. Klukka tölvunnar þinnar er sem stendur stillt á <ph name="CURRENT_DATE" />. Er það rétt? Ef ekki skaltu leiðrétta klukkuna og endurhlaða þessa síðu.}other{Þessi þjónn gat ekki sannað að hann væri <ph name="DOMAIN" />; öryggisvottorð hans rann út fyrir # dögum. Þetta kann að orsakast af vanstillingu eða tölvuþrjóti sem komist hefur inn í tenginguna. Klukka tölvunnar þinnar er sem stendur stillt á <ph name="CURRENT_DATE" />. Er það rétt? Ef ekki skaltu leiðrétta klukkuna og endurhlaða þessa síðu.}}</translation>
+<translation id="190166348986967700">Stjórnandinn þinn mun hefja upphleðslu skráa á <ph name="CLOUD_PROVIDER" /> þann <ph name="DATE_TIME" />. Haltu tækinu þínu tengdu þar til upphleðslu skráa er lokið. Þú munt aðeins geta lesið staðbundnar skrár meðan á upphleðslunni stendur.</translation>
 <translation id="1902576642799138955">Gildistími</translation>
 <translation id="1908217026282415406">Notkun og hreyfing myndavélar</translation>
 <translation id="1908690643053136980">Kerfisstjórinn þinn lokaði á aðgang þessa vefsvæðis að <ph name="PERMISSION" /></translation>
@@ -2153,6 +2154,7 @@
 <translation id="473775607612524610">Uppfæra</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> leitartillaga</translation>
 <translation id="4742407542027196863">Stjórna aðgangsorðum…</translation>
+<translation id="474270528725216349">Frá a.m.k. einu vefsvæði í samstilltum tækjum</translation>
 <translation id="4743275772928623722">Kerfið var uppfært en ekki tókst að endurheimta sum forrit og skrár. Forritin verða sótt aftur sjálfkrafa.</translation>
 <translation id="4744514002166662487">Búa til kynningu</translation>
 <translation id="4744603770635761495">Keyranleg slóð</translation>
@@ -2283,6 +2285,7 @@
 <translation id="495170559598752135">Aðgerðir</translation>
 <translation id="4953689047182316270">Svara aðgengisatburði</translation>
 <translation id="4957080528849277028">Hnappurinn „Skoða Chrome ferilinn þinn“, virkjaðu til að skoða og stjórna vafraferlinum þínum í stillingum Chrome</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{+ eitt vefsvæði}one{+ # vefsvæði}other{+ # vefsvæði}}</translation>
 <translation id="4958444002117714549">Stækka lista</translation>
 <translation id="4960068118612257147">Þú getur gert breytingar í persónuverndarstillingum auglýsinga í Chrome</translation>
 <translation id="4960203958361543136">Veldu leitarvélina þína</translation>
@@ -2617,8 +2620,10 @@
 <translation id="553377674408670169">Fræðslustörf</translation>
 <translation id="5534785731327961487">Gott tilboð núna</translation>
 <translation id="5536214594743852365">Sýna hlutann „<ph name="SECTION" />“</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{+ eitt vefsvæði (fleiri í samstilltum tækjum)}one{+ # vefsvæði (fleiri í samstilltum tækjum)}other{+ # vefsvæði (fleiri í samstilltum tækjum)}}</translation>
 <translation id="553782666181800029">Umslag: chou 2</translation>
 <translation id="5538270463355278784">sjálfkrafa á öllum skjánum</translation>
+<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />, leitaðu á <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="5539243836947087108">Undirstaða</translation>
 <translation id="5540224163453853">Umbeðin grein fannst ekki.</translation>
 <translation id="5540969246441091044">Reiðmennska</translation>
@@ -2777,6 +2782,7 @@
 <translation id="5838278095973806738">Þú ættir ekki að færa inn neinar viðkvæmar upplýsingar á þessu vefsvæði (t.d. aðgangsorð eða kreditkortanúmer) því að tölvuþrjótar gætu stolið þeim.</translation>
 <translation id="5838732667866024867">Þú getur notað ör til hægri/vinstri til að yfirfara verðbreytingar á myndritinu</translation>
 <translation id="5840318881868981258">Á Google-reikningnum þínum, <ph name="ACCOUNT" /></translation>
+<translation id="5841007907672481419">Frá <ph name="TYPE_1" /></translation>
 <translation id="5841338463993781099">Vista á reikningi?</translation>
 <translation id="5843987376989109187">Þetta tungumál er ekki stutt enn sem komið er
     <ph name="BEGIN_LINK" />Nánar<ph name="END_LINK" /></translation>
@@ -2790,6 +2796,7 @@
 <translation id="5863515189965725638">Breyta IBAN</translation>
 <translation id="5863847714970149516">Síðan gæti reynt að rukka þig um greiðslu</translation>
 <translation id="5866257070973731571">Bæta við símanúmeri</translation>
+<translation id="5866327164731551901">Frá <ph name="TYPE_1" /> <ph name="TYPE_2" /></translation>
 <translation id="5866898949289125849">Þú ert að skoða síðu forritunarverkfæra</translation>
 <translation id="5869405914158311789">Ekki næst í vefsvæðið</translation>
 <translation id="5869522115854928033">Vistuð aðgangsorð</translation>
@@ -3499,6 +3506,7 @@
 <translation id="7075452647191940183">Beiðnin er of stór</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
+<translation id="7079783554682867524">Frá <ph name="TYPE_1" /> (meira í samstilltum tækjum)</translation>
 <translation id="7081311540357715807">Matvöruverslanir</translation>
 <translation id="7083258188081898530">Bakki 9</translation>
 <translation id="7086090958708083563">Notandi bað um sendingu</translation>
@@ -4154,6 +4162,7 @@
 <translation id="8216640997712497593">14 x 18 to.</translation>
 <translation id="8218327578424803826">Úthlutuð staðsetning:</translation>
 <translation id="8220602974062798186">Setja <ph name="TOPIC" /> á bannlista og öll tengd umfjöllunarefni?</translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />, spurðu <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="8228419419708659934">Birta tvær síður</translation>
 <translation id="8228477714872026922"><ph name="ORIGIN" /> vill fá aðgang að tæki á netkerfinu þínu:</translation>
 <translation id="822925450938886901">Farðu á chrome://management í vafranum þínum til að fá frekari upplýsingar og reglur sem kunna að eiga við.</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb
index f59c0143..5cc1a0a 100644
--- a/components/strings/components_strings_ja.xtb
+++ b/components/strings/components_strings_ja.xtb
@@ -528,6 +528,7 @@
 <translation id="1890171020361705182">Dino ゲーム。ピクセル画像の恐竜がサボテンやプテロダクティルスをよけながら、荒地を走り抜けます。合図の音が聞こえたら、タップして障害物を飛び越えましょう。</translation>
 <translation id="1898423065542865115">フィルタ</translation>
 <translation id="1901443836186977402">{1,plural, =1{このサーバーが <ph name="DOMAIN" /> であることを確認できませんでした。セキュリティ証明書の期限が昨日で切れています。原因として、設定が不適切であるか、悪意のあるユーザーが接続を妨害していることが考えられます。パソコンの時計は現在 <ph name="CURRENT_DATE" /> に設定されています。この時刻が正しくない場合は、システムの時計を修正して、このページを更新してください。}other{このサーバーが <ph name="DOMAIN" /> であることを確認できませんでした。セキュリティ証明書の期限が # 日前に切れています。原因として、設定が不適切であるか、悪意のあるユーザーが接続を妨害していることが考えられます。パソコンの時計は現在 <ph name="CURRENT_DATE" /> に設定されています。この時刻が正しくない場合は、システムの時計を修正して、このページを更新してください。}}</translation>
+<translation id="190166348986967700">管理者は <ph name="DATE_TIME" /> に <ph name="CLOUD_PROVIDER" /> へのファイルのアップロードを開始します。ファイルのアップロードが完了するまでデバイスを接続したままにしてください。アップロード中は、ローカル ファイルの読み取りのみが可能です。</translation>
 <translation id="1902576642799138955">有効期間</translation>
 <translation id="1908217026282415406">カメラの使用と移動</translation>
 <translation id="1908690643053136980">このサイトの <ph name="PERMISSION" /> の使用は管理者が禁止しています</translation>
@@ -1924,6 +1925,7 @@
 <translation id="4282346679996504092">この商品のアラートをオフにし、ブックマークを削除しました</translation>
 <translation id="4285498937028063278">固定を解除</translation>
 <translation id="4287495839370498922">Chrome で表示される広告に対するプライバシー強化について</translation>
+<translation id="4288101205645068104">車両情報の削除</translation>
 <translation id="4290920330097335010">許可しない</translation>
 <translation id="4296207570293932800">新しい広告のプライバシー機能をご利用いただけるようになりました</translation>
 <translation id="4297502707443874121"><ph name="THUMBNAIL_PAGE" /> ページのサムネイル</translation>
@@ -2153,6 +2155,7 @@
 <translation id="473775607612524610">更新</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> の検索候補</translation>
 <translation id="4742407542027196863">パスワードを管理…</translation>
+<translation id="474270528725216349">同期デバイスの 1 件以上のサイトから</translation>
 <translation id="4743275772928623722">システムは更新されましたが、一部のアプリやファイルを復元できませんでした。アプリは自動的に再ダウンロードされます。</translation>
 <translation id="4744514002166662487">プレゼンテーションを作成</translation>
 <translation id="4744603770635761495">実行ファイルのパス</translation>
@@ -2283,6 +2286,7 @@
 <translation id="495170559598752135">操作</translation>
 <translation id="4953689047182316270">ユーザー補助機能のイベントへの応答</translation>
 <translation id="4957080528849277028">[Chrome 履歴を表示] ボタンです。実行すると、Chrome の設定で閲覧履歴を表示、管理できます</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{と 1 件のサイト}other{と # 件のサイト}}</translation>
 <translation id="4958444002117714549">リストを展開する</translation>
 <translation id="4960068118612257147">Chrome の広告プライバシー設定で変更できます</translation>
 <translation id="4960203958361543136">検索エンジンの選択</translation>
@@ -2617,8 +2621,10 @@
 <translation id="553377674408670169">教育系の求人情報</translation>
 <translation id="5534785731327961487">買い時</translation>
 <translation id="5536214594743852365">「<ph name="SECTION" />」セクションを表示します</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{と 1 件のサイト(同期デバイスではそれ以上のサイト)}other{と # 件のサイト(同期デバイスではそれ以上のサイト)}}</translation>
 <translation id="553782666181800029">長形 2 号封筒</translation>
 <translation id="5538270463355278784">自動全画面表示</translation>
+<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />、<ph name="KEYWORD_SUFFIX" /> を検索</translation>
 <translation id="5539243836947087108">ラフト</translation>
 <translation id="5540224163453853">リクエストされた記事が見つかりませんでした。</translation>
 <translation id="5540969246441091044">馬術</translation>
@@ -2777,6 +2783,7 @@
 <translation id="5838278095973806738">このサイトでは機密情報(パスワード、クレジット カードなど)を入力しないでください。悪意のあるユーザーに情報が盗まれる恐れがあります。</translation>
 <translation id="5838732667866024867">左右の矢印を使って、グラフで価格の変動を確認できます</translation>
 <translation id="5840318881868981258">保存先の Google アカウント: <ph name="ACCOUNT" /></translation>
+<translation id="5841007907672481419"><ph name="TYPE_1" /> から</translation>
 <translation id="5841338463993781099">アカウントに保存しますか?</translation>
 <translation id="5843987376989109187">この言語はまだサポートされていません。
     <ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation>
@@ -2790,6 +2797,7 @@
 <translation id="5863515189965725638">IBAN の編集</translation>
 <translation id="5863847714970149516">表示しようとしているページでは課金される恐れがあります</translation>
 <translation id="5866257070973731571">電話番号の追加</translation>
+<translation id="5866327164731551901"><ph name="TYPE_1" /> <ph name="TYPE_2" /> から</translation>
 <translation id="5866898949289125849">デベロッパー ツール ページを表示しています</translation>
 <translation id="5869405914158311789">このサイトにアクセスできません</translation>
 <translation id="5869522115854928033">保存したパスワード</translation>
@@ -3499,6 +3507,7 @@
 <translation id="7075452647191940183">リクエストが大きすぎます</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
+<translation id="7079783554682867524"><ph name="TYPE_1" /> から(同期デバイスではそれ以上のサイト)</translation>
 <translation id="7081311540357715807">食料品小売業</translation>
 <translation id="7083258188081898530">トレイ 9</translation>
 <translation id="7086090958708083563">ユーザーからアップロードがリクエストされました</translation>
@@ -4156,6 +4165,7 @@
 <translation id="8216640997712497593">14x18 インチ</translation>
 <translation id="8218327578424803826">割り当てられた場所:</translation>
 <translation id="8220602974062798186"><ph name="TOPIC" /> とその関連トピックをブロックしますか?</translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />、<ph name="KEYWORD_SUFFIX" /> に聞く</translation>
 <translation id="8228419419708659934">2 ページ表示</translation>
 <translation id="8228477714872026922"><ph name="ORIGIN" /> がご利用のネットワーク上のデバイスへのアクセスを求めています。</translation>
 <translation id="822925450938886901">詳細と適用される可能性のあるポリシーについては、ブラウザで chrome://management を開いてください。</translation>
@@ -4199,6 +4209,7 @@
 <translation id="8280630997017109758">トレイ 11</translation>
 <translation id="8281730697546299650">その他の広告のプライバシー機能がリリースされました</translation>
 <translation id="8281886186245836920">スキップ</translation>
+<translation id="8282292167096638950">運転免許証の削除</translation>
 <translation id="8282409409360764263">庭のメンテナンス</translation>
 <translation id="8282947398454257691">デバイス固有の ID の認識</translation>
 <translation id="8284769179630993263">Chrome の設定でセーフ ブラウジングなどを管理します</translation>
@@ -4226,6 +4237,7 @@
 <translation id="8321476692217554900">通知</translation>
 <translation id="8322402665880479974">ベッド、ヘッドボード</translation>
 <translation id="8323505966575306467">パスワードの保護を強化</translation>
+<translation id="832547548543012337">パスポートの削除</translation>
 <translation id="832567874344484841">朝食</translation>
 <translation id="8329068931308448247">#14 封筒</translation>
 <translation id="8332188693563227489"><ph name="HOST_NAME" /> へのアクセスが拒否されました</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb
index 72245502..81c50a2 100644
--- a/components/strings/components_strings_ka.xtb
+++ b/components/strings/components_strings_ka.xtb
@@ -528,6 +528,7 @@
 <translation id="1890171020361705182">დინოზავრთა თამაში. პიქსელირებული დინოზავრი თავიდან ირიდებს კაქტუსებთან და პტეროდაქტილებთან დაჯახებას, უდაბური ლანდშაფტის სიღრმეებში გარბენისას. აუდიომინიშნების გაგონებისას შეეხეთ, რათა გადაახტუნოთ დაბრკოლებებზე.</translation>
 <translation id="1898423065542865115">ფილტრაცია</translation>
 <translation id="1901443836186977402">{1,plural, =1{ეს სერვერი ვერ ამტკიცებს, რომ ის არის <ph name="DOMAIN" />; მის უსაფრთხოების სერტიფიკატს ვადა გუშინ გაუვიდა. ეს შეიძლება გამოწვეული იყოს არასწორი კონფიგურაციით ან თავდამსხმელის მიერ თქვენი კავშირის ხელში ჩაგდებით. თქვენი კომპიუტერის საათი დაყენებულია შემდეგ მნიშვნელობაზე: <ph name="CURRENT_DATE" />. სწორია? თუ არა, შეასწორეთ თქვენი სისტემის საათი და შემდეგ განაახლეთ ეს გვერდი.}other{ეს სერვერი ვერ ამტკიცებს, რომ ის არის <ph name="DOMAIN" />; მის უსაფრთხოების სერტიფიკატს ვადა გაუვიდა # დღის წინ. ეს შეიძლება გამოწვეული იყოს არასწორი კონფიგურაციით ან თავდამსხმელის მიერ თქვენი კავშირის ხელში ჩაგდებით. თქვენი კომპიუტერის საათი დაყენებულია შემდეგ მნიშვნელობაზე: <ph name="CURRENT_DATE" />. სწორია? თუ არა, შეასწორეთ თქვენი სისტემის საათი და შემდეგ განაახლეთ ეს გვერდი.}}</translation>
+<translation id="190166348986967700">თქვენი ადმინისტრატორის მიერ <ph name="CLOUD_PROVIDER" />-ზე თქვენი ფაილების ატვირთვის დაწყების დროა <ph name="DATE_TIME" />. განახლების დასრულებამდე დაკავშირებული გქონდეთ თქვენი მოწყობილობა. ატვირთვის პროცესში მხოლოდ ადგილობრივი ფაილების წაკითხვის საშუალება გექნებათ.</translation>
 <translation id="1902576642799138955">მოქმედების პერიოდი</translation>
 <translation id="1908217026282415406">კამერის გამოყენება და გადაადგილება</translation>
 <translation id="1908690643053136980">თქვენი ადმინისტრატორი კრძალავს <ph name="PERMISSION" />-ის წვდომას ამ საიტზე</translation>
@@ -2154,6 +2155,7 @@
 <translation id="473775607612524610">განახლება</translation>
 <translation id="4738601419177586157">„<ph name="TEXT" />“-ის ძიების შემოთავაზება</translation>
 <translation id="4742407542027196863">პაროლების მართვა…</translation>
+<translation id="474270528725216349">მინიმუმ 1 საიტიდან სინქრონიზებულ მოწყობილობებში</translation>
 <translation id="4743275772928623722">თქვენი სისტემა განახლდა, თუმცა თქვენი ზოგიერთი აპისა და ფაილის აღდგენა ვერ მოხერხდა. თქვენი აპები ხელახლა ჩამოიტვირთება ავტომატურად.</translation>
 <translation id="4744514002166662487">პრეზენტაციის შექმნა</translation>
 <translation id="4744603770635761495">შესრულებადი მისამართი</translation>
@@ -2284,6 +2286,7 @@
 <translation id="495170559598752135">ქმედებები</translation>
 <translation id="4953689047182316270">მარტივ წვდომასთან დაკავშირებულ მოვლენებზე რეაგირება</translation>
 <translation id="4957080528849277028">თქვენი Chrome-ის ისტორიის ნახვის ღილაკი, Chrome პარამეტრებიდან დათვალიერების ისტორიის სანახავად და სამართავად გაააქტიურეთ ის</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{+ 1 საიტი}other{+ # საიტი}}</translation>
 <translation id="4958444002117714549">სიის გაშლა</translation>
 <translation id="4960068118612257147">ცვლილებების შეტანა Chrome-ის რეკლამის კონფიდენციალურობის პარამეტრებიდან შეგიძლიათ</translation>
 <translation id="4960203958361543136">აირჩიეთ თქვენი საძიებო სისტემა</translation>
@@ -2618,8 +2621,10 @@
 <translation id="553377674408670169">ვაკანსიები განათლების სფეროში</translation>
 <translation id="5534785731327961487">კარგი შეთავაზება</translation>
 <translation id="5536214594743852365">სექციის „<ph name="SECTION" />“ ჩვენება</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{+ 1 საიტი (ვრცლად სინქრონიზებული მოწყობილობების შესახებ)}other{+ # საიტი (ვრცლად სინქრონიზებული მოწყობილობების შესახებ)}}</translation>
 <translation id="553782666181800029">კონვერტი Chou 2</translation>
 <translation id="5538270463355278784">ავტომატური სრულეკრანიანი რეჟიმი</translation>
+<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />, <ph name="KEYWORD_SUFFIX" />-ში ძიება</translation>
 <translation id="5539243836947087108">მთლიანი საძირკველი</translation>
 <translation id="5540224163453853">მოთხოვნილი სტატია ვერ მოიძებნა.</translation>
 <translation id="5540969246441091044">ცხენოსნობა</translation>
@@ -2778,6 +2783,7 @@
 <translation id="5838278095973806738">გირჩევთ, არ შეიყვანოთ კონფიდენციალური ინფორმაცია (მაგალითად, პაროლები ან საკრედიტო ბარათების მონაცემები) ამ საიტზე, რადგან თავდამსხმელებს მისი მოპარვა შეუძლიათ.</translation>
 <translation id="5838732667866024867">დიაგრამაში ფასის ცვლილებების შესამოწმებლად შეგიძლიათ გამოიყენოთ მარცხნივ/მარჯვნივ მიმართული ისრები</translation>
 <translation id="5840318881868981258">თქვენს Google ანგარიშში (<ph name="ACCOUNT" />)</translation>
+<translation id="5841007907672481419"><ph name="TYPE_1" />-დან</translation>
 <translation id="5841338463993781099">გსურთ ანგარიშში შენახვა?</translation>
 <translation id="5843987376989109187">ეს ენა არ არის ჯერჯერობით მხარდაჭერილი.
     <ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /></translation>
@@ -2791,6 +2797,7 @@
 <translation id="5863515189965725638">IBAN-ის რედაქტირება</translation>
 <translation id="5863847714970149516">გვერდმა, რომელზე გადასვლასაც აპირებთ, შეიძლება დაგაკისროთ თანხის გადახდა</translation>
 <translation id="5866257070973731571">დაამატეთ ტელეფონის ნომერი</translation>
+<translation id="5866327164731551901"><ph name="TYPE_1" />-დან <ph name="TYPE_2" /></translation>
 <translation id="5866898949289125849">თქვენ ათვალიერებთ დეველოპერთა ხელსაწყოების გვერდს</translation>
 <translation id="5869405914158311789">ეს საიტი მიუწვდომელია</translation>
 <translation id="5869522115854928033">შენახული პაროლები</translation>
@@ -3500,6 +3507,7 @@
 <translation id="7075452647191940183">მოთხოვნა მეტისმეტად დიდია</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u10FB\u0020</translation>
+<translation id="7079783554682867524"><ph name="TYPE_1" />-დან (ვრცლად სინქრონიზებული მოწყობილობების შესახებ)</translation>
 <translation id="7081311540357715807">საკვებითა და სურსათით საცალო ვაჭრობა</translation>
 <translation id="7083258188081898530">ლანგარი 9</translation>
 <translation id="7086090958708083563">ატვირთვა მოთხოვნილია მომხმარებლის მიერ</translation>
@@ -4155,6 +4163,7 @@
 <translation id="8216640997712497593">14 x 18 დუიმი</translation>
 <translation id="8218327578424803826">მიმაგრებული მდებარეობა:</translation>
 <translation id="8220602974062798186">გსურთ, დაბლოკოთ <ph name="TOPIC" /> და მასთან დაკავშირებული თემები?</translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />, ჰკითხეთ <ph name="KEYWORD_SUFFIX" />-ს</translation>
 <translation id="8228419419708659934">ორგვერდიანი ხედი</translation>
 <translation id="8228477714872026922"><ph name="ORIGIN" />-ს სურს თქვენს ქსელში ჩართულ მოწყობილობაზე წვდომა:</translation>
 <translation id="822925450938886901">დამატებითი ინფორმაციისა და მოქმედი წესებისთვის ბრაუზერში გახსენით chrome://management.</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb
index 72c33563..8888c048 100644
--- a/components/strings/components_strings_kk.xtb
+++ b/components/strings/components_strings_kk.xtb
@@ -194,7 +194,7 @@
 <translation id="1319245136674974084">Бұдан былай бұл қолданба үшін сұралмасын</translation>
 <translation id="1322083935398004629">Саясат</translation>
 <translation id="132301787627749051">Буфер кескінін іздеу</translation>
-<translation id="1323433172918577554">Толығырақ</translation>
+<translation id="1323433172918577554">Толық ақпарат</translation>
 <translation id="1329916999021038454">Есепті жіберу</translation>
 <translation id="1330449323196174374">Сол жағын қақпа тәрізді бүктеу</translation>
 <translation id="1333745675627230582">Chrome Dino ойынын ойнау</translation>
@@ -1820,7 +1820,7 @@
 <translation id="4130226655945681476">Желі кабельдерін, модем және роутерді тексеру</translation>
 <translation id="4132448310531350254">Қолданбаларда file_extension "<ph name="FILE_EXTENSION" />" кеңейтімін өңдейтін бірнеше құрал көрсетілген: "<ph name="POLICY_IDS_LIST" />".</translation>
 <translation id="4134123981501319574">Құжат жасау</translation>
-<translation id="413544239732274901">Толығырақ</translation>
+<translation id="413544239732274901">Толық ақпарат</translation>
 <translation id="4140905366050378834">Үй жануарларының тағамы мен күтімі</translation>
 <translation id="4140905530744469899">Профиль идентификаторы:</translation>
 <translation id="4142935452406587478">10-науа</translation>
@@ -2970,7 +2970,7 @@
 <translation id="6160391204859821737">Жарнамадағы құпиялық функциясын қосу</translation>
 <translation id="6162403104168428984">Мекенжайды өзгерту керек пе?</translation>
 <translation id="6164605812717770913">Ата-анаңыз немесе қамқоршыңыз бұл сайтқа кіруге тыйым салған. Оны блоктан шығаруды сұраңыз.</translation>
-<translation id="6165508094623778733">Толығырақ</translation>
+<translation id="6165508094623778733">Толық ақпарат</translation>
 <translation id="6167577165590485365">Саясатты алуға жасалған соңғы әрекет:</translation>
 <translation id="617256461084925519">Google Chrome төлем туралы ақпаратыңызды толтыру үшін сіз екеніңізді растағысы келеді.</translation>
 <translation id="6173208311907792313">Сатып алуды Windows Hello көмегімен аяқтаңыз.</translation>
@@ -4291,7 +4291,7 @@
 <translation id="8438786541497918448">Камера және микрофон пайдаланылсын ба?</translation>
 <translation id="8438923942245957911">Бұл сайтқа ұйымыңыз жалауша қойды</translation>
 <translation id="8446275044635689572">Арт-перфоманс</translation>
-<translation id="8446884382197647889">Толығырақ</translation>
+<translation id="8446884382197647889">Толық ақпарат</translation>
 <translation id="8449155699563577224">17 x 24 дюйм</translation>
 <translation id="8449836157089738489">Барлығын жаңа қойындылар тобында ашу</translation>
 <translation id="84561192812921051">Әкімші профиль мен браузерге қашықтан өзгеріс енгізе алады, есеп беру арқылы браузер туралы ақпаратты талдай алады және басқа қажетті тапсырмаларды орындай алады. Бұл құрылғыдағы әрекеттерді Chrome браузерінен тыс та басқаруға болады.  <ph name="BEGIN_LINK" />Толық ақпарат<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb
index 977c4cf..5994ad2 100644
--- a/components/strings/components_strings_ko.xtb
+++ b/components/strings/components_strings_ko.xtb
@@ -528,6 +528,7 @@
 <translation id="1890171020361705182">공룡 게임입니다. 픽셀 스타일의 공룡이 선인장과 프테로사우루스를 피하며 황무지를 달려갑니다. 오디오 신호음이 들리면 탭하여 장애물을 뛰어넘으세요.</translation>
 <translation id="1898423065542865115">필터링</translation>
 <translation id="1901443836186977402">{1,plural, =1{서버의 보안 인증서가 마지막 날 만료되어 서버가 <ph name="DOMAIN" />임을 입증할 수 없습니다. 설정이 잘못되었거나 공격자가 연결을 가로채고 있기 때문일 수 있습니다. 현재 컴퓨터의 시간이 <ph name="CURRENT_DATE" />로 설정되어 있습니다. 시간이 정확하지 않으면 시스템 시간을 수정하고 이 페이지를 새로고침하세요.}other{서버의 보안 인증서가 #일 전에 만료되어 서버가 <ph name="DOMAIN" />임을 입증할 수 없습니다. 설정이 잘못되었거나 공격자가 연결을 가로채고 있기 때문일 수 있습니다. 현재 컴퓨터의 시간이 <ph name="CURRENT_DATE" />로 설정되어 있습니다. 시간이 정확하지 않으면 시스템 시간을 수정하고 이 페이지를 새로고침하세요.}}</translation>
+<translation id="190166348986967700"><ph name="DATE_TIME" />에 관리자가 파일을 <ph name="CLOUD_PROVIDER" />에 업로드하기 시작합니다. 파일 업로드가 완료될 때까지 기기를 연결된 상태로 유지하세요. 업로드하는 동안에는 로컬 파일을 읽는 것만 가능합니다.</translation>
 <translation id="1902576642799138955">유효성 기간</translation>
 <translation id="1908217026282415406">카메라 사용 및 이동</translation>
 <translation id="1908690643053136980">관리자가 이 사이트에 <ph name="PERMISSION" /> 권한을 허용하지 않습니다.</translation>
@@ -1924,6 +1925,7 @@
 <translation id="4282346679996504092">제품 관련 알림이 사용 중지되었으며 북마크가 삭제되었습니다.</translation>
 <translation id="4285498937028063278">고정 해제</translation>
 <translation id="4287495839370498922">Chrome의 개선된 광고 개인 정보 보호</translation>
+<translation id="4288101205645068104">차량 삭제</translation>
 <translation id="4290920330097335010">허용 안함</translation>
 <translation id="4296207570293932800">새로운 광고 개인 정보 보호 기능 사용 가능</translation>
 <translation id="4297502707443874121"><ph name="THUMBNAIL_PAGE" /> 페이지 미리보기 이미지</translation>
@@ -2153,6 +2155,7 @@
 <translation id="473775607612524610">업데이트</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> 추천 검색어</translation>
 <translation id="4742407542027196863">비밀번호 관리...</translation>
+<translation id="474270528725216349">동기화된 기기의 사이트 1개 이상에서</translation>
 <translation id="4743275772928623722">시스템이 업데이트되었지만 일부 앱과 파일은 복구되지 않았습니다. 앱이 자동으로 다시 다운로드됩니다.</translation>
 <translation id="4744514002166662487">프레젠테이션 만들기</translation>
 <translation id="4744603770635761495">실행 가능 경로</translation>
@@ -2283,6 +2286,7 @@
 <translation id="495170559598752135">작업</translation>
 <translation id="4953689047182316270">접근성 이벤트에 응답</translation>
 <translation id="4957080528849277028">Chrome 방문 기록 보기 버튼, Chrome 설정에서 방문 기록을 보고 관리하려면 활성화하세요.</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{외 사이트 1개}other{외 사이트 #개}}</translation>
 <translation id="4958444002117714549">펼치기 목록</translation>
 <translation id="4960068118612257147">Chrome 광고 개인 정보 보호 설정에서 변경할 수 있습니다.</translation>
 <translation id="4960203958361543136">검색엔진 선택</translation>
@@ -2617,8 +2621,10 @@
 <translation id="553377674408670169">교육직</translation>
 <translation id="5534785731327961487">특가 상품</translation>
 <translation id="5536214594743852365">‘<ph name="SECTION" />’ 섹션 표시</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{외 사이트 1개(동기화된 기기에는 그 이상)}other{외 사이트 #개(동기화된 기기에는 그 이상)}}</translation>
 <translation id="553782666181800029">봉투 Chou 2</translation>
 <translation id="5538270463355278784">자동 전체 화면</translation>
+<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />, <ph name="KEYWORD_SUFFIX" />에서 검색하기</translation>
 <translation id="5539243836947087108">래프트</translation>
 <translation id="5540224163453853">요청한 글을 찾지 못했습니다.</translation>
 <translation id="5540969246441091044">승마</translation>
@@ -2777,6 +2783,7 @@
 <translation id="5838278095973806738">이 사이트에 입력하는 비밀번호나 신용카드 번호 등의 정보가 공격자에 의해 도용될 수 있습니다.</translation>
 <translation id="5838732667866024867">왼쪽/오른쪽 화살표를 사용하여 그래프에서 가격 변경사항을 검토할 수 있습니다.</translation>
 <translation id="5840318881868981258">Google 계정(<ph name="ACCOUNT" />)에서 업데이트합니다.</translation>
+<translation id="5841007907672481419"><ph name="TYPE_1" />에서</translation>
 <translation id="5841338463993781099">계정에 저장하시겠습니까?</translation>
 <translation id="5843987376989109187">아직 지원되지 않는 언어입니다.
     <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation>
@@ -2790,6 +2797,7 @@
 <translation id="5863515189965725638">IBAN 수정</translation>
 <translation id="5863847714970149516">방문하려는 페이지에서 금액을 청구할 수 있습니다.</translation>
 <translation id="5866257070973731571">전화번호 추가</translation>
+<translation id="5866327164731551901"><ph name="TYPE_1" /> <ph name="TYPE_2" />에서</translation>
 <translation id="5866898949289125849">개발자 도구 페이지를 보는 중입니다.</translation>
 <translation id="5869405914158311789">사이트에 연결할 수 없음</translation>
 <translation id="5869522115854928033">저장된 비밀번호</translation>
@@ -3499,6 +3507,7 @@
 <translation id="7075452647191940183">요청이 너무 큼</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
+<translation id="7079783554682867524"><ph name="TYPE_1" />(동기화된 기기에는 그 이상)에서</translation>
 <translation id="7081311540357715807">음식 및 식료품 소매업체</translation>
 <translation id="7083258188081898530">트레이 9</translation>
 <translation id="7086090958708083563">사용자가 요청한 업로드</translation>
@@ -4154,6 +4163,7 @@
 <translation id="8216640997712497593">14x18인치</translation>
 <translation id="8218327578424803826">지정된 위치:</translation>
 <translation id="8220602974062798186"><ph name="TOPIC" /> 및 모든 관련 주제를 차단하시겠습니까?</translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />, <ph name="KEYWORD_SUFFIX" />에 질문하기</translation>
 <translation id="8228419419708659934">두 페이지씩 보기</translation>
 <translation id="8228477714872026922"><ph name="ORIGIN" />에서 내 네트워크의 다음 기기에 액세스하려고 합니다.</translation>
 <translation id="822925450938886901">적용 가능한 추가 정보 및 정책을 보려면 브라우저에서 chrome://management를 여세요.</translation>
@@ -4197,6 +4207,7 @@
 <translation id="8280630997017109758">트레이 11</translation>
 <translation id="8281730697546299650">기타 광고 개인 정보 보호 기능 사용 가능</translation>
 <translation id="8281886186245836920">건너뛰기</translation>
+<translation id="8282292167096638950">운전면허증 삭제</translation>
 <translation id="8282409409360764263">마당 관리</translation>
 <translation id="8282947398454257691">고유 기기 식별자 조회</translation>
 <translation id="8284769179630993263">Chrome 설정에서 세이프 브라우징 등 관리</translation>
@@ -4224,6 +4235,7 @@
 <translation id="8321476692217554900">알림</translation>
 <translation id="8322402665880479974">침대 및 헤드보드</translation>
 <translation id="8323505966575306467">비밀번호 보안 강화</translation>
+<translation id="832547548543012337">여권 삭제</translation>
 <translation id="832567874344484841">아침식사용 식품</translation>
 <translation id="8329068931308448247">봉투 #14</translation>
 <translation id="8332188693563227489"><ph name="HOST_NAME" />에 대한 액세스가 거부됨</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb
index e45aa16..679b037 100644
--- a/components/strings/components_strings_ky.xtb
+++ b/components/strings/components_strings_ky.xtb
@@ -528,6 +528,7 @@
 <translation id="1890171020361705182">Динозавр оюну. Пикселденген динозавр ээн ландшафтты аралап, кактус менен птеродактилдерден качат. Аудио сигналды укканда тоскоолдуктардан секирип өтүңүз.</translation>
 <translation id="1898423065542865115">Чыпкалоо</translation>
 <translation id="1901443836186977402">{1,plural, =1{Бул сервер <ph name="DOMAIN" /> экендигин далилдей алган жок; анын коопсуздук тастыктамасынын мөөнөтү бүтүп калды. Мындай көйгөй сервердин туура эмес конфигурацияланышы менен шартталышы мүмкүн же кимдир-бирөө ортодон дайын-даректериңизди кармап калганга аракет кылып жатат. Учурда компьютериңиздин сааты <ph name="CURRENT_DATE" /> болуп коюлган. Туура элеби? Эгер туура эмес болсо, системаңыздын саатын тууралап, бул баракты жаңылаңыз.}other{Бул сервер <ph name="DOMAIN" /> экендигин далилдей алган жок; анын коопсуздук тастыктамасынын мөөнөтү # күн мурун аяктаган. Мындай көйгөй туура эмес конфигурация менен шартталышы мүмкүн же туташууңузга чабуулчу кийлигишип жатат. Учурда компьютериңиздеги саат <ph name="CURRENT_DATE" /> болду. Туурабы? Эгер туура эмес болсо, системаңыздын саатын тууралап, андан соң бул бетти жаңылаңыз.}}</translation>
+<translation id="190166348986967700">Администраторуңуз файлдарыңызды <ph name="CLOUD_PROVIDER" /> камсыздоочусуна <ph name="DATE_TIME" />жүктөп берип баштайт. Файлыңызды жүктөп берүү аяктаганга чейин түзмөгүңүз туташып турушу керек. Жүктөп берүү учурунда түзмөктөгү файлдарды гана окуй аласыз.</translation>
 <translation id="1902576642799138955">Жарактуулук мезгили</translation>
 <translation id="1908217026282415406">Камераны колдонуу жана жылдыруу</translation>
 <translation id="1908690643053136980">Администраторуңуз бул сайт үчүн <ph name="PERMISSION" /> колдонууга уруксат бербейт</translation>
@@ -1923,6 +1924,7 @@
 <translation id="4282346679996504092">Бул товар боюнча эскертүүлөр өчүрүлүп, кыстарма алынып салынды</translation>
 <translation id="4285498937028063278">Бошотуу</translation>
 <translation id="4287495839370498922">Chrome'до жарнамалардын купуялык шарттары жакшырды</translation>
+<translation id="4288101205645068104">Унааны өчүрүү</translation>
 <translation id="4290920330097335010">Эч качан уруксат берилбесин</translation>
 <translation id="4296207570293932800">Эми жарнамалардын купуялыгын коргогон жаңы функциялар чыкты</translation>
 <translation id="4297502707443874121"><ph name="THUMBNAIL_PAGE" /> барагынын эскизи</translation>
@@ -2152,6 +2154,7 @@
 <translation id="473775607612524610">Жаңыртуу</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> издөө сунушу</translation>
 <translation id="4742407542027196863">Сырсөздөрдү башкаруу…</translation>
+<translation id="474270528725216349">Шайкештирилген түзмөктөрдө кеминде 1 сайттан</translation>
 <translation id="4743275772928623722">Системаңыз жаңырды, бирок айрым колдонмолор жана файлдар калыбына келтирилген жок. Колдонмолоруңуз автоматтык түрдө кайра жүктөлүп алынат.</translation>
 <translation id="4744514002166662487">Презентация түзүү</translation>
 <translation id="4744603770635761495">Аткарылуучу жол</translation>
@@ -2282,6 +2285,7 @@
 <translation id="495170559598752135">Аракеттер</translation>
 <translation id="4953689047182316270">Атайын мүмкүнчүлүктөрдү иштетүү</translation>
 <translation id="4957080528849277028">"Chrome'до көрүлгөн вебсайттарды көрүү" баскычы. Chrome жөндөөлөрүндө көрүлгөн вебсайттарды көрүү жана башкаруу үчүн иштетиңиз</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{Дагы 1 сайт}other{Дагы # сайт}}</translation>
 <translation id="4958444002117714549">Тизмени жайып көрсөтүү</translation>
 <translation id="4960068118612257147">Chome'дун жарнаманын купуялык параметрлерине өтүп, өзгөртүүлөрдү киргизе аласыз</translation>
 <translation id="4960203958361543136">Издөө куралын тандаңыз</translation>
@@ -2616,8 +2620,10 @@
 <translation id="553377674408670169">Билим берүү жумуштары</translation>
 <translation id="5534785731327961487">Пайдалуу сунуш</translation>
 <translation id="5536214594743852365">"<ph name="SECTION" />" бөлүгүн көрсөтүү</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{Дагы 1 сайт (шайкештирилген түзмөктөрдө көбүрөөк)}other{Дагы # сайт (шайкештирилген түзмөктөрдө көбүрөөк)}}</translation>
 <translation id="553782666181800029">Конверт Чоу 2</translation>
 <translation id="5538270463355278784">автоматтык толук экран</translation>
+<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />, бул жерден издөө: <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="5539243836947087108">Сал</translation>
 <translation id="5540224163453853">Суралган макала табылган жок.</translation>
 <translation id="5540969246441091044">Ат спорту</translation>
@@ -2776,6 +2782,7 @@
 <translation id="5838278095973806738">Бул сайтка эч кандай жеке маалымат киргизилбеши керек (мисалы, сырсөздөр же насыя карточкаларынын номерлери), себеби аны чабуулчулар уурдап алышы мүмкүн.</translation>
 <translation id="5838732667866024867">Солго/оңго жебени колдонуп, диаграммада баалардын өзгөрүшүн карап көрө аласыз</translation>
 <translation id="5840318881868981258">Google аккаунтуңузда, <ph name="ACCOUNT" /></translation>
+<translation id="5841007907672481419"><ph name="TYPE_1" /> баштап</translation>
 <translation id="5841338463993781099">Аккаунтта сактайсызбы?</translation>
 <translation id="5843987376989109187">Бул тил азырынча колдоого алынбайт.
     <ph name="BEGIN_LINK" />Кеңири маалымат<ph name="END_LINK" /></translation>
@@ -2789,6 +2796,7 @@
 <translation id="5863515189965725638">IBAN'ды түзөтүү</translation>
 <translation id="5863847714970149516">Кийинки баракка өтсөңүз, акы алынышы мүмкүн</translation>
 <translation id="5866257070973731571">Телефон номерин кошуу</translation>
+<translation id="5866327164731551901"><ph name="TYPE_1" /> <ph name="TYPE_2" /> баштап</translation>
 <translation id="5866898949289125849">Иштеп чыгуучунун куралдар барагын көрүп жатасыз</translation>
 <translation id="5869405914158311789">Бул сайт жеткиликсиз</translation>
 <translation id="5869522115854928033">Сакталган сырсөздөр</translation>
@@ -3498,6 +3506,7 @@
 <translation id="7075452647191940183">Сурамдын көлөмү өтө чоң</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
+<translation id="7079783554682867524"><ph name="TYPE_1" /> сайтынан (көбүрөөк шайкештирилген түзмөктөрдө)</translation>
 <translation id="7081311540357715807">Тамак-аш жана азык-түлүк сатуучулар</translation>
 <translation id="7083258188081898530">9-түпкүч</translation>
 <translation id="7086090958708083563">Колдонуучу тарабынан жүктөп берүү суралды</translation>
@@ -4153,6 +4162,7 @@
 <translation id="8216640997712497593">14 x 18 дюйм</translation>
 <translation id="8218327578424803826">Дайындалган жайгашкан жер:</translation>
 <translation id="8220602974062798186"><ph name="TOPIC" /> жана ага тийиштүү темалар өчүрүлсүнбү?</translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />, <ph name="KEYWORD_SUFFIX" />'дан сураңыз</translation>
 <translation id="8228419419708659934">Эки барак көрүнүшү</translation>
 <translation id="8228477714872026922"><ph name="ORIGIN" /> тармагыңыздагы түзмөккө киргиси келет:</translation>
 <translation id="822925450938886901">Кошумча маалыматты жана колдонулган эрежелерди көрүү үчүн серепчиден chrome://management барагын ачыңыз.</translation>
@@ -4196,6 +4206,7 @@
 <translation id="8280630997017109758">11-түпкүч</translation>
 <translation id="8281730697546299650">Эми жарнамалардын купуялыгын камсыз кылган башка функциялар жеткиликтүү</translation>
 <translation id="8281886186245836920">Өткөрүп жиберүү</translation>
+<translation id="8282292167096638950">Айдоочунун күбөлүгүн өчүрүү</translation>
 <translation id="8282409409360764263">Короо-жайды тейлөө</translation>
 <translation id="8282947398454257691">Түзмөктүн уникалдуу далдаштырма кодун билүү</translation>
 <translation id="8284769179630993263">Chrome параметрлеринен Коопсуз серептөөнү жана башка нерселерди башкаруу</translation>
@@ -4223,6 +4234,7 @@
 <translation id="8321476692217554900">билдирмелер</translation>
 <translation id="8322402665880479974">Керебеттер жана алардын алдыңкы жөлөнгүчтөрү</translation>
 <translation id="8323505966575306467">Сырсөздөрдү бекемирээк коргоңуз</translation>
+<translation id="832547548543012337">Паспортту өчүрүү</translation>
 <translation id="832567874344484841">Эртең мененки тамактар</translation>
 <translation id="8329068931308448247">Конверт #14</translation>
 <translation id="8332188693563227489"><ph name="HOST_NAME" /> сайтына кирүү мүмкүнчүлүгү четке кагылды</translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb
index ea0e674..e7440619 100644
--- a/components/strings/components_strings_lo.xtb
+++ b/components/strings/components_strings_lo.xtb
@@ -528,6 +528,7 @@
 <translation id="1890171020361705182">ເກມ Dino. ໄດໂນເສົາແບບພິກເຊວໂດດຂ້າມຕົ້ນຕະບອງເພັດ ແລະ ເທີໂຣແດັກທິນລັສໃນເວລາທີ່ມັນແລ່ນຂ້າມພື້ນທີ່ອັກຮົກຮ້າງ. ເມື່ອທ່ານໄດ້ຍິນສັນຍານສຽງ, ໃຫ້ແຕະເພື່ອໂດດຂ້າມສິ່ງກີດຂວາງ.</translation>
 <translation id="1898423065542865115">ການກັ່ນຕອງ</translation>
 <translation id="1901443836186977402">{1,plural, =1{ເຊີບເວີນີ້ບໍ່ສາມາດພິສູດໄດ້ວ່າມັນແມ່ນ <ph name="DOMAIN" />; ໃບຮັບຮອງຄວາມປອດໄພຂອງມັນໝົດອາຍຸແລ້ວໃນມື້ຜ່ານມາ. ສິ່ງນີ້ອາດຈະເກີດຈາກການກຳນົດຄ່າຜິດ ຫຼື ຜູ້ໂຈມຕີທີ່ດັກສະກັດການເຊື່ອມຕໍ່ຂອງທ່ານ. ໂມງໃນຄອມພິວເຕີຂອງທ່ານປັດຈຸບັນຖືກຕັ້ງເປັນ <ph name="CURRENT_DATE" />. ມັນຖືກຕ້ອງແລ້ວບໍ? ຖ້າບໍ່ຖືກ, ທ່ານຄວນແກ້ໄຂໂມງຂອງລະບົບຂອງທ່ານ ຈາກນັ້ນ ໂຫຼດໜ້ານີ້ຄືນໃໝ່.}other{ເຊີບເວີນີ້ບໍ່ສາມາດພິສູດໄດ້ວ່າມັນແມ່ນ <ph name="DOMAIN" />; ໃບຮັບຮອງຄວາມປອດໄພຂອງມັນໝົດອາຍຸແລ້ວເມື່ອ # ກ່ອນ. ນີ້ອາດຈະເກີດຈາກການກຳນົດຄ່າຜິດ ຫຼື ຜູ້ໂຈມຕີທີ່ດັກສະກັດການເຊື່ອມຕໍ່ຂອງທ່ານ. ໂມງໃນຄອມພິວເຕີຂອງທ່ານປັດຈຸບັນຖືກຕັ້ງເປັນ <ph name="CURRENT_DATE" />. ມັນຖືກຕ້ອງແລ້ວບໍ? ຖ້າບໍ່, ທ່ານຄວນແກ້ໄຂໂມງລະບົບຂອງທ່ານໃຫ້ຖືກຕ້ອງ ຈາກນັ້ນໂຫຼດໜ້ານີ້ຄືນໃໝ່.}}</translation>
+<translation id="190166348986967700">ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານຈະເລີ່ມອັບໂຫຼດໄຟລ໌ຂອງທ່ານໃສ່ໃນ <ph name="CLOUD_PROVIDER" /> ໃນວັນທີ <ph name="DATE_TIME" />. ເຊື່ອມຕໍ່ອຸປະກອນຂອງທ່ານໄວ້ຈົນກວ່າການອັບໂຫຼດໄຟລ໌ຂອງທ່ານຈະສຳເລັດ. ໃນລະຫວ່າງທີ່ອັບໂຫຼດ, ທ່ານຈະສາມາດອ່ານໄຟລ໌ໃນເຄື່ອງໄດ້ເທົ່ານັ້ນ.</translation>
 <translation id="1902576642799138955">ໄລຍະການນໍາໃຊ້ໄດ້</translation>
 <translation id="1908217026282415406">ກ້ອງ ແລະ ການເຄື່ອນໄຫວ</translation>
 <translation id="1908690643053136980">ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ໃຊ້ <ph name="PERMISSION" /> ສຳລັບເວັບໄຊນີ້</translation>
@@ -2153,6 +2154,7 @@
 <translation id="473775607612524610">ອັບເດດ</translation>
 <translation id="4738601419177586157">ການແນະນຳການຊອກຫາ <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">ຈັດການລະຫັດຜ່ານ...</translation>
+<translation id="474270528725216349">ຈາກຢ່າງໜ້ອຍ 1 ເວັບໄຊໃນອຸປະກອນທີ່ຊິ້ງ</translation>
 <translation id="4743275772928623722">ອັບເດດລະບົບຂອງທ່ານແລ້ວ ແຕ່ບໍ່ສາມາດກູ້ຄືນແອັບ ແລະ ໄຟລ໌ບາງອັນຂອງທ່ານໄດ້. ແອັບຂອງທ່ານຈະຖືກດາວໂຫຼດຄືນໃໝ່ໂດຍອັດຕະໂນມັດ.</translation>
 <translation id="4744514002166662487">ສ້າງພຣີເຊັນເທເຊິນ</translation>
 <translation id="4744603770635761495">ຊ່ອງ​ທາງ​ທີ່ປະ​ຕິ​ບັດໄດ້</translation>
@@ -2283,6 +2285,7 @@
 <translation id="495170559598752135">ການກະທໍາ</translation>
 <translation id="4953689047182316270">ຕອບສະໜອງຕໍ່ກັບເຫດການການຊ່ວຍເຂົ້າເຖິງ</translation>
 <translation id="4957080528849277028">ປຸ່ມເບິ່ງປະຫວັດ Chrome ຂອງທ່ານ, ເປີດນຳໃຊ້ເພື່ອເບິ່ງ ແລະ ຈັດການປະຫວັດການທ່ອງເວັບຂອງທ່ານໃນການຕັ້ງຄ່າ Chrome</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{ອີກ 1 ເວັບໄຊ}other{ອີກ # ເວັບໄຊ}}</translation>
 <translation id="4958444002117714549">ຂະ​ຫຍາຍ​ລາຍ​ຊື່</translation>
 <translation id="4960068118612257147">ທ່ານສາມາດປ່ຽນການຕັ້ງຄ່າຄວາມເປັນສ່ວນຕົວໃນ Chrome ໄດ້</translation>
 <translation id="4960203958361543136">ເລືອກໂປຣແກຣມຊອກຫາຂອງທ່ານ</translation>
@@ -2617,8 +2620,10 @@
 <translation id="553377674408670169">ວຽກການສຶກສາ</translation>
 <translation id="5534785731327961487">ຂໍ້ສະເໜີທີ່ດີຕອນນີ້</translation>
 <translation id="5536214594743852365">ສະແດງຂໍ້ "<ph name="SECTION" />"</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{ອີກ 1 ເວັບໄຊ (ເບິ່ງເພີ່ມເຕີມໃນອຸປະກອນທີ່ຊິ້ງ)}other{ອີກ # ເວັບໄຊ (ເບິ່ງເພີ່ມເຕີມໃນອຸປະກອນທີ່ຊິ້ງ)}}</translation>
 <translation id="553782666181800029">Envelope Chou 2</translation>
 <translation id="5538270463355278784">ເຕັມຈໍອັດຕະໂນມັດ</translation>
+<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />, ຊອກຫາ <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="5539243836947087108">Raft</translation>
 <translation id="5540224163453853">ບໍ່ສາມາດຊອກຫາບົດຄວາມທີ່ຂໍໄດ້.</translation>
 <translation id="5540969246441091044">ຄົນຂີ່ມ້າ</translation>
@@ -2777,6 +2782,7 @@
 <translation id="5838278095973806738">ທ່ານບໍ່ຄວນປ້ອນຂໍ້ມູນທີ່ອ່ອນໄຫວໃດໆໃສ່ເວັບໄຊນີ້ (ຕົວຢ່າງ: ລະຫັດຜ່ານ ຫຼື ເລກບັດເຄຣດິດ), ເພາະວ່າມັນອາດຈະຖືກລັກໂດຍຜູ້ໂຈມຕີໄດ້.</translation>
 <translation id="5838732667866024867">ທ່ານສາມາດໃຊ້ລູກສອນຊ້າຍ/ຂວາເພື່ອກວດສອບການປ່ຽນແປງລາຄາຢູ່ກຣາບໄດ້</translation>
 <translation id="5840318881868981258">ໃນບັນຊີ Google ຂອງທ່ານ, <ph name="ACCOUNT" /></translation>
+<translation id="5841007907672481419">ຈາກ <ph name="TYPE_1" /></translation>
 <translation id="5841338463993781099">ບັນທຶກໃນບັນຊີບໍ?</translation>
 <translation id="5843987376989109187">ພາສານີ້ຍັງບໍ່ໄດ້ຮັບການຮອງຮັບເທື່ອ.
     <ph name="BEGIN_LINK" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK" /></translation>
@@ -2790,6 +2796,7 @@
 <translation id="5863515189965725638">ແກ້ໄຂ IBAN</translation>
 <translation id="5863847714970149516">ໜ້າທີ່ຈະໄປຫາອາດຈະພະຍາຍາມເກັບເງິນນຳທ່ານ</translation>
 <translation id="5866257070973731571">ເພີ່ມເບີໂທລະສັບ</translation>
+<translation id="5866327164731551901">ຈາກ <ph name="TYPE_1" /> ແລະ <ph name="TYPE_2" /></translation>
 <translation id="5866898949289125849">ທ່ານກຳລັງເບິ່ງໜ້າເຄື່ອງມືສຳລັບຜູ້ພັດທະນາ</translation>
 <translation id="5869405914158311789">ບໍ່ສາມາດເຂົ້າເຖິງເວັບໄຊນີ້ໄດ້</translation>
 <translation id="5869522115854928033">ລະ​ຫັດ​ຜ່ານ​ທີ່ບັນທຶກໄວ້</translation>
@@ -3499,6 +3506,7 @@
 <translation id="7075452647191940183">ຄຳຂໍໃຫຍ່ເກີນໄປ</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
+<translation id="7079783554682867524">ຈາກ <ph name="TYPE_1" /> (ເບິ່ງເພີ່ມເຕີມໃນອຸປະກອນທີ່ຊິ້ງ)</translation>
 <translation id="7081311540357715807">ຮ້ານຂາຍເຄື່ອງຍ່ອຍ ແລະ ຜູ້ຈຳໜ່າຍອາຫານ</translation>
 <translation id="7083258188081898530">ຖາດ 9</translation>
 <translation id="7086090958708083563">ການອັບໂຫຼດທີ່ຂໍໂດຍຜູ້ໃຊ້</translation>
@@ -4154,6 +4162,7 @@
 <translation id="8216640997712497593">14 x 18 ນິ້ວ</translation>
 <translation id="8218327578424803826">ທີ່​ຕັ້ງ​ທີ່​ກຳ​ນົດ​ໃຫ້</translation>
 <translation id="8220602974062798186">ບລັອກ <ph name="TOPIC" /> ແລະ ຫົວຂໍ້ທີ່ກ່ຽວຂ້ອງບໍ?</translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />, ຖາມ <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="8228419419708659934">ມຸມມອງສອງໜ້າ</translation>
 <translation id="8228477714872026922"><ph name="ORIGIN" /> ຕ້ອງການເຂົ້າເຖິງອຸປະກອນໃນເຄືອຂ່າຍຂອງທ່ານ:</translation>
 <translation id="822925450938886901">ສຳລັບຂໍ້ມູນເພີ່ມເຕີມ ແລະ ນະໂຍບາຍທີ່ອາດນຳໃຊ້ຢູ່, ໃຫ້ເປີດ chrome://management ໃນໂປຣແກຣມທ່ອງເວັບຂອງທ່ານ.</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb
index fc13f5df..35a81fec 100644
--- a/components/strings/components_strings_lt.xtb
+++ b/components/strings/components_strings_lt.xtb
@@ -1925,6 +1925,7 @@
 <translation id="4282346679996504092">Šio produkto įspėjimai išjungti ir žymė pašalinta</translation>
 <translation id="4285498937028063278">Atsegti</translation>
 <translation id="4287495839370498922">Patobulintas su skelbimais susijęs privatumas naršyklėje „Chrome“</translation>
+<translation id="4288101205645068104">Ištrinti transporto priemonę</translation>
 <translation id="4290920330097335010">Niekada neleisti</translation>
 <translation id="4296207570293932800">Dabar pasiekiama nauja skelbimų privatumo funkcija</translation>
 <translation id="4297502707443874121"><ph name="THUMBNAIL_PAGE" /> puslapio miniatiūra</translation>
@@ -4199,6 +4200,7 @@
 <translation id="8280630997017109758">Vienuoliktas dėklas</translation>
 <translation id="8281730697546299650">Dabar pasiekiamos kitos skelbimų privatumo funkcijos</translation>
 <translation id="8281886186245836920">Praleisti</translation>
+<translation id="8282292167096638950">Ištrinti vairuotojo pažymėjimą</translation>
 <translation id="8282409409360764263">Kiemo priežiūra</translation>
 <translation id="8282947398454257691">Žinoti unikalų įrenginio identifikatorių</translation>
 <translation id="8284769179630993263">Tvarkykite Saugaus naršymo ir kitus duomenis „Chrome“ nustatymuose</translation>
@@ -4226,6 +4228,7 @@
 <translation id="8321476692217554900">pranešimai</translation>
 <translation id="8322402665880479974">Lovos ir galvūgaliai</translation>
 <translation id="8323505966575306467">Užtikrinkite geresnę slaptažodžių apsaugą</translation>
+<translation id="832547548543012337">Ištrinti pasą</translation>
 <translation id="832567874344484841">Pusryčių maistas</translation>
 <translation id="8329068931308448247">Nr. 14 vokas</translation>
 <translation id="8332188693563227489">Prieiga prie <ph name="HOST_NAME" /> atmesta</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb
index 58ac8c1..7f0a0caa 100644
--- a/components/strings/components_strings_lv.xtb
+++ b/components/strings/components_strings_lv.xtb
@@ -528,6 +528,7 @@
 <translation id="1890171020361705182">Dinozaura spēle. Pikselizēts dinozaurs izvairās no kaktusiem un pterodaktiliem, šķērsojot tuksnešainu ainavu. Kad dzirdat audio norādi, pieskarieties, lai pārlēktu šķēršļiem.</translation>
 <translation id="1898423065542865115">Filtrēšana</translation>
 <translation id="1901443836186977402">{1,plural, =1{Šis serveris nevarēja pierādīt, ka šī ir vietne <ph name="DOMAIN" />. Tās drošības sertifikāta derīguma termiņš beidzās pēdējās dienas laikā. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu. Jūsu datora pulkstenī pašlaik ir iestatīts šāds datums: <ph name="CURRENT_DATE" />. Vai tas ir pareizs? Ja datums nav pareizs, mainiet sistēmas pulksteni un pēc tam atsvaidziniet šo lapu.}zero{Šis serveris nevarēja pierādīt, ka šī ir vietne <ph name="DOMAIN" />. Tās drošības sertifikāta derīguma termiņš beidzās pirms # dienām. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu. Jūsu datora pulkstenī pašlaik ir iestatīts šāds datums: <ph name="CURRENT_DATE" />. Vai tas ir pareizs? Ja datums nav pareizs, mainiet sistēmas pulksteni un pēc tam atsvaidziniet šo lapu.}one{Šis serveris nevarēja pierādīt, ka šī ir vietne <ph name="DOMAIN" />. Tās drošības sertifikāta derīguma termiņš beidzās pirms # dienas. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu. Jūsu datora pulkstenī pašlaik ir iestatīts šāds datums: <ph name="CURRENT_DATE" />. Vai tas ir pareizs? Ja datums nav pareizs, mainiet sistēmas pulksteni un pēc tam atsvaidziniet šo lapu.}other{Šis serveris nevarēja pierādīt, ka šī ir vietne <ph name="DOMAIN" />. Tās drošības sertifikāta derīguma termiņš beidzās pirms # dienām. Šī problēma var rasties nepareizas konfigurācijas dēļ vai tādēļ, ka kāds uzbrucējs ir pārtvēris jūsu savienojumu. Jūsu datora pulkstenī pašlaik ir iestatīts šāds datums: <ph name="CURRENT_DATE" />. Vai tas ir pareizs? Ja datums nav pareizs, mainiet sistēmas pulksteni un pēc tam atsvaidziniet šo lapu.}}</translation>
+<translation id="190166348986967700">Jūsu administrators sāks augšupielādēt failus pakalpojumā <ph name="CLOUD_PROVIDER" /> (<ph name="DATE_TIME" />). Ierīcei ir jāpaliek savienotai līdz brīdim, kad failu augšupielāde būs pabeigta. Augšupielādes laikā varēsiet lasīt tikai lokālos failus.</translation>
 <translation id="1902576642799138955">Derīguma laiks</translation>
 <translation id="1908217026282415406">Kameras izmantošana un kustināšana</translation>
 <translation id="1908690643053136980">Jūsu administrators neļauj šajā vietnē izmantot atļauju “<ph name="PERMISSION" />”.</translation>
@@ -2151,6 +2152,7 @@
 <translation id="473775607612524610">Atjaunināt</translation>
 <translation id="4738601419177586157">Meklēšanas ieteikums vaicājumam “<ph name="TEXT" />”</translation>
 <translation id="4742407542027196863">Pārvaldīt paroles…</translation>
+<translation id="474270528725216349">No vismaz vienas vietnes sinhronizētajās ierīcēs</translation>
 <translation id="4743275772928623722">Sistēma tika atjaunināta, taču dažas lietotnes un failus nevarēja atkopt. Jūsu lietotnes tiks automātiski lejupielādētas vēlreiz.</translation>
 <translation id="4744514002166662487">Izveidot prezentāciju</translation>
 <translation id="4744603770635761495">Izpildāms ceļš</translation>
@@ -2281,6 +2283,7 @@
 <translation id="495170559598752135">Darbības</translation>
 <translation id="4953689047182316270">Atbildēt uz pieejamības notikumiem</translation>
 <translation id="4957080528849277028">Poga “Skatīt Chrome vēsturi”. Aktivizējiet, lai Chrome iestatījumos skatītu un pārvaldītu pārlūkošanas vēsturi.</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{un vēl 1 vietne}zero{un vēl # vietnes}one{un vēl # vietne}other{un vēl # vietnes}}</translation>
 <translation id="4958444002117714549">Izvērst sarakstu</translation>
 <translation id="4960068118612257147">Varat veikt izmaiņas Chrome reklāmu konfidencialitātes iestatījumos.</translation>
 <translation id="4960203958361543136">Meklētājprogrammas izvēle</translation>
@@ -2615,8 +2618,10 @@
 <translation id="553377674408670169">Darba piedāvājumi izglītības nozarē</translation>
 <translation id="5534785731327961487">Izdevīgs piedāvājums</translation>
 <translation id="5536214594743852365">Rādīt sadaļu “<ph name="SECTION" />”</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{un vēl 1 vietne (vairāk sinhronizētajās ierīcēs)}zero{un vēl # vietnes (vairāk sinhronizētajās ierīcēs)}one{un vēl # vietne (vairāk sinhronizētajās ierīcēs)}other{un vēl # vietnes (vairāk sinhronizētajās ierīcēs)}}</translation>
 <translation id="553782666181800029">Aploksne Chou 2</translation>
 <translation id="5538270463355278784">automātisks pilnekrāna režīms</translation>
+<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />, meklēt <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="5539243836947087108">Pamatne</translation>
 <translation id="5540224163453853">Pieprasīto rakstu nevarēja atrast.</translation>
 <translation id="5540969246441091044">Jāšana</translation>
@@ -2775,6 +2780,7 @@
 <translation id="5838278095973806738">Neievadiet šajā vietnē sensitīvu informāciju (piemēram, paroles vai kredītkartes), jo to var nozagt uzbrucēji.</translation>
 <translation id="5838732667866024867">Lai izpētītu cenu izmaiņas diagrammā, varat izmantot kreiso un labo bultiņu</translation>
 <translation id="5840318881868981258">Jūsu Google kontā: <ph name="ACCOUNT" /></translation>
+<translation id="5841007907672481419">No: <ph name="TYPE_1" /></translation>
 <translation id="5841338463993781099">Vai saglabāt kontā?</translation>
 <translation id="5843987376989109187">Šī valoda vēl netiek atbalstīta.
     <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" />.</translation>
@@ -2788,6 +2794,7 @@
 <translation id="5863515189965725638">IBAN rediģēšana</translation>
 <translation id="5863847714970149516">Nākamajā lapā var tikt mēģināts pieprasīt naudu</translation>
 <translation id="5866257070973731571">Tālruņa numura pievienošana</translation>
+<translation id="5866327164731551901">No: <ph name="TYPE_1" />, <ph name="TYPE_2" /></translation>
 <translation id="5866898949289125849">Jūs skatāt izstrādātāja rīku lapu</translation>
 <translation id="5869405914158311789">Šī vietne nav sasniedzama</translation>
 <translation id="5869522115854928033">Saglabātās paroles</translation>
@@ -3497,6 +3504,7 @@
 <translation id="7075452647191940183">Pieprasījums ir pārāk liels</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
+<translation id="7079783554682867524">No <ph name="TYPE_1" /> (vairāk sinhronizētajās ierīcēs)</translation>
 <translation id="7081311540357715807">Pārtikas mazumtirdzniecība</translation>
 <translation id="7083258188081898530">9. paplāte</translation>
 <translation id="7086090958708083563">Augšupielādi pieprasīja lietotājs.</translation>
@@ -4153,6 +4161,7 @@
 <translation id="8216640997712497593">14 x 18 collas</translation>
 <translation id="8218327578424803826">Piešķirtā atrašanās vieta:</translation>
 <translation id="8220602974062798186">Vai bloķēt tēmu <ph name="TOPIC" /> un saistītās tēmas?</translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />, jautāt <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="8228419419708659934">Divu lappušu skats</translation>
 <translation id="8228477714872026922">Vietne <ph name="ORIGIN" /> vēlas piekļūt ierīcei jūsu tīklā:</translation>
 <translation id="822925450938886901">Lai iegūtu papildu informāciju un skatītu piemērojamās politikas, pārlūkprogrammā atveriet vietni chrome://management.</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb
index 37f11da..c6c1f8a 100644
--- a/components/strings/components_strings_ne.xtb
+++ b/components/strings/components_strings_ne.xtb
@@ -528,6 +528,7 @@
 <translation id="1890171020361705182">Dino गेम। एउटा पिक्सेलेट डाइनोसर सिउँडी र टेरोडेक्टायल नामक पंक्षीबाट जोगिएर उजाड भूमितिर भाग्छ। तपाईंले कुनै अडियो सङ्केत सुनेपछि अवरोध पन्छाएर उफ्रिन ट्याप गर्नुहोस्।</translation>
 <translation id="1898423065542865115">फिल्टर गर्दै</translation>
 <translation id="1901443836186977402">{1,plural, =1{यो सर्भरले यो <ph name="DOMAIN" /> हो भन्ने पुष्टि गर्न सकेन; यसको सुरक्षासम्बन्धी प्रमाणपत्रको म्याद अघिल्लो दिन सकिएको थियो। गलत कन्फिगुरेसन वा कुनै आक्रमणकारीले तपाईंको जडानमा अवरोध गरिरहेका कारण यसो भएको हुन सक्छ। तपाईंको कम्प्युटरको घडीलाई हाल <ph name="CURRENT_DATE" /> मा सेट गरिएको छ। त्यो उपयुक्त देखियो? देखिएन भने तपाईंले आफ्नो प्रणालीको घडी मिलाएर यो पृष्ठलाई पुन:ताजा गर्नु पर्छ।}other{यो सर्भरले यो <ph name="DOMAIN" /> हो भनेर प्रमाणित गर्न सकेन; यसको सुरक्षा प्रमाणपत्रको म्याद # दिन अघि सकिएको थियो। गलत कन्फिगुरेसन वा कुनै आक्रमणकारीले तपाईंको जडानमा अवरोध गरिरहेका कारण यसो भएको हुन सक्छ। तपाईंको कम्प्युटरको घडी हाल <ph name="CURRENT_DATE" /> मा सेट गरिएको छ। त्यो उपयुक्त देखियो? देखिएन भने तपाईंले आफ्नो प्रणालीको घडी मिलाएर यो पृष्ठलाई पुन:ताजा गर्नु पर्छ।}}</translation>
+<translation id="190166348986967700">तपाईंका एड्मिन <ph name="DATE_TIME" /> बजे तपाईंका फाइलहरू <ph name="CLOUD_PROVIDER" /> मा अपलोड गर्न थाल्ने छन्। आफ्नो फाइल अपलोड गर्ने प्रक्रिया पूरा नहुन्जेल आफ्नो डिभाइस कनेक्ट गरिराख्नुहोस्। अपलोड गर्ने क्रममा तपाईं डिभाइसमा भएका फाइलहरू मात्र रिड गर्न सक्नु हुने छ।</translation>
 <translation id="1902576642799138955">वैधता अवधि</translation>
 <translation id="1908217026282415406">क्यामेराको प्रयोग र चाल</translation>
 <translation id="1908690643053136980">तपाईंका एड्मिनले यो साइटलाई <ph name="PERMISSION" /> प्रयोग गरिने अनुमति दिएका छैनन्</translation>
@@ -2151,6 +2152,7 @@
 <translation id="473775607612524610">अपडेट गर्नुहोस्</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> को खोजसम्बन्धी सुझाव</translation>
 <translation id="4742407542027196863">पासवर्डहरूको व्यवस्थापन गर्नुहोस्…</translation>
+<translation id="474270528725216349">सिंक गरिएका डिभाइसमा भएको कम्तीमा पनि एउटा साइटको ब्राउजिङ डेटा</translation>
 <translation id="4743275772928623722">सिस्टम अपडेट गरिएको छ तर तपाईंका केही एप र फाइलहरू भने रिकभर गर्न सकिएन। तपाईंका एपहरू फेरि स्वतः डाउनलोड गरिने छन्।</translation>
 <translation id="4744514002166662487">प्रेजेन्टेसन बनाउनुहोस्</translation>
 <translation id="4744603770635761495">कार्यान्वयनयोग्य मार्ग</translation>
@@ -2281,6 +2283,7 @@
 <translation id="495170559598752135">कार्यहरू</translation>
 <translation id="4953689047182316270">पहुँचसम्बन्धी कार्यक्रमहरूमा प्रतिक्रिया दिनुहोस्</translation>
 <translation id="4957080528849277028">Chrome को ब्राउजिङ हिस्ट्री हेर्ने बटन, Chrome का सेटिङमा गई आफ्ना ब्राउजिङ हिस्ट्री हेर्न तथा व्यवस्थापन गर्न यो बटन थिच्नुहोस्</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{थप एउटा साइट}other{थप # वटा साइट}}</translation>
 <translation id="4958444002117714549">सूची विस्तारित गर्नुहोस्</translation>
 <translation id="4960068118612257147">तपाईं विज्ञापनको गोपनीयता कायम राख्ने Chrome का सेटिङ बदल्न सक्नुहुन्छ</translation>
 <translation id="4960203958361543136">आफ्नो सर्च इन्जिन छनौट गर्नुहोस्</translation>
@@ -2615,8 +2618,10 @@
 <translation id="553377674408670169">शिक्षासम्बन्धी रोजगारीहरू</translation>
 <translation id="5534785731327961487">अहिलेका लागि राम्रो अफर</translation>
 <translation id="5536214594743852365">"<ph name="SECTION" />" खण्ड देखाउनुहोस्</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{थप एउटा साइट (सिंक गरिएका डिभाइसमा थप साइटका ब्राउजिङ डेटा छन्)}other{थप # वटा साइट (सिंक गरिएका डिभाइसमा थप साइटका ब्राउजिङ डेटा छन्)}}</translation>
 <translation id="553782666181800029">Envelope Chou 2</translation>
 <translation id="5538270463355278784">स्वतः फुल स्क्रिन हुने मोड</translation>
+<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />, <ph name="KEYWORD_SUFFIX" /> मा खोज्नुहोस्</translation>
 <translation id="5539243836947087108">राफ्ट</translation>
 <translation id="5540224163453853">अनुरोध गरिएको लेख फेला पार्न सकिएन।</translation>
 <translation id="5540969246441091044">घोडचढी</translation>
@@ -2775,6 +2780,7 @@
 <translation id="5838278095973806738">आक्रमणकारीहरूले चोरी गर्न सक्ने हुनाले तपाईँले यस साइटमा कुनै संवेदनशील जानकारी (उदाहरणका लागि पासवर्ड वा क्रेडिट कार्ड) प्रविष्ट गर्नु हुँदैन।</translation>
 <translation id="5838732667866024867">तपाईं मूल्यमा भएका परिवर्तनहरू ग्राफमा हेर्न लेफ्ट/राइट एरो प्रयोग गर्न सक्नुहुन्छ</translation>
 <translation id="5840318881868981258">तपाईंको Google खाता <ph name="ACCOUNT" /> मा</translation>
+<translation id="5841007907672481419"><ph name="TYPE_1" /> को</translation>
 <translation id="5841338463993781099">खातामा सेभ गर्ने हो?</translation>
 <translation id="5843987376989109187">यो भाषा अझै पनि प्रयोग गर्न मिल्दैन।
     <ph name="BEGIN_LINK" />थप जान्नुहोस्<ph name="END_LINK" /></translation>
@@ -2788,6 +2794,7 @@
 <translation id="5863515189965725638">IBAN परिवर्तन गर्नुहोस्</translation>
 <translation id="5863847714970149516">अगाडि आउने पृष्ठले तपाईंलाई पैसा तिराउने प्रयास गर्न सक्छ</translation>
 <translation id="5866257070973731571">फोन नम्बर थप्नुहोस्</translation>
+<translation id="5866327164731551901"><ph name="TYPE_1" /> <ph name="TYPE_2" /> को</translation>
 <translation id="5866898949289125849">तपाईं विकासकर्ताका उपकरणसम्बन्धी पृष्ठ हेर्दै हुनुहुन्छ</translation>
 <translation id="5869405914158311789">यो साइटमा पहुँच गर्न सकिँदैन</translation>
 <translation id="5869522115854928033">बचत गरिएका पासवर्डहरू</translation>
@@ -3497,6 +3504,7 @@
 <translation id="7075452647191940183">अनुरोध गरिएको सामग्री धेरै ठुलो छ</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
+<translation id="7079783554682867524"><ph name="TYPE_1" /> को (सिंक गरिएका डिभाइसमा थप साइटका ब्राउजिङ डेटा छन्)</translation>
 <translation id="7081311540357715807">खाद्य तथा किराना सामग्रीका खुद्रा विक्रेताहरू</translation>
 <translation id="7083258188081898530">ट्रे ९</translation>
 <translation id="7086090958708083563">प्रयोगकर्ताले अनुरोध गरेको अपलोड</translation>
@@ -4152,6 +4160,7 @@
 <translation id="8216640997712497593">१४ x १८ इन्च</translation>
 <translation id="8218327578424803826">तोकिएको स्थान:</translation>
 <translation id="8220602974062798186"><ph name="TOPIC" /> र यससँग सम्बन्धित विषयहरू ब्लक गर्ने हो?</translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />, <ph name="KEYWORD_SUFFIX" /> लाई सोध्नुहोस्</translation>
 <translation id="8228419419708659934">दुई पृष्ठमा देखाइने दृश्य</translation>
 <translation id="8228477714872026922"><ph name="ORIGIN" /> तपाईंको नेटवर्कमा रहेको डिभाइस प्रयोग गर्न चाहन्छ:</translation>
 <translation id="822925450938886901">अतिरिक्त जानकारी तथा लागू हुन सक्ने नीतिहरू हेर्न आफ्नो ब्राउजरमा chrome://management खोल्नुहोस्।</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb
index 41cb386..15275119 100644
--- a/components/strings/components_strings_nl.xtb
+++ b/components/strings/components_strings_nl.xtb
@@ -528,6 +528,7 @@
 <translation id="1890171020361705182">Dino-game. Een gepixeleerde dinosaurus ontwijkt cactussen en pterodactylussen terwijl deze door een verlaten landschap rent. Als je een audiosignaal hoort, tik je om over obstakels te springen.</translation>
 <translation id="1898423065542865115">Filteren</translation>
 <translation id="1901443836186977402">{1,plural, =1{Deze server kan niet bewijzen dat dit <ph name="DOMAIN" /> is. Het bijbehorende beveiligingscertificaat is in de afgelopen 24 uur verlopen. Dit kan worden veroorzaakt door een verkeerde configuratie of een aanvaller die je verbinding onderschept. De klok van je computer is momenteel ingesteld op <ph name="CURRENT_DATE" />. Klopt dat? Zo niet, dan moet je de klok van je systeem aanpassen en daarna deze pagina vernieuwen.}other{Deze server kan niet bewijzen dat dit <ph name="DOMAIN" /> is. Het bijbehorende beveiligingscertificaat is # dagen geleden verlopen. Dit kan worden veroorzaakt door een verkeerde configuratie of een aanvaller die je verbinding onderschept. De klok van je computer is momenteel ingesteld op <ph name="CURRENT_DATE" />. Klopt dat? Zo niet, dan moet je de klok van je systeem aanpassen en daarna deze pagina vernieuwen.}}</translation>
+<translation id="190166348986967700">Je beheerder begint op <ph name="DATE_TIME" /> je bestanden naar <ph name="CLOUD_PROVIDER" /> te uploaden. Houd je apparaat verbonden totdat de bestandsupload is afgerond. Tijdens het uploaden kun je alleen lokale bestanden lezen.</translation>
 <translation id="1902576642799138955">Geldigheidsduur</translation>
 <translation id="1908217026282415406">Cameragebruik en -beweging</translation>
 <translation id="1908690643053136980">Je beheerder staat <ph name="PERMISSION" /> niet toe voor deze site</translation>
@@ -2147,6 +2148,7 @@
 <translation id="473775607612524610">Updaten</translation>
 <translation id="4738601419177586157">Zoeksuggestie: <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Wachtwoorden beheren…</translation>
+<translation id="474270528725216349">Van minstens 1 site op gesynchroniseerde apparaten</translation>
 <translation id="4743275772928623722">Je systeem is geüpdatet, maar we hebben sommige van je apps en bestanden niet kunnen herstellen. Je apps worden automatisch opnieuw gedownload.</translation>
 <translation id="4744514002166662487">Presentatie maken</translation>
 <translation id="4744603770635761495">Uitvoerbaar pad</translation>
@@ -2277,6 +2279,7 @@
 <translation id="495170559598752135">Acties</translation>
 <translation id="4953689047182316270">Reageren op toegankelijkheidsgebeurtenissen</translation>
 <translation id="4957080528849277028">Knop Je Chrome-geschiedenis bekijken. Activeer deze om je browsegeschiedenis te bekijken en te beheren in de Chrome-instellingen.</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{+ 1 site}other{+ # sites}}</translation>
 <translation id="4958444002117714549">Lijst uitvouwen</translation>
 <translation id="4960068118612257147">Je kunt wijzigingen aanbrengen in de Chrome-instellingen voor advertentieprivacy.</translation>
 <translation id="4960203958361543136">Je zoekmachine kiezen</translation>
@@ -2611,8 +2614,10 @@
 <translation id="553377674408670169">Banen in het onderwijs</translation>
 <translation id="5534785731327961487">Nu mooie aanbieding</translation>
 <translation id="5536214594743852365">Gedeelte <ph name="SECTION" /> bekijken</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{+ 1 site (meer op gesynchroniseerde apparaten)}other{+ # sites (meer op gesynchroniseerde apparaten)}}</translation>
 <translation id="553782666181800029">Envelop Chou 2</translation>
 <translation id="5538270463355278784">automatisch volledig scherm</translation>
+<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />, Zoeken op <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="5539243836947087108">Raft</translation>
 <translation id="5540224163453853">Kan het gevraagde artikel niet vinden.</translation>
 <translation id="5540969246441091044">Paardensport</translation>
@@ -2771,6 +2776,7 @@
 <translation id="5838278095973806738">Geef geen gevoelige gegevens op op deze site (zoals wachtwoorden of creditcards), want deze kunnen worden gestolen door cybercriminelen.</translation>
 <translation id="5838732667866024867">Met de pijl-links en pijl-rechts kun je de prijswijzigingen in het diagram checken</translation>
 <translation id="5840318881868981258">In je Google-account, <ph name="ACCOUNT" /></translation>
+<translation id="5841007907672481419">Van <ph name="TYPE_1" /></translation>
 <translation id="5841338463993781099">Opslaan in account?</translation>
 <translation id="5843987376989109187">Deze taal wordt nog niet ondersteund.
     <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation>
@@ -2784,6 +2790,7 @@
 <translation id="5863515189965725638">IBAN bewerken</translation>
 <translation id="5863847714970149516">De komende pagina probeert misschien kosten in rekening te brengen</translation>
 <translation id="5866257070973731571">Telefoonnummer toevoegen</translation>
+<translation id="5866327164731551901">Van <ph name="TYPE_1" /> <ph name="TYPE_2" /></translation>
 <translation id="5866898949289125849">Je bekijkt een Developer Tools-pagina</translation>
 <translation id="5869405914158311789">Deze site is niet bereikbaar</translation>
 <translation id="5869522115854928033">Opgeslagen wachtwoorden</translation>
@@ -3492,6 +3499,7 @@
 <translation id="7075452647191940183">Verzoek is te groot</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
+<translation id="7079783554682867524">Van <ph name="TYPE_1" /> (meer op gesynchroniseerde apparaten)</translation>
 <translation id="7081311540357715807">Supermarkten</translation>
 <translation id="7083258188081898530">Lade 9</translation>
 <translation id="7086090958708083563">Upload aangevraagd door gebruiker</translation>
@@ -4148,6 +4156,7 @@
 <translation id="8216640997712497593">14 x 18 inch</translation>
 <translation id="8218327578424803826">Toegewezen locatie:</translation>
 <translation id="8220602974062798186"><ph name="TOPIC" /> en gerelateerde onderwerpen blokkeren?</translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />, Vragen aan <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="8228419419708659934">Weergave met twee pagina's</translation>
 <translation id="8228477714872026922"><ph name="ORIGIN" /> wil toegang tot een apparaat in je netwerk:</translation>
 <translation id="822925450938886901">Open chrome://management in je browser voor meer informatie en beleid dat van toepassing kan zijn.</translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb
index 609c93c..6dd95ff 100644
--- a/components/strings/components_strings_or.xtb
+++ b/components/strings/components_strings_or.xtb
@@ -528,6 +528,7 @@
 <translation id="1890171020361705182">Dino ଗେମ୍। ଏକ ପିକ୍ସେଲେଟ୍ କରାଯାଇଥିବା ଡାଇନୋସର୍ ନାଗଫେଣୀ ଓ ଉଡ଼ୁଥିବା ପକ୍ଷୀମାନଙ୍କଠାରୁ ନିଜକୁ ବଞ୍ଚାଇ ଏକ ଜନଶୂନ୍ୟ ରାସ୍ତାରେ ଦୌଡ଼ୁଛି। ଆପଣ ଏକ ଅଡିଓ ସଙ୍କେତ ଶୁଣିଲେ, ବାଧାଗୁଡ଼ିକୁ ଅତିକ୍ରମ କରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ।</translation>
 <translation id="1898423065542865115">ଫିଲ୍ଟରିଂ</translation>
 <translation id="1901443836186977402">{1,plural, =1{ଏହି ସର୍ଭର୍ ଏହା ପ୍ରମାଣ କରିପାରିଲା ନାହିଁ ଯେ, ଏହା ଏକ <ph name="DOMAIN" /> ଅଟେ; ଏହାର ସୁରକ୍ଷା ସାର୍ଟିଫିକେଟ୍‍ର ମିଆଦ ଅନ୍ତିମ ଦିନରେ ସମାପ୍ତ ହୋଇଯାଇଛି। ଏହା ହୁଏତ ଏକ ଭୁଲ୍ କନଫିଗ୍‍‍ରେସନ୍ କିମ୍ବା ଜଣେ ଆକ୍ରମଣକାରୀ ଆପଣଙ୍କର ସଂଯୋଗକୁ ପ୍ରତିରୋଧ କରୁଥିବା କାରଣରୁ ହୋଇପାରେ। ଆପଣଙ୍କର କମ୍ପ୍ୟୁଟର୍‌ର ଘଣ୍ଟା ବର୍ତ୍ତମାନ <ph name="CURRENT_DATE" />ରେ ସେଟ୍ କରାଯାଇଛି। ଏହା କ’ଣ ଠିକ୍ ଥିଲା ପରି ଜଣାଯାଉଛି? ଯଦି ନୁହେଁ, ଆପଣ ଆପଣଙ୍କର ସିଷ୍ଟମ୍‌ର ଘଣ୍ଟା ଠିକ୍ କରିବା ଉଚିତ ଏବଂ ଏହାପରେ ଏହି ପୃଷ୍ଠାକୁ ରିଫ୍ରେଶ୍ କରିବା ଉଚିତ।}other{ଏହି ସର୍ଭର୍ ପ୍ରମାଣ କରିପାରିଲା ନାହିଁ ଯେ, ଏହା ଏକ <ph name="DOMAIN" /> ଅଟେ; ଏହାର ସୁରକ୍ଷା ସାର୍ଟିଫିକେଟ୍‌ର ମିଆଦ # ଦିନ ପୂର୍ବେ ସମାପ୍ତ ହୋଇଯାଇଛି। ଏହା ହୁଏତ ଏକ ଭୁଲ୍ କନଫିଗ୍‍‍ରେସନ୍ କିମ୍ବା ଜଣେ ଆକ୍ରମଣକାରୀ ଆପଣଙ୍କର ସଂଯୋଗକୁ ପ୍ରତିରୋଧ କରୁଥିବା କାରଣରୁ ହୋଇପାରେ। ଆପଣଙ୍କର କମ୍ପ୍ୟୁଟର୍‌ର ଘଣ୍ଟା ବର୍ତ୍ତମାନ <ph name="CURRENT_DATE" />ରେ ସେଟ୍ କରାଯାଇଛି। ଏହା କ’ଣ ଠିକ୍ ଥିଲା ପରି ଜଣାଯାଉଛି? ଯଦି ନୁହେଁ, ଆପଣ ଆପଣଙ୍କର ସିଷ୍ଟମ୍‌ର ଘଣ୍ଟା ଠିକ୍ କରିବା ଉଚିତ ଏବଂ ଏହାପରେ ଏହି ପୃଷ୍ଠାକୁ ରିଫ୍ରେଶ୍ କରିବା ଉଚିତ।}}</translation>
+<translation id="190166348986967700">ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟର <ph name="DATE_TIME" />ରେ ଆପଣଙ୍କ ଫାଇଲଗୁଡ଼ିକୁ <ph name="CLOUD_PROVIDER" />ରେ ଅପଲୋଡ କରିବା ଆରମ୍ଭ କରିବେ। ଆପଣଙ୍କ ଫାଇଲର ଅପଲୋଡ ସମ୍ପୂର୍ଣ୍ଣ ନହେବା ପର୍ଯ୍ୟନ୍ତ ଆପଣଙ୍କ ଡିଭାଇସକୁ କନେକ୍ଟ କରି ରଖନ୍ତୁ। ଅପଲୋଡ ପ୍ରକ୍ରିୟା ସମୟରେ, ଆପଣ କେବଳ ସ୍ଥାନୀୟ ଫାଇଲଗୁଡ଼ିକୁ ପଢ଼ିବା ପାଇଁ ସକ୍ଷମ ହେବେ।</translation>
 <translation id="1902576642799138955">ବୈଧତା ସମୟ</translation>
 <translation id="1908217026282415406">କ୍ୟାମେରାର ବ୍ୟବହାର ଓ ଗତିବିଧି</translation>
 <translation id="1908690643053136980">ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟର ଏହି ସାଇଟ ପାଇଁ <ph name="PERMISSION" />କୁ ଅନୁମତି ଦେଇନାହାଁନ୍ତି</translation>
@@ -1921,6 +1922,7 @@
 <translation id="4282346679996504092">ଏହି ପ୍ରଡକ୍ଟ ପାଇଁ ଆଲର୍ଟଗୁଡ଼ିକୁ ବନ୍ଦ କରିଦିଆଯାଇଛି ଏବଂ ବୁକମାର୍କକୁ କାଢ଼ି ଦିଆଯାଇଛି</translation>
 <translation id="4285498937028063278">ଅନ୍‌ପିନ୍ କରନ୍ତୁ</translation>
 <translation id="4287495839370498922">Chromeରେ ଉନ୍ନତ ବିଜ୍ଞାପନ ଗୋପନୀୟତା</translation>
+<translation id="4288101205645068104">ଗାଡ଼ି ଡିଲିଟ କରନ୍ତୁ</translation>
 <translation id="4290920330097335010">କେବେ ବି ଅନୁମତି ଦିଅନ୍ତୁ ନାହିଁ</translation>
 <translation id="4296207570293932800">ନୂଆ ବିଜ୍ଞାପନ ଗୋପନୀୟତା ଫିଚର ବର୍ତ୍ତମାନ ଉପଲବ୍ଧ</translation>
 <translation id="4297502707443874121"><ph name="THUMBNAIL_PAGE" /> ପୃଷ୍ଠା ପାଇଁ ଥମ୍ବନେଲ୍</translation>
@@ -2150,6 +2152,7 @@
 <translation id="473775607612524610">ଅପ୍‍‍ଡେଟ୍</translation>
 <translation id="4738601419177586157"><ph name="TEXT" /> ସର୍ଚ୍ଚ ପ୍ରସ୍ତାବ</translation>
 <translation id="4742407542027196863">ପାସ୍‌ୱର୍ଡଗୁଡ଼ିକୁ ପରିଚାଳିତ କରନ୍ତୁ…</translation>
+<translation id="474270528725216349">ସିଙ୍କ ହୋଇଥିବା ଡିଭାଇସରେ ଅତି କମରେ 1 ସାଇଟରୁ</translation>
 <translation id="4743275772928623722">ଆପଣଙ୍କ ସିଷ୍ଟମକୁ ଅପଡେଟ କରାଯାଇଛି କିନ୍ତୁ ଆପଣଙ୍କର କିଛି ଆପ୍ସ ଏବଂ ଫାଇଲକୁ ରିକଭର କରାଯାଇପାରିଲା ନାହିଁ। ଆପଣଙ୍କର ଆପ୍ସକୁ ସ୍ୱତଃ ପୁଣି ଡାଉନଲୋଡ କରାଯିବ।</translation>
 <translation id="4744514002166662487">ପ୍ରେଜେଣ୍ଟେସନ୍ ତିଆରି କରନ୍ତୁ</translation>
 <translation id="4744603770635761495">ଏକ୍‌ଜିକ୍ୟୁଟେବଲ୍ ପାଥ୍</translation>
@@ -2280,6 +2283,7 @@
 <translation id="495170559598752135">କାର୍ଯ୍ୟ</translation>
 <translation id="4953689047182316270">ଆକ୍ସେସିବିଲିଟୀ ଇଭେଣ୍ଟକୁ ପ୍ରତିକ୍ରିୟା ଦିଏ</translation>
 <translation id="4957080528849277028">'ଆପଣଙ୍କ Chrome ଇତିହାସ ଦେଖନ୍ତୁ' ବଟନ, Chrome ସେଟିଂସରେ ଆପଣଙ୍କ ବ୍ରାଉଜିଂ ଇତିହାସ ଭ୍ୟୁ କରି ପରିଚାଳନା କରିବା ପାଇଁ ଏହାକୁ ସକ୍ରିୟ କରନ୍ତୁ</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{+ 1 ସାଇଟ}other{+ # ସାଇଟ}}</translation>
 <translation id="4958444002117714549">ତାଲିକାକୁ ପ୍ରସାରିତ କରନ୍ତୁ</translation>
 <translation id="4960068118612257147">ଆପଣ Chrome ବିଜ୍ଞାପନ ଗୋପନୀୟତା ସେଟିଂସରେ ପରିବର୍ତ୍ତନ କରିପାରିବେ</translation>
 <translation id="4960203958361543136">ଆପଣଙ୍କର ସର୍ଚ୍ଚ ଇଞ୍ଜିନ ବାଛନ୍ତୁ</translation>
@@ -2614,8 +2618,10 @@
 <translation id="553377674408670169">ଶିକ୍ଷାଭିତ୍ତିକ ଚାକିରି</translation>
 <translation id="5534785731327961487">ବର୍ତ୍ତମାନର ଭଲ ଡିଲ</translation>
 <translation id="5536214594743852365">"<ph name="SECTION" />" ବିଭାଗ ଦେଖାନ୍ତୁ</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{+ 1 ସାଇଟ (ସିଙ୍କ ହୋଇଥିବା ଡିଭାଇସରେ ଅଧିକ)}other{+ # ସାଇଟ (ସିଙ୍କ ହୋଇଥିବା ଡିଭାଇସରେ ଅଧିକ)}}</translation>
 <translation id="553782666181800029">ଏନଭେଲପ ଚାଉ 2</translation>
 <translation id="5538270463355278784">ସ୍ୱତଃ ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ</translation>
+<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />, <ph name="KEYWORD_SUFFIX" /> ସର୍ଚ୍ଚ କରନ୍ତୁ</translation>
 <translation id="5539243836947087108">ରାଫ୍ଟ</translation>
 <translation id="5540224163453853">ଅନୁରୋଧ କରାଯାଇଥିବା ଲେଖାଟି ମିଳିଲା ନାହିଁ।</translation>
 <translation id="5540969246441091044">ଅଶ୍ଵାରୋହଣ</translation>
@@ -2774,6 +2780,7 @@
 <translation id="5838278095973806738">ଏହି ସାଇଟ୍‌ରେ କୌଣସି ସମ୍ବେଦନଶୀଳ ସୂଚନା (ଉଦାହରଣ ସ୍ୱରୂପ, ପାସ୍‌ୱର୍ଡ କିମ୍ବା କ୍ରେଡିଟ୍‌ କାର୍ଡ) ଲେଖିବା ଉଚିତ ନୁହେଁ କାରଣ ଏହା ଆକ୍ରମଣକାରୀମାନଙ୍କ ଦ୍ୱାରା ଚୋରୀ ହୋ‍ଇଯାଇପାରେ।</translation>
 <translation id="5838732667866024867">ଗ୍ରାଫରେ ମୂଲ୍ୟ ପରିବର୍ତ୍ତନର ସମୀକ୍ଷା କରିବା ପାଇଁ ଆପଣ ବାମ/ ଡାହାଣ ତୀର ବ୍ୟବହାର କରିପାରିବେ</translation>
 <translation id="5840318881868981258">ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟରେ, <ph name="ACCOUNT" /></translation>
+<translation id="5841007907672481419"><ph name="TYPE_1" />ରୁ</translation>
 <translation id="5841338463993781099">ଆକାଉଣ୍ଟରେ ସେଭ କରିବେ?</translation>
 <translation id="5843987376989109187">ଏହି ଭାଷା ଏପର୍ଯ୍ୟନ୍ତ ସମର୍ଥିତ ନୁହେଁ।
     <ph name="BEGIN_LINK" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK" /></translation>
@@ -2787,6 +2794,7 @@
 <translation id="5863515189965725638">IBANକୁ ଏଡିଟ କରନ୍ତୁ</translation>
 <translation id="5863847714970149516">ଆଗରେ ଆସୁଥିବା ପୃଷ୍ଠା ଆପଣଙ୍କ ଠାରୁ ଶୁଳ୍କ ନେବା ପାଇଁ ଚେଷ୍ଟା କରିପାରେ</translation>
 <translation id="5866257070973731571">ଫୋନ୍ ନମ୍ବର ଯୋଗ କରନ୍ତୁ</translation>
+<translation id="5866327164731551901"><ph name="TYPE_2" />ରୁ <ph name="TYPE_1" /></translation>
 <translation id="5866898949289125849">ଆପଣ ଏକ ଡେଭେଲପର୍ ଟୁଲ୍ସର ପୃଷ୍ଠା ଦେଖୁଛନ୍ତି</translation>
 <translation id="5869405914158311789">ଏହି ସାଇଟ୍‌ରେ ପହଞ୍ଚି ହେବନାହିଁ</translation>
 <translation id="5869522115854928033">ସଞ୍ଚିତ ପାସୱାର୍ଡସମୂହ</translation>
@@ -3495,6 +3503,7 @@
 <translation id="7075452647191940183">ଅନୁରୋଧଟି ବହୁତ ଲମ୍ବା ଅଟେ</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
+<translation id="7079783554682867524"><ph name="TYPE_1" />ରୁ (ସିଙ୍କ ହୋଇଥିବା ଡିଭାଇସରେ ଅଧିକ)</translation>
 <translation id="7081311540357715807">ଖାଦ୍ୟ ଏବଂ ଗ୍ରୋସରୀ ରିଟେଲରଗୁଡ଼ିକ</translation>
 <translation id="7083258188081898530">ଟ୍ରେ 9</translation>
 <translation id="7086090958708083563">ୟୁଜରଙ୍କ ଦ୍ୱାରା ଅପଲୋଡ ପାଇଁ ଅନୁରୋଧ କରାଯାଇଛି</translation>
@@ -4150,6 +4159,7 @@
 <translation id="8216640997712497593">14 x 18 ଇଞ୍ଚ</translation>
 <translation id="8218327578424803826">ହସ୍ତାନ୍ତରିତ ଲୋକେସନ୍:</translation>
 <translation id="8220602974062798186"><ph name="TOPIC" /> ଏବଂ ଯେ କୌଣସି ସମ୍ବନ୍ଧିତ ବିଷୟକୁ ବ୍ଲକ କରିବେ?</translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />, <ph name="KEYWORD_SUFFIX" />କୁ ପଚାରନ୍ତୁ</translation>
 <translation id="8228419419708659934">ଦୁଇ ପୃଷ୍ଠା ଭ୍ୟୁ</translation>
 <translation id="8228477714872026922"><ph name="ORIGIN" /> ଆପଣଙ୍କ ନେଟୱାର୍କରେ ଏକ ଡିଭାଇସକୁ ଆକ୍ସେସ କରିବାକୁ ଚାହେଁ:</translation>
 <translation id="822925450938886901">ଲାଗୁ ହୋଇପାରୁଥିବା ଅତିରିକ୍ତ ସୂଚନା ଏବଂ ନୀତି ପାଇଁ ଆପଣଙ୍କ ବ୍ରାଉଜରରେ chrome://management ଖୋଲନ୍ତୁ।</translation>
@@ -4193,6 +4203,7 @@
 <translation id="8280630997017109758">ଟ୍ରେ 11</translation>
 <translation id="8281730697546299650">ଅନ୍ୟ ବିଜ୍ଞାପନ ଗୋପନୀୟତା ଫିଚରଗୁଡ଼ିକ ବର୍ତ୍ତମାନ ଉପଲବ୍ଧ ଅଛି</translation>
 <translation id="8281886186245836920">ବାଦ ଦିଅନ୍ତୁ</translation>
+<translation id="8282292167096638950">ଡ୍ରାଇଭିଂ ଲାଇସେନ୍ସ ଡିଲିଟ କରନ୍ତୁ</translation>
 <translation id="8282409409360764263">ୟାର୍ଡ ପରିଚାଳନା</translation>
 <translation id="8282947398454257691">ଆପଣଙ୍କର ଅସାଧାରଣ ଡିଭାଇସ୍‌ ଚିହ୍ନଟକାରୀ</translation>
 <translation id="8284769179630993263">Chrome ସେଟିଂସରେ ଆପଣଙ୍କ ସୁରକ୍ଷିତ ବ୍ରାଉଜିଂ ଏବଂ ଆହୁରି ଅନେକ କିଛି ପରିଚାଳନା କରନ୍ତୁ</translation>
@@ -4220,6 +4231,7 @@
 <translation id="8321476692217554900">ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ</translation>
 <translation id="8322402665880479974">ବେଡ ଏବଂ ହେଡବୋର୍ଡ</translation>
 <translation id="8323505966575306467">ଆପଣଙ୍କ ପାସୱାର୍ଡରେ ଅଧିକ ସୁରକ୍ଷା ଯୋଗ କରନ୍ତୁ</translation>
+<translation id="832547548543012337">ପାସପୋର୍ଟ ଡିଲିଟ କରନ୍ତୁ</translation>
 <translation id="832567874344484841">ଜଳଖିଆ ପାଇଁ ଖାଦ୍ୟ</translation>
 <translation id="8329068931308448247">ଏନଭେଲପ #14</translation>
 <translation id="8332188693563227489"><ph name="HOST_NAME" />କୁ ଆକ୍ସେସ୍‌ ପ୍ରତ୍ୟାଖ୍ୟାନ କରାଯାଇଥିଲା</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb
index 021a154..2cecd12 100644
--- a/components/strings/components_strings_ro.xtb
+++ b/components/strings/components_strings_ro.xtb
@@ -528,6 +528,7 @@
 <translation id="1890171020361705182">Joc cu dinozauri. Un dinozaur pixelat se ferește de cactuși și pterodactili într-un peisaj dezolant. Când auzi semnalul sonor, atinge pentru a sări peste obstacole.</translation>
 <translation id="1898423065542865115">Filtrarea</translation>
 <translation id="1901443836186977402">{1,plural, =1{Acest server nu a putut dovedi că este <ph name="DOMAIN" />; certificatul său de securitate a expirat în ultima zi. Cauza poate fi o eroare de configurare sau interceptarea conexiunii de către un atacator. În prezent, ora computerului este setată la <ph name="CURRENT_DATE" />. Este corect? Dacă nu este, corectează ora sistemului și actualizează pagina.}few{Acest server nu a putut dovedi că este <ph name="DOMAIN" />; certificatul său de securitate a expirat acum # zile. Cauza poate fi o configurare greșită sau interceptarea conexiunii de către un atacator. În prezent, ora computerului este setată la <ph name="CURRENT_DATE" />. Este corect? Dacă nu este, corectează ora sistemului și actualizează pagina.}other{Acest server nu a putut dovedi că este <ph name="DOMAIN" />; certificatul său de securitate a expirat acum # de zile. Cauza poate fi o configurare greșită sau interceptarea conexiunii de către un atacator. În prezent, ora computerului este setată la <ph name="CURRENT_DATE" />. Este corect? Dacă nu este, corectează ora sistemului și actualizează pagina.}}</translation>
+<translation id="190166348986967700">Administratorul va începe să-ți încarce fișierele în <ph name="CLOUD_PROVIDER" /> la <ph name="DATE_TIME" />. Păstrează dispozitivul conectat până la finalizarea încărcării fișierului. În timpul încărcării, vei putea doar să citești fișierele locale.</translation>
 <translation id="1902576642799138955">Perioadă de validitate</translation>
 <translation id="1908217026282415406">Folosirea și mișcarea camerei</translation>
 <translation id="1908690643053136980">Administratorul nu permite <ph name="PERMISSION" /> pentru acest site</translation>
@@ -1924,6 +1925,7 @@
 <translation id="4282346679996504092">Alertele pentru acest produs au fost dezactivate și marcajul a fost eliminat</translation>
 <translation id="4285498937028063278">Anulați fixarea</translation>
 <translation id="4287495839370498922">Confidențialitate îmbunătățită a anunțurilor în Chrome</translation>
+<translation id="4288101205645068104">Șterge vehiculul</translation>
 <translation id="4290920330097335010">Nu permite niciodată</translation>
 <translation id="4296207570293932800">Este disponibilă o nouă funcție pentru confidențialitatea anunțurilor</translation>
 <translation id="4297502707443874121">Miniatură pentru pagina <ph name="THUMBNAIL_PAGE" /></translation>
@@ -2153,6 +2155,7 @@
 <translation id="473775607612524610">Actualizează</translation>
 <translation id="4738601419177586157">Sugestie de căutare <ph name="TEXT" /></translation>
 <translation id="4742407542027196863">Gestionează parolele…</translation>
+<translation id="474270528725216349">De la cel puțin un site de pe dispozitivele sincronizate</translation>
 <translation id="4743275772928623722">Sistemul a fost actualizat, dar unele dintre aplicații și fișiere nu au putut fi recuperate. Aplicațiile vor fi descărcate din nou automat.</translation>
 <translation id="4744514002166662487">Creează o prezentare</translation>
 <translation id="4744603770635761495">Cale executabilă</translation>
@@ -2283,6 +2286,7 @@
 <translation id="495170559598752135">Acțiuni</translation>
 <translation id="4953689047182316270">să răspundă evenimentelor de accesibilitate</translation>
 <translation id="4957080528849277028">Vezi butonul pentru istoricul Chrome, Enter pentru a vedea și a gestiona istoricul de navigare în setările Chrome</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{+ 1 site}few{+ # site-uri}other{+ # de site-uri}}</translation>
 <translation id="4958444002117714549">Extindeți lista</translation>
 <translation id="4960068118612257147">Poți face modificări în setările de confidențialitate a anunțurilor din Chrome</translation>
 <translation id="4960203958361543136">Alege motorul de căutare</translation>
@@ -2617,8 +2621,10 @@
 <translation id="553377674408670169">Locuri de muncă în educație</translation>
 <translation id="5534785731327961487">Ofertă bună acum</translation>
 <translation id="5536214594743852365">Afișează secțiunea „<ph name="SECTION" />”</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{+ Un site (mai multe pe dispozitivele sincronizate)}few{+ # site-uri (mai multe pe dispozitivele sincronizate)}other{+ # de site-uri (mai multe pe dispozitivele sincronizate)}}</translation>
 <translation id="553782666181800029">Plic Chou 2</translation>
 <translation id="5538270463355278784">ecran complet automat</translation>
+<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />, caută <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="5539243836947087108">Fundație</translation>
 <translation id="5540224163453853">Articolul solicitat nu poate fi găsit.</translation>
 <translation id="5540969246441091044">Echitație</translation>
@@ -2777,6 +2783,7 @@
 <translation id="5838278095973806738">Nu ar trebui să introduci informații sensibile pe acest site (de exemplu, parole sau carduri de credit), deoarece ar putea fi furate de atacatori.</translation>
 <translation id="5838732667866024867">Poți folosi săgeata spre stânga / dreapta pentru a examina modificările de preț din grafic</translation>
 <translation id="5840318881868981258">În Contul Google <ph name="ACCOUNT" /></translation>
+<translation id="5841007907672481419">De la <ph name="TYPE_1" /></translation>
 <translation id="5841338463993781099">Salvezi în cont?</translation>
 <translation id="5843987376989109187">Această limbă nu este încă acceptată.
     <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation>
@@ -2790,6 +2797,7 @@
 <translation id="5863515189965725638">Editează codul IBAN</translation>
 <translation id="5863847714970149516">Următoarea pagină poate să genereze costuri</translation>
 <translation id="5866257070973731571">Adaugă un număr de telefon</translation>
+<translation id="5866327164731551901">De la <ph name="TYPE_1" /> <ph name="TYPE_2" /></translation>
 <translation id="5866898949289125849">Se afișează o pagină cu instrumente pentru dezvoltatori</translation>
 <translation id="5869405914158311789">Acest site nu poate fi accesat</translation>
 <translation id="5869522115854928033">Parole salvate</translation>
@@ -3499,6 +3507,7 @@
 <translation id="7075452647191940183">Solicitarea este prea mare</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
+<translation id="7079783554682867524">De la <ph name="TYPE_1" /> (mai multe pe dispozitivele sincronizate)</translation>
 <translation id="7081311540357715807">Comercianți de alimente și produse de băcănie</translation>
 <translation id="7083258188081898530">Tava 9</translation>
 <translation id="7086090958708083563">Utilizatorul a solicitat încărcarea</translation>
@@ -4155,6 +4164,7 @@
 <translation id="8216640997712497593">14 x 18 in</translation>
 <translation id="8218327578424803826">Locație atribuită:</translation>
 <translation id="8220602974062798186">Blochezi <ph name="TOPIC" /> și orice subiecte conexe?</translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />, întreabă <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="8228419419708659934">Afișare cu două pagini</translation>
 <translation id="8228477714872026922"><ph name="ORIGIN" /> dorește să acceseze un dispozitiv din rețea:</translation>
 <translation id="822925450938886901">Pentru informații suplimentare și politicile care se pot aplica, deschide chrome://management în browser.</translation>
@@ -4198,6 +4208,7 @@
 <translation id="8280630997017109758">Tava 11</translation>
 <translation id="8281730697546299650">Sunt disponibile acum și alte funcții pentru confidențialitatea anunțurilor</translation>
 <translation id="8281886186245836920">Omite</translation>
+<translation id="8282292167096638950">Șterge permisul de conducere</translation>
 <translation id="8282409409360764263">Întreținerea grădinilor</translation>
 <translation id="8282947398454257691">Află identificatorul unic de dispozitiv</translation>
 <translation id="8284769179630993263">Gestionează Navigarea sigură și alte opțiuni din setările Chrome</translation>
@@ -4225,6 +4236,7 @@
 <translation id="8321476692217554900">Notificări</translation>
 <translation id="8322402665880479974">Paturi și tăblii</translation>
 <translation id="8323505966575306467">Adaugă mai multă protecție parolelor</translation>
+<translation id="832547548543012337">Șterge pașaportul</translation>
 <translation id="832567874344484841">Preparate pentru micul dejun</translation>
 <translation id="8329068931308448247">Plic 14</translation>
 <translation id="8332188693563227489">Accesul la <ph name="HOST_NAME" /> nu este permis</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb
index 0b86ad03..b5ff4d4 100644
--- a/components/strings/components_strings_ru.xtb
+++ b/components/strings/components_strings_ru.xtb
@@ -528,6 +528,7 @@
 <translation id="1890171020361705182">Игра Dino. Пиксельный динозаврик бежит по пустыне, уворачиваясь от кактусов и птеродактилей. Услышав звуковую подсказку, нажмите на экран, чтобы перепрыгнуть препятствие.</translation>
 <translation id="1898423065542865115">Фильтры</translation>
 <translation id="1901443836186977402">{1,plural, =1{Сервер не может подтвердить связь с доменом <ph name="DOMAIN" />. Срок действия его сертификата безопасности истек вчера. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные. Обратите внимание, что часы на вашем компьютере установлены на <ph name="CURRENT_DATE" />. Это правильное время? Если нет, измените его и обновите страницу.}one{Сервер не может подтвердить связь с доменом <ph name="DOMAIN" />. Срок действия его сертификата безопасности истек # день назад. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные. Обратите внимание, что часы на вашем компьютере установлены на <ph name="CURRENT_DATE" />. Это правильное время? Если нет, измените его и обновите страницу.}few{Сервер не может подтвердить связь с доменом <ph name="DOMAIN" />. Срок действия его сертификата безопасности истек # дня назад. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные. Обратите внимание, что часы на вашем компьютере установлены на <ph name="CURRENT_DATE" />. Это правильное время? Если нет, измените его и обновите страницу.}many{Сервер не может подтвердить связь с доменом <ph name="DOMAIN" />. Срок действия его сертификата безопасности истек # дней назад. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные. Обратите внимание, что часы на вашем компьютере установлены на <ph name="CURRENT_DATE" />. Это правильное время? Если нет, измените его и обновите страницу.}other{Сервер не может подтвердить связь с доменом <ph name="DOMAIN" />. Срок действия его сертификата безопасности истек # дня назад. Возможно, сервер настроен неправильно или кто-то пытается перехватить ваши данные. Обратите внимание, что часы на вашем компьютере установлены на <ph name="CURRENT_DATE" />. Это правильное время? Если нет, измените его и обновите страницу.}}</translation>
+<translation id="190166348986967700">Администратор начнет загрузку ваших файлов в сервис "<ph name="CLOUD_PROVIDER" />" <ph name="DATE_TIME" />. Пока она не завершится, не отключайте устройство от сети. Во время загрузки вы сможете только читать локальные файлы.</translation>
 <translation id="1902576642799138955">Срок действия</translation>
 <translation id="1908217026282415406">Использование и перемещение камеры</translation>
 <translation id="1908690643053136980">Ваш администратор не предоставил этому сайту разрешение "<ph name="PERMISSION" />".</translation>
@@ -1923,6 +1924,7 @@
 <translation id="4282346679996504092">Оповещения об этом товаре отключены, а закладка удалена.</translation>
 <translation id="4285498937028063278">Открепить</translation>
 <translation id="4287495839370498922">Улучшенная конфиденциальность в рекламе для Chrome</translation>
+<translation id="4288101205645068104">Удаление автомобиля</translation>
 <translation id="4290920330097335010">Запретить</translation>
 <translation id="4296207570293932800">Доступны новые функции конфиденциальности в рекламе</translation>
 <translation id="4297502707443874121">Уменьшенное изображение страницы <ph name="THUMBNAIL_PAGE" /></translation>
@@ -2152,6 +2154,7 @@
 <translation id="473775607612524610">Обновить</translation>
 <translation id="4738601419177586157">Подсказка при поиске "<ph name="TEXT" />"</translation>
 <translation id="4742407542027196863">Управление паролями</translation>
+<translation id="474270528725216349">Источник: минимум 1 сайт на синхронизированных устройствах</translation>
 <translation id="4743275772928623722">Система обновлена, но некоторые приложения и файлы не удалось восстановить. Приложения будут заново скачаны автоматически.</translation>
 <translation id="4744514002166662487">Создать презентацию</translation>
 <translation id="4744603770635761495">Путь к исполняемому файлу</translation>
@@ -2282,6 +2285,7 @@
 <translation id="495170559598752135">Действия</translation>
 <translation id="4953689047182316270">Использование специальных возможностей</translation>
 <translation id="4957080528849277028">Кнопка "Посмотреть историю Chrome". Нажмите ее, чтобы перейти к управлению историей браузера в настройках Chrome.</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{и ещё 1 сайт}one{и ещё # сайт}few{и ещё # сайта}many{и ещё # сайтов}other{и ещё # сайта}}</translation>
 <translation id="4958444002117714549">Развернуть список</translation>
 <translation id="4960068118612257147">Вы можете изменить свой выбор в разделе "Конфиденциальность в рекламе" настроек Chrome.</translation>
 <translation id="4960203958361543136">Выберите поисковую систему по умолчанию</translation>
@@ -2616,8 +2620,10 @@
 <translation id="553377674408670169">Вакансии в сфере образования</translation>
 <translation id="5534785731327961487">Выгодно</translation>
 <translation id="5536214594743852365">Показать раздел "<ph name="SECTION" />"</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{и ещё 1 сайт, а также данные на синхронизированных устройствах}one{и ещё # сайт, а также данные на синхронизированных устройствах}few{и ещё # сайта, а также данные на синхронизированных устройствах}many{и ещё # сайтов, а также данные на синхронизированных устройствах}other{и ещё # сайта, а также данные на синхронизированных устройствах}}</translation>
 <translation id="553782666181800029">Конверт Chou 2</translation>
 <translation id="5538270463355278784">автопереход в полноэкранный режим</translation>
+<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />, поиск (<ph name="KEYWORD_SUFFIX" />)</translation>
 <translation id="5539243836947087108">Плот</translation>
 <translation id="5540224163453853">Не удалось найти указанную статью</translation>
 <translation id="5540969246441091044">Конный спорт</translation>
@@ -2776,6 +2782,7 @@
 <translation id="5838278095973806738">Не сообщайте этому сайту конфиденциальную информацию (например, пароли и номера банковских карт). К ней могут получить доступ злоумышленники.</translation>
 <translation id="5838732667866024867">Используйте стрелки вправо или влево, чтобы посмотреть на диаграмме, как менялась цена</translation>
 <translation id="5840318881868981258">В аккаунте Google <ph name="ACCOUNT" />.</translation>
+<translation id="5841007907672481419">Источник: <ph name="TYPE_1" /></translation>
 <translation id="5841338463993781099">Сохранить в аккаунте?</translation>
 <translation id="5843987376989109187">Этот язык пока не поддерживается.
     <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
@@ -2789,6 +2796,7 @@
 <translation id="5863515189965725638">Изменение кода IBAN</translation>
 <translation id="5863847714970149516">При открытии этой страницы с вашего счета могут быть списаны средства</translation>
 <translation id="5866257070973731571">Добавьте номер телефона</translation>
+<translation id="5866327164731551901">Источники: <ph name="TYPE_1" /> <ph name="TYPE_2" /></translation>
 <translation id="5866898949289125849">Вы просматриваете страницу инструментов разработчика</translation>
 <translation id="5869405914158311789">Не удается получить доступ к сайту</translation>
 <translation id="5869522115854928033">Сохраненные пароли</translation>
@@ -3498,6 +3506,7 @@
 <translation id="7075452647191940183">Запрос слишком велик.</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
+<translation id="7079783554682867524">Источник: <ph name="TYPE_1" /> и данные на синхронизированных устройствах</translation>
 <translation id="7081311540357715807">Продуктовые магазины</translation>
 <translation id="7083258188081898530">Лоток 9</translation>
 <translation id="7086090958708083563">Загрузка запрошена пользователем</translation>
@@ -4154,6 +4163,7 @@
 <translation id="8216640997712497593">14 x 18 дюймов</translation>
 <translation id="8218327578424803826">Назначенное местоположение:</translation>
 <translation id="8220602974062798186">Заблокировать категорию "<ph name="TOPIC" />" и связанные с ней темы?</translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />, задать вопрос (<ph name="KEYWORD_SUFFIX" />)</translation>
 <translation id="8228419419708659934">Двухстраничный режим</translation>
 <translation id="8228477714872026922">Сайт <ph name="ORIGIN" /> запрашивает доступ к устройству в вашей сети:</translation>
 <translation id="822925450938886901">Правила и дополнительную информацию можно найти на странице chrome://management в браузере.</translation>
@@ -4197,6 +4207,7 @@
 <translation id="8280630997017109758">Лоток 11</translation>
 <translation id="8281730697546299650">Доступны другие функции конфиденциальности в рекламе</translation>
 <translation id="8281886186245836920">Пропустить</translation>
+<translation id="8282292167096638950">Удаление водительского удостоверения</translation>
 <translation id="8282409409360764263">Уход за придомовой территорией</translation>
 <translation id="8282947398454257691">доступ к уникальному идентификатору устройства</translation>
 <translation id="8284769179630993263">Задать параметры Безопасного просмотра и других функций в настройках Chrome</translation>
@@ -4224,6 +4235,7 @@
 <translation id="8321476692217554900">уведомления</translation>
 <translation id="8322402665880479974">Кровати и изголовья</translation>
 <translation id="8323505966575306467">Усильте защиту паролей</translation>
+<translation id="832547548543012337">Удаление паспорта</translation>
 <translation id="832567874344484841">Продукты для завтрака</translation>
 <translation id="8329068931308448247">Конверт 14</translation>
 <translation id="8332188693563227489">Доступ к <ph name="HOST_NAME" /> запрещен</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb
index 8c237ea5..f95073a 100644
--- a/components/strings/components_strings_sl.xtb
+++ b/components/strings/components_strings_sl.xtb
@@ -1924,6 +1924,7 @@
 <translation id="4282346679996504092">Opozorila za ta izdelek so bila izklopljena in zaznamek je bil odstranjen.</translation>
 <translation id="4285498937028063278">Odpni</translation>
 <translation id="4287495839370498922">Izboljšana zasebnost pri oglaševanju v Chromu</translation>
+<translation id="4288101205645068104">Brisanje vozila</translation>
 <translation id="4290920330097335010">Nikoli ne dovoli</translation>
 <translation id="4296207570293932800">Nova funkcija za zasebnost pri oglaševanju je zdaj na voljo</translation>
 <translation id="4297502707443874121">Sličica za stran <ph name="THUMBNAIL_PAGE" /></translation>
@@ -4198,6 +4199,7 @@
 <translation id="8280630997017109758">Pladenj 11</translation>
 <translation id="8281730697546299650">Zdaj so na voljo druge funkcije za zasebnost pri oglaševanju</translation>
 <translation id="8281886186245836920">Preskoči</translation>
+<translation id="8282292167096638950">Brisanje vozniškega dovoljenja</translation>
 <translation id="8282409409360764263">Vzdrževanje dvorišč</translation>
 <translation id="8282947398454257691">podatke o edinstvenem identifikatorju naprave</translation>
 <translation id="8284769179630993263">Upravljajte Varno brskanje in drugo v Chromovih nastavitvah.</translation>
@@ -4225,6 +4227,7 @@
 <translation id="8321476692217554900">obvestila</translation>
 <translation id="8322402665880479974">Posteljni okvirji</translation>
 <translation id="8323505966575306467">Dodajte več zaščite za gesla</translation>
+<translation id="832547548543012337">Brisanje potnega lista</translation>
 <translation id="832567874344484841">Živila za zajtrk</translation>
 <translation id="8329068931308448247">Kuverta št. 14</translation>
 <translation id="8332188693563227489">Dostop do spletnega mesta <ph name="HOST_NAME" /> je bil zavrnjen</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb
index 5a5da5a..3ed863a 100644
--- a/components/strings/components_strings_sv.xtb
+++ b/components/strings/components_strings_sv.xtb
@@ -1290,7 +1290,7 @@
 <translation id="3248329428895535435">Visa inte på den här sidan</translation>
 <translation id="3249102948665905108">Filuppladdningen till <ph name="CLOUD_PROVIDER" /> har slutförts med fel</translation>
 <translation id="3252772880526154546">Arkitektur</translation>
-<translation id="3253225298092156258">Inte tillgängligt</translation>
+<translation id="3253225298092156258">Inte tillgänglig</translation>
 <translation id="3254301855501243548">18 x 22 tum</translation>
 <translation id="3255926992597692024">Chromium försöker ändra inställningarna för att fylla i betalningsmetoder.</translation>
 <translation id="3259648571731540213"><ph name="CREATE_GOOGLE_CALENDAR_EVENT_FOCUSED_FRIENDLY_MATCH_TEXT" />: tryck på Tabb och sedan på Retur om du snabbt vill skapa en ny händelse i Google Kalender</translation>
@@ -1924,6 +1924,7 @@
 <translation id="4282346679996504092">Aviseringar för den här produkten har inaktiverats och bokmärket har tagits bort</translation>
 <translation id="4285498937028063278">Lossa</translation>
 <translation id="4287495839370498922">Förbättrad annonsintegritet i Chrome</translation>
+<translation id="4288101205645068104">Radera fordon</translation>
 <translation id="4290920330097335010">Tillåt aldrig</translation>
 <translation id="4296207570293932800">Nu finns en ny funktion för annonsintegritet</translation>
 <translation id="4297502707443874121">Miniatyr för sidan <ph name="THUMBNAIL_PAGE" /></translation>
@@ -4198,6 +4199,7 @@
 <translation id="8280630997017109758">Fack 11</translation>
 <translation id="8281730697546299650">Andra funktioner för annonsintegritet är nu tillgängliga</translation>
 <translation id="8281886186245836920">Hoppa över</translation>
+<translation id="8282292167096638950">Radera körkort</translation>
 <translation id="8282409409360764263">Trädgårdsunderhåll</translation>
 <translation id="8282947398454257691">Veta din unika enhetsidentifierare</translation>
 <translation id="8284769179630993263">Hantera Säker webbsökning med mera i inställningarna för Chrome</translation>
@@ -4225,6 +4227,7 @@
 <translation id="8321476692217554900">aviseringar</translation>
 <translation id="8322402665880479974">Sängar och huvudgavlar</translation>
 <translation id="8323505966575306467">Lägg till mer skydd för dina lösenord</translation>
+<translation id="832547548543012337">Radera pass</translation>
 <translation id="832567874344484841">Frukost</translation>
 <translation id="8329068931308448247">Kuvert nr 14</translation>
 <translation id="8332188693563227489">Åtkomst nekades till <ph name="HOST_NAME" />.</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb
index 702e11c..faf71aa 100644
--- a/components/strings/components_strings_th.xtb
+++ b/components/strings/components_strings_th.xtb
@@ -1924,6 +1924,7 @@
 <translation id="4282346679996504092">ปิดการแจ้งเตือนสำหรับผลิตภัณฑ์นี้และนำบุ๊กมาร์กออกแล้ว</translation>
 <translation id="4285498937028063278">เลิกปักหมุด</translation>
 <translation id="4287495839370498922">ความเป็นส่วนตัวเกี่ยวกับโฆษณาบน Chrome ที่เพิ่มมากขึ้น</translation>
+<translation id="4288101205645068104">ลบยานพาหนะ</translation>
 <translation id="4290920330097335010">ไม่อนุญาต</translation>
 <translation id="4296207570293932800">ฟีเจอร์ใหม่ด้านความเป็นส่วนตัวเกี่ยวกับโฆษณาพร้อมใช้งานแล้ว</translation>
 <translation id="4297502707443874121">ภาพขนาดย่อของหน้า <ph name="THUMBNAIL_PAGE" /></translation>
@@ -4206,6 +4207,7 @@
 <translation id="8280630997017109758">ถาด 11</translation>
 <translation id="8281730697546299650">ฟีเจอร์อื่นๆ ด้านความเป็นส่วนตัวเกี่ยวกับโฆษณาพร้อมใช้งานแล้ว</translation>
 <translation id="8281886186245836920">ข้าม</translation>
+<translation id="8282292167096638950">ลบใบขับขี่</translation>
 <translation id="8282409409360764263">การบำรุงรักษาสนาม</translation>
 <translation id="8282947398454257691">ทราบตัวระบุอุปกรณ์ที่ไม่ซ้ำกัน</translation>
 <translation id="8284769179630993263">จัดการ Google Safe Browsing และอื่นๆ ในการตั้งค่า Chrome</translation>
@@ -4233,6 +4235,7 @@
 <translation id="8321476692217554900">การแจ้งเตือน</translation>
 <translation id="8322402665880479974">เตียงและหัวเตียง</translation>
 <translation id="8323505966575306467">เพิ่มการปกป้องให้รหัสผ่านของคุณ</translation>
+<translation id="832547548543012337">ลบหนังสือเดินทาง</translation>
 <translation id="832567874344484841">อาหารเช้า</translation>
 <translation id="8329068931308448247">Envelope #14</translation>
 <translation id="8332188693563227489">การเข้าถึง <ph name="HOST_NAME" /> ถูกปฏิเสธ</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb
index da9adc9..17ad35c 100644
--- a/components/strings/components_strings_zh-CN.xtb
+++ b/components/strings/components_strings_zh-CN.xtb
@@ -1920,6 +1920,7 @@
 <translation id="4282346679996504092">针对此商品的提醒已被关闭,相应书签已被移除</translation>
 <translation id="4285498937028063278">取消固定</translation>
 <translation id="4287495839370498922">在 Chrome 中加强广告隐私设置</translation>
+<translation id="4288101205645068104">删除车辆</translation>
 <translation id="4290920330097335010">一律不允许</translation>
 <translation id="4296207570293932800">全新广告隐私权功能现已推出</translation>
 <translation id="4297502707443874121">第 <ph name="THUMBNAIL_PAGE" /> 页的缩略图</translation>
@@ -4193,6 +4194,7 @@
 <translation id="8280630997017109758">纸匣 11</translation>
 <translation id="8281730697546299650">现已推出的其他广告隐私权功能</translation>
 <translation id="8281886186245836920">跳过</translation>
+<translation id="8282292167096638950">删除驾照</translation>
 <translation id="8282409409360764263">庭院维护</translation>
 <translation id="8282947398454257691">获取您的唯一设备标识符</translation>
 <translation id="8284769179630993263">在 Chrome 设置中管理您的安全浏览设置及其他设置</translation>
@@ -4220,6 +4222,7 @@
 <translation id="8321476692217554900">通知</translation>
 <translation id="8322402665880479974">床和床头板</translation>
 <translation id="8323505966575306467">对您的密码增强保护</translation>
+<translation id="832547548543012337">删除护照</translation>
 <translation id="832567874344484841">早餐食品</translation>
 <translation id="8329068931308448247">#14 信封</translation>
 <translation id="8332188693563227489">访问 <ph name="HOST_NAME" /> 的请求遭到拒绝</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb
index 01cbf73..e555403e3 100644
--- a/components/strings/components_strings_zh-HK.xtb
+++ b/components/strings/components_strings_zh-HK.xtb
@@ -528,6 +528,7 @@
 <translation id="1890171020361705182">喺呢款恐龍遊戲入面,你要協助喺荒野入面奔馳嘅像素化恐龍避開仙人掌同翼手龍。聽到提示音效嘅時候,㩒一下就可以跳過障礙物。</translation>
 <translation id="1898423065542865115">篩選</translation>
 <translation id="1901443836186977402">{1,plural, =1{伺服器無法證明其屬於 <ph name="DOMAIN" /> 網域;其安全性憑證已在昨天到期。這可能是由於設定錯誤,或有攻擊者攔截您的連線。您的電腦時鐘目前設定為 <ph name="CURRENT_DATE" />,請問是否正確?如果設定錯誤,請將系統時鐘調校至正確時間,然後重新整理此網頁。}other{伺服器無法證明屬於 <ph name="DOMAIN" /> 網域;其安全性憑證已在 # 天前到期。這可能是由於設定錯誤,或有攻擊者攔截您的連線。您的電腦時鐘目前設定為 <ph name="CURRENT_DATE" />,請問是否正確?如果設定錯誤,請將系統時鐘調校至正確時間,然後重新整理此網頁。}}</translation>
+<translation id="190166348986967700">管理員將於<ph name="DATE_TIME" />開始上載檔案至 <ph name="CLOUD_PROVIDER" />。請保持裝置連線,直至檔案上載完成。上載期間,你只能讀取本機檔案。</translation>
 <translation id="1902576642799138955">有效期間</translation>
 <translation id="1908217026282415406">使用和移動相機</translation>
 <translation id="1908690643053136980">管理員不允許此網站使用<ph name="PERMISSION" />權限</translation>
@@ -1923,6 +1924,7 @@
 <translation id="4282346679996504092">此產品的通知已關閉,網頁亦已從書籤中移除</translation>
 <translation id="4285498937028063278">取消固定</translation>
 <translation id="4287495839370498922">強化 Chrome 上的廣告私隱權</translation>
+<translation id="4288101205645068104">刪除車輛</translation>
 <translation id="4290920330097335010">永不允許</translation>
 <translation id="4296207570293932800">新廣告私隱功能現已推出</translation>
 <translation id="4297502707443874121">第 <ph name="THUMBNAIL_PAGE" /> 頁嘅縮圖</translation>
@@ -2152,6 +2154,7 @@
 <translation id="473775607612524610">更新</translation>
 <translation id="4738601419177586157">「<ph name="TEXT" />」搜尋建議</translation>
 <translation id="4742407542027196863">管理密碼…</translation>
+<translation id="474270528725216349">來自已同步裝置上的至少 1 個網站</translation>
 <translation id="4743275772928623722">系統已完成更新,但部分應用程式和檔案無法復原。系統會自動再次下載應用程式。</translation>
 <translation id="4744514002166662487">建立簡報</translation>
 <translation id="4744603770635761495">可執行檔的路徑</translation>
@@ -2282,6 +2285,7 @@
 <translation id="495170559598752135">動作</translation>
 <translation id="4953689047182316270">回應無障礙功能事件</translation>
 <translation id="4957080528849277028">睇 Chrome 記錄按鈕,啟用之後就可以喺 Chrome 設定度睇同管理瀏覽記錄</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{和另外 1 個網站}other{和另外 # 個網站}}</translation>
 <translation id="4958444002117714549">展開清單</translation>
 <translation id="4960068118612257147">你可前往 Chrome 廣告私隱設定作出變更</translation>
 <translation id="4960203958361543136">選擇搜尋引擎</translation>
@@ -2616,8 +2620,10 @@
 <translation id="553377674408670169">教育職位</translation>
 <translation id="5534785731327961487">目前為優惠價格</translation>
 <translation id="5536214594743852365">顯示「<ph name="SECTION" />」部分</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{和另外 1 個網站 (已同步的裝置上還有其他網站)}other{和另外 # 個網站 (已同步的裝置上還有其他網站)}}</translation>
 <translation id="553782666181800029">Chou 2 信封</translation>
 <translation id="5538270463355278784">自動進入全螢幕模式</translation>
+<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />,搵「<ph name="KEYWORD_SUFFIX" />」</translation>
 <translation id="5539243836947087108">卡板</translation>
 <translation id="5540224163453853">找不到要求的文章。</translation>
 <translation id="5540969246441091044">馬術</translation>
@@ -2776,6 +2782,7 @@
 <translation id="5838278095973806738">您不應在此網站上輸入任何敏感資料 (例如密碼或信用卡資料),因為攻擊者可能會竊取這些資料。</translation>
 <translation id="5838732667866024867">你可以用向左/向右箭咀睇到圖表嘅價格變化</translation>
 <translation id="5840318881868981258">更新 Google 帳戶 (<ph name="ACCOUNT" />) 中的密碼</translation>
+<translation id="5841007907672481419">來自 <ph name="TYPE_1" /></translation>
 <translation id="5841338463993781099">要儲存在帳戶中嗎?</translation>
 <translation id="5843987376989109187">目前不支援此語言。
     <ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
@@ -2789,6 +2796,7 @@
 <translation id="5863515189965725638">編輯 IBAN</translation>
 <translation id="5863847714970149516">接下來的頁面可能會向您收取費用</translation>
 <translation id="5866257070973731571">新增電話號碼</translation>
+<translation id="5866327164731551901">來自 <ph name="TYPE_1" /> <ph name="TYPE_2" /></translation>
 <translation id="5866898949289125849">您正在查看 Developer Tools 頁面</translation>
 <translation id="5869405914158311789">無法連線至此網站</translation>
 <translation id="5869522115854928033">已儲存的密碼</translation>
@@ -3498,6 +3506,7 @@
 <translation id="7075452647191940183">要求過大</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
+<translation id="7079783554682867524">來自 <ph name="TYPE_1" /> (已同步的裝置上還有其他網站)</translation>
 <translation id="7081311540357715807">食品和雜貨零售商</translation>
 <translation id="7083258188081898530">紙匣 9</translation>
 <translation id="7086090958708083563">使用者已要求上載</translation>
@@ -4154,6 +4163,7 @@
 <translation id="8216640997712497593">14 x 18 吋</translation>
 <translation id="8218327578424803826">已指派的位置:</translation>
 <translation id="8220602974062798186">要封鎖「<ph name="TOPIC" />」和所有相關主題嗎?</translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />,問「<ph name="KEYWORD_SUFFIX" />」</translation>
 <translation id="8228419419708659934">雙頁檢視</translation>
 <translation id="8228477714872026922">「<ph name="ORIGIN" />」想存取您網絡上的裝置:</translation>
 <translation id="822925450938886901">如想瞭解詳情和可能適用的政策,請用瀏覽器開啟 chrome://management。</translation>
@@ -4197,6 +4207,7 @@
 <translation id="8280630997017109758">紙匣 11</translation>
 <translation id="8281730697546299650">其他現已推出的廣告私隱功能</translation>
 <translation id="8281886186245836920">略過</translation>
+<translation id="8282292167096638950">刪除駕駛執照</translation>
 <translation id="8282409409360764263">庭院保養</translation>
 <translation id="8282947398454257691">掌握您的專屬裝置識別碼</translation>
 <translation id="8284769179630993263">在 Chrome 設定中管理安全瀏覽等功能</translation>
@@ -4224,6 +4235,7 @@
 <translation id="8321476692217554900">通知</translation>
 <translation id="8322402665880479974">床鋪和床頭板</translation>
 <translation id="8323505966575306467">加強保護密碼</translation>
+<translation id="832547548543012337">刪除護照</translation>
 <translation id="832567874344484841">早餐食品</translation>
 <translation id="8329068931308448247">#14 信封</translation>
 <translation id="8332188693563227489"><ph name="HOST_NAME" /> 的存取被拒</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb
index 8e784ede..dcf552d 100644
--- a/components/strings/components_strings_zh-TW.xtb
+++ b/components/strings/components_strings_zh-TW.xtb
@@ -527,6 +527,7 @@
 <translation id="1890171020361705182">在這款恐龍遊戲中,你要協助在荒野中奔馳的像素風恐龍閃避仙人掌和翼手龍。聽見提示音效時,輕觸一下即可躍過障礙物。</translation>
 <translation id="1898423065542865115">篩選</translation>
 <translation id="1901443836186977402">{1,plural, =1{伺服器無法證明其屬於 <ph name="DOMAIN" /> 網域;其安全性憑證已在昨天到期。這可能是因為設定錯誤,或是有攻擊者攔截你的連線。這台電腦的時鐘目前設為 <ph name="CURRENT_DATE" />,這是正確的時間嗎?如果不是的話,請更新系統時鐘,然後重新整理這個網頁。}other{伺服器無法證明其屬於 <ph name="DOMAIN" /> 網域;其安全性憑證已在 # 天前到期。這可能是因為設定錯誤,或有攻擊者攔截你的連線。這台電腦的時鐘目前設為 <ph name="CURRENT_DATE" />,這是正確的時間嗎?如果不是的話,請更新系統時鐘,然後重新整理這個網頁。}}</translation>
+<translation id="190166348986967700">系統管理員會在 <ph name="DATE_TIME" /> 開始將你的檔案上傳到 <ph name="CLOUD_PROVIDER" />。完成之前,請勿中斷裝置連線。上傳期間,你只能讀取本機檔案。</translation>
 <translation id="1902576642799138955">有效期間</translation>
 <translation id="1908217026282415406">使用及調整攝影機</translation>
 <translation id="1908690643053136980">系統管理員不允許這個網站使用<ph name="PERMISSION" /></translation>
@@ -1922,6 +1923,7 @@
 <translation id="4282346679996504092">這項產品的快訊已關閉,這個網頁也已從書籤中移除</translation>
 <translation id="4285498937028063278">取消固定</translation>
 <translation id="4287495839370498922">Chrome 的加強型廣告隱私權設定</translation>
+<translation id="4288101205645068104">刪除車輛</translation>
 <translation id="4290920330097335010">一律不允許</translation>
 <translation id="4296207570293932800">全新廣告隱私權功能正式上線</translation>
 <translation id="4297502707443874121">第 <ph name="THUMBNAIL_PAGE" /> 頁的縮圖</translation>
@@ -2151,6 +2153,7 @@
 <translation id="473775607612524610">更新</translation>
 <translation id="4738601419177586157">「<ph name="TEXT" />」搜尋建議</translation>
 <translation id="4742407542027196863">管理密碼…</translation>
+<translation id="474270528725216349">來自已同步裝置上的至少 1 個網站</translation>
 <translation id="4743275772928623722">系統已完成更新,但部分應用程式和檔案無法復原。系統會自動再次下載應用程式。</translation>
 <translation id="4744514002166662487">建立簡報</translation>
 <translation id="4744603770635761495">可執行檔的路徑</translation>
@@ -2281,6 +2284,7 @@
 <translation id="495170559598752135">動作</translation>
 <translation id="4953689047182316270">回應無障礙活動</translation>
 <translation id="4957080528849277028">「查看 Chrome 歷史記錄」按鈕,啟動後即可在 Chrome 設定中查看及管理瀏覽記錄</translation>
+<translation id="4957781475307065660">{DOMAIN_COUNT,plural, =1{和另外 1 個網站}other{和另外 # 個網站}}</translation>
 <translation id="4958444002117714549">展開清單</translation>
 <translation id="4960068118612257147">你可以前往 Chrome 的廣告隱私權設定進行變更</translation>
 <translation id="4960203958361543136">選擇搜尋引擎</translation>
@@ -2615,8 +2619,10 @@
 <translation id="553377674408670169">教育相關工作</translation>
 <translation id="5534785731327961487">目前是入手的好時機</translation>
 <translation id="5536214594743852365">顯示「<ph name="SECTION" />」部分</translation>
+<translation id="5536471014287260753">{DOMAIN_COUNT,plural, =1{和另外 1 個網站 (已同步的裝置上還有其他網站)}other{和另外 # 個網站 (已同步的裝置上還有其他網站)}}</translation>
 <translation id="553782666181800029">Envelope Chou 2</translation>
 <translation id="5538270463355278784">自動進入全螢幕模式</translation>
+<translation id="5538859347764346097"><ph name="KEYWORD_SHORTCUT" />,搜尋「<ph name="KEYWORD_SUFFIX" />」</translation>
 <translation id="5539243836947087108">筏板</translation>
 <translation id="5540224163453853">找不到要求的文章。</translation>
 <translation id="5540969246441091044">馬術</translation>
@@ -2775,6 +2781,7 @@
 <translation id="5838278095973806738">請勿在這個網站上輸入任何機密資訊 (例如密碼或信用卡號碼),以免遭到攻擊者竊取。</translation>
 <translation id="5838732667866024867">你可以使用向左/向右鍵查看圖表上的價格異動</translation>
 <translation id="5840318881868981258">更新 Google 帳戶 (<ph name="ACCOUNT" />) 中的密碼</translation>
+<translation id="5841007907672481419">來自 <ph name="TYPE_1" /></translation>
 <translation id="5841338463993781099">要儲存到帳戶中嗎?</translation>
 <translation id="5843987376989109187">目前尚不支援這個語言。
     <ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
@@ -2788,6 +2795,7 @@
 <translation id="5863515189965725638">編輯 IBAN</translation>
 <translation id="5863847714970149516">你要瀏覽的網頁可能會向你收取費用</translation>
 <translation id="5866257070973731571">新增電話號碼</translation>
+<translation id="5866327164731551901">來自 <ph name="TYPE_1" /> <ph name="TYPE_2" /></translation>
 <translation id="5866898949289125849">目前查看的是開發人員工具頁面</translation>
 <translation id="5869405914158311789">無法連上這個網站</translation>
 <translation id="5869522115854928033">已儲存的密碼</translation>
@@ -3497,6 +3505,7 @@
 <translation id="7075452647191940183">要求過大</translation>
 <translation id="7078665357168027058">RA3</translation>
 <translation id="7079699498125013497">\u0020\u2022\u0020</translation>
+<translation id="7079783554682867524">來自 <ph name="TYPE_1" /> (已同步的裝置上還有其他網站)</translation>
 <translation id="7081311540357715807">雜貨食品零售店</translation>
 <translation id="7083258188081898530">紙匣 9</translation>
 <translation id="7086090958708083563">使用者要求上傳</translation>
@@ -4153,6 +4162,7 @@
 <translation id="8216640997712497593">14 x 18 吋</translation>
 <translation id="8218327578424803826">指派的位置:</translation>
 <translation id="8220602974062798186">要封鎖「<ph name="TOPIC" />」和所有相關主題嗎?</translation>
+<translation id="8226408512771130794"><ph name="KEYWORD_SHORTCUT" />,問問「<ph name="KEYWORD_SUFFIX" />」</translation>
 <translation id="8228419419708659934">雙頁檢視</translation>
 <translation id="8228477714872026922">「<ph name="ORIGIN" />」想要存取你網路上的裝置:</translation>
 <translation id="822925450938886901">如需其他資訊與可能適用的政策,請使用瀏覽器開啟 chrome://management。</translation>
@@ -4196,6 +4206,7 @@
 <translation id="8280630997017109758">紙匣 11</translation>
 <translation id="8281730697546299650">其他廣告隱私權功能正式上線</translation>
 <translation id="8281886186245836920">略過</translation>
+<translation id="8282292167096638950">刪除駕照</translation>
 <translation id="8282409409360764263">庭院維護</translation>
 <translation id="8282947398454257691">存取您的專屬裝置 ID</translation>
 <translation id="8284769179630993263">在 Chrome 設定中管理安全瀏覽等功能</translation>
@@ -4223,6 +4234,7 @@
 <translation id="8321476692217554900">通知</translation>
 <translation id="8322402665880479974">床鋪與床頭板</translation>
 <translation id="8323505966575306467">為密碼提供額外防護</translation>
+<translation id="832547548543012337">刪除護照</translation>
 <translation id="832567874344484841">早餐食品</translation>
 <translation id="8329068931308448247">Envelope #14</translation>
 <translation id="8332188693563227489">存取 <ph name="HOST_NAME" /> 的要求遭到拒絕</translation>
diff --git a/components/sync/base/data_type.h b/components/sync/base/data_type.h
index dca5bf5..1b5d9b3c 100644
--- a/components/sync/base/data_type.h
+++ b/components/sync/base/data_type.h
@@ -403,17 +403,17 @@
 }
 
 // Types triggering a warning when the user signs out and the types have
-// unsynced data. The warning offers the user to either save the data locally or
-// abort sign-out, depending on the platform.
+// unsynced data. The warning offers the user to proceed with sign-out deleting
+// any pending account data or abort, depending on the platform.
 constexpr DataTypeSet TypesRequiringUnsyncedDataCheckOnSignout() {
   static_assert(
       55 == GetNumDataTypes(),
       "Add new types to `TypesRequiringUnsyncedDataCheckOnSignout()` if there "
       "should be a warning when the user signs out and the types have unsynced "
-      "data. The warning offers the user to either save the data locally or "
-      "abort sign-out, depending on the platform");
-  return {syncer::BOOKMARKS, syncer::CONTACT_INFO, syncer::PASSWORDS,
-          syncer::READING_LIST, syncer::SAVED_TAB_GROUP};
+      "data. The warning offers the user to either proceed with sign-out "
+      "deleting any pending account data or abort, depending on the platform");
+  return {syncer::BOOKMARKS,    syncer::CONTACT_INFO,    syncer::PASSWORDS,
+          syncer::READING_LIST, syncer::SAVED_TAB_GROUP, syncer::THEMES};
 }
 
 // User types that can be encrypted, which is a subset of UserTypes() and a
diff --git a/components/sync/engine/data_type_worker.cc b/components/sync/engine/data_type_worker.cc
index 3a0b1907f..86dd384 100644
--- a/components/sync/engine/data_type_worker.cc
+++ b/components/sync/engine/data_type_worker.cc
@@ -79,26 +79,6 @@
 };
 // LINT.ThenChange(/tools/metrics/histograms/metadata/sync/enums.xml:CrossUserSharingDecryptionResult)
 
-// Result of a GetUpdates request for a data type that was nudged (contained at
-// least one invalidation hint for the data type).
-//
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused.
-// LINT.IfChange(NudgedUpdateResult)
-enum class NudgedUpdateResult {
-  // The data type successfully downloaded at least one entity.
-  kSuccess = 0,
-
-  // No entities were downloaded when data type was invalidated.
-  kEmptyResponse = 1,
-
-  // The data type failed to download updates during a sync cycle.
-  kDownloadFailure = 2,
-
-  kMaxValue = kDownloadFailure,
-};
-// LINT.ThenChange(/tools/metrics/histograms/metadata/sync/enums.xml:NudgedUpdateResult)
-
 void LogPasswordNotesState(PasswordNotesStateForUMA state) {
   base::UmaHistogramEnumeration(kPasswordNotesStateHistogramName, state);
 }
@@ -123,7 +103,8 @@
                               latency);
 }
 
-void LogNudgedUpdateResult(NudgedUpdateResult result, DataType type) {
+void LogNudgedUpdateResult(UpdateHandler::NudgedUpdateResult result,
+                           DataType type) {
   base::UmaHistogramEnumeration(base::StrCat({"Sync.NudgedUpdateResult.",
                                               DataTypeToHistogramSuffix(type)}),
                                 result);
@@ -1355,11 +1336,12 @@
   SendPendingInvalidationsToProcessor();
 }
 
-void DataTypeWorker::RecordDownloadFailure() const {
+void DataTypeWorker::RecordDownloadFailure(
+    NudgedUpdateResult failure_result) const {
   // Record the failure only if the data type was nudged / invalidated.
   for (const PendingInvalidation& invalidation : pending_invalidations_) {
     if (invalidation.is_processed) {
-      LogNudgedUpdateResult(NudgedUpdateResult::kDownloadFailure, type_);
+      LogNudgedUpdateResult(failure_result, type_);
       break;
     }
   }
diff --git a/components/sync/engine/data_type_worker.h b/components/sync/engine/data_type_worker.h
index 52d754cf..f606037 100644
--- a/components/sync/engine/data_type_worker.h
+++ b/components/sync/engine/data_type_worker.h
@@ -191,7 +191,7 @@
   void ApplyUpdates(StatusController* status, bool cycle_done) override;
   void RecordRemoteInvalidation(
       std::unique_ptr<SyncInvalidation> incoming) override;
-  void RecordDownloadFailure() const override;
+  void RecordDownloadFailure(NudgedUpdateResult failure_result) const override;
   void CollectPendingInvalidations(sync_pb::GetUpdateTriggers* msg) override;
   bool HasPendingInvalidations() const override;
 
diff --git a/components/sync/engine/get_updates_processor.cc b/components/sync/engine/get_updates_processor.cc
index 9995146c..1bf5d971 100644
--- a/components/sync/engine/get_updates_processor.cc
+++ b/components/sync/engine/get_updates_processor.cc
@@ -20,6 +20,7 @@
 #include "components/sync/engine/events/get_updates_response_event.h"
 #include "components/sync/engine/get_updates_delegate.h"
 #include "components/sync/engine/nigori/keystore_keys_handler.h"
+#include "components/sync/engine/syncer_error.h"
 #include "components/sync/engine/syncer_proto_util.h"
 #include "components/sync/engine/update_handler.h"
 #include "components/sync/protocol/data_type_progress_marker.pb.h"
@@ -368,9 +369,23 @@
     if (gu_types.Has(type)) {
       update_handler->ApplyUpdates(status_controller, /*cycle_done=*/true);
     }
+  }
 
-    if (data_types_with_failure.Has(type)) {
-      update_handler->RecordDownloadFailure();
+  RecordDownloadFailure(
+      data_types_with_failure,
+      UpdateHandler::NudgedUpdateResult::kDownloadPartialFailure);
+}
+
+void GetUpdatesProcessor::RecordDownloadFailure(
+    const DataTypeSet& gu_types,
+    UpdateHandler::NudgedUpdateResult failure_result) {
+  if (gu_types.empty()) {
+    return;
+  }
+
+  for (const auto& [type, update_handler] : *update_handler_map_) {
+    if (gu_types.Has(type)) {
+      update_handler->RecordDownloadFailure(failure_result);
     }
   }
 }
diff --git a/components/sync/engine/get_updates_processor.h b/components/sync/engine/get_updates_processor.h
index 2f6dee66..585f0d6 100644
--- a/components/sync/engine/get_updates_processor.h
+++ b/components/sync/engine/get_updates_processor.h
@@ -50,6 +50,10 @@
                     const DataTypeSet& data_types_with_failure,
                     StatusController* status_controller);
 
+  // Records a download failure for the updated types.
+  void RecordDownloadFailure(const DataTypeSet& gu_types,
+                             UpdateHandler::NudgedUpdateResult failure_result);
+
   // Returns true if last DownloadUpdates() outcome indicated that there are
   // more updates to download from the server, e.g. when GetUpdatesResponse has
   // non-zero `changes_remaining`.
diff --git a/components/sync/engine/syncer.cc b/components/sync/engine/syncer.cc
index a9c2a95..5dd191f 100644
--- a/components/sync/engine/syncer.cc
+++ b/components/sync/engine/syncer.cc
@@ -26,6 +26,7 @@
 #include "components/sync/engine/get_updates_processor.h"
 #include "components/sync/engine/sync_protocol_error.h"
 #include "components/sync/engine/syncer_error.h"
+#include "components/sync/engine/update_handler.h"
 #include "components/sync/protocol/sync_enums.pb.h"
 #include "net/http/http_status_code.h"
 
@@ -83,6 +84,23 @@
   NOTREACHED();
 }
 
+// Returns the NudgedUpdateResult corresponding to the given SyncerError. Not
+// used for `kSuccess`.
+UpdateHandler::NudgedUpdateResult SyncerErrorToNudgedUpdateResult(
+    const SyncerError& error) {
+  switch (error.type()) {
+    case SyncerError::Type::kNetworkError:
+      return UpdateHandler::NudgedUpdateResult::kDownloadRequestNetworkError;
+    case SyncerError::Type::kHttpError:
+    case SyncerError::Type::kProtocolError:
+    case SyncerError::Type::kProtocolViolationError:
+      // Return server error for all non-network errors.
+      return UpdateHandler::NudgedUpdateResult::kDownloadRequestServerError;
+    case SyncerError::Type::kSuccess:
+      NOTREACHED();
+  }
+}
+
 // Returns invalidation info after applying updates. This is used to drop
 // optimization flags if DeviceInfo has been just updated (and new subscriptions
 // might be just received). Without that if a new device with enabled
@@ -217,8 +235,14 @@
   *request_types = Union(download_types, requested_commit_only_types);
 
   // Exit without applying if we're shutting down or an error was detected.
-  if (download_result.type() != SyncerError::Type::kSuccess ||
-      ExitRequested()) {
+  if (ExitRequested()) {
+    return false;
+  }
+
+  if (download_result.type() != SyncerError::Type::kSuccess) {
+    get_updates_processor.RecordDownloadFailure(
+        Union(download_types, data_types_with_failure),
+        SyncerErrorToNudgedUpdateResult(download_result));
     return false;
   }
 
diff --git a/components/sync/engine/update_handler.h b/components/sync/engine/update_handler.h
index 24f1ec4c..ed98ce7 100644
--- a/components/sync/engine/update_handler.h
+++ b/components/sync/engine/update_handler.h
@@ -28,6 +28,31 @@
 // from the sync server.
 class UpdateHandler {
  public:
+  // Result of a GetUpdates request for a data type that was nudged (contained
+  // at least one invalidation hint for the data type). These values are
+  // persisted to logs. Entries should not be renumbered and numeric values
+  // should never be reused. LINT.IfChange(NudgedUpdateResult)
+  enum class NudgedUpdateResult {
+    // The data type successfully downloaded at least one entity.
+    kSuccess = 0,
+
+    // No entities were downloaded when data type was invalidated.
+    kEmptyResponse = 1,
+
+    // The data type failed to download updates during a sync cycle while a
+    // GetUpdates request succeeded.
+    kDownloadPartialFailure = 2,
+
+    // The whole GetUpdates request failed due to a server error.
+    kDownloadRequestServerError = 3,
+
+    // The whole GetUpdates request failed due to a network error.
+    kDownloadRequestNetworkError = 4,
+
+    kMaxValue = kDownloadRequestNetworkError,
+  };
+  // LINT.ThenChange(/tools/metrics/histograms/metadata/sync/enums.xml:NudgedUpdateResult)
+
   virtual ~UpdateHandler() = default;
 
   // Returns true if initial sync was performed for this type.
@@ -45,7 +70,8 @@
       std::unique_ptr<SyncInvalidation> incoming) = 0;
 
   // Records a failure during a GetUpdates request.
-  virtual void RecordDownloadFailure() const = 0;
+  virtual void RecordDownloadFailure(
+      NudgedUpdateResult failure_result) const = 0;
 
   // Fill invalidation related fields in GetUpdates request.
   virtual void CollectPendingInvalidations(sync_pb::GetUpdateTriggers* msg) = 0;
diff --git a/components/sync/nigori/nigori_sync_bridge_impl.cc b/components/sync/nigori/nigori_sync_bridge_impl.cc
index fbce5f62..1e76c66b 100644
--- a/components/sync/nigori/nigori_sync_bridge_impl.cc
+++ b/components/sync/nigori/nigori_sync_bridge_impl.cc
@@ -888,7 +888,7 @@
   DCHECK(key_bag.HasKey(new_default_key_name));
 
   NigoriKeyBag new_key_bag = NigoriKeyBag::CreateEmpty();
-  for (auto key : decrypted_pending_keys.key()) {
+  for (const sync_pb::NigoriKey& key : decrypted_pending_keys.key()) {
     new_key_bag.AddKeyFromProto(key);
   }
 
diff --git a/components/sync/service/data_type_controller.cc b/components/sync/service/data_type_controller.cc
index 4c8cefa..708f4229 100644
--- a/components/sync/service/data_type_controller.cc
+++ b/components/sync/service/data_type_controller.cc
@@ -277,7 +277,7 @@
   }
   CHECK(it->second);
   // This should only be triggered for transport-only mode.
-  CHECK(!delegate_ || delegate_ == it->second.get());
+  CHECK(!delegate_ || delegate_ == it->second.get(), base::NotFatalUntil::M138);
   it->second->HasUnsyncedData(std::move(callback));
 }
 
diff --git a/components/sync/service/data_type_manager_impl.cc b/components/sync/service/data_type_manager_impl.cc
index dd3bfd0..6614c5d 100644
--- a/components/sync/service/data_type_manager_impl.cc
+++ b/components/sync/service/data_type_manager_impl.cc
@@ -913,8 +913,9 @@
   for (DataType type : requested_types) {
     auto it = controllers_.find(type);
     if (it == controllers_.end()) {
-      // This should be rare, but can happen e.g. if a requested type is
-      // disabled via feature flag.
+      // This can happen if the requested data type is not supported on the
+      // current platform, or in some rare cases, for example, if the requested
+      // data type is disabled via feature flag.
       helper->OnReceivedResultForType(type, /*has_unsynced_data=*/false);
       continue;
     }
diff --git a/components/sync/service/sync_service_impl.cc b/components/sync/service/sync_service_impl.cc
index f63d9aa..2ee6650 100644
--- a/components/sync/service/sync_service_impl.cc
+++ b/components/sync/service/sync_service_impl.cc
@@ -2305,7 +2305,7 @@
     base::OnceCallback<void(DataTypeSet)> callback) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   // This should only be called in transport-only mode.
-  CHECK(!IsSyncFeatureEnabled());
+  CHECK(!IsSyncFeatureEnabled(), base::NotFatalUntil::M138);
   // TODO(crbug.com/40901755): Consider changing this to always guarantee an
   // asynchronous behavior, rather than invoking the callback synchronously in
   // rare cases.
diff --git a/components/sync/test/mock_update_handler.cc b/components/sync/test/mock_update_handler.cc
index e27e67d..4aa8816c 100644
--- a/components/sync/test/mock_update_handler.cc
+++ b/components/sync/test/mock_update_handler.cc
@@ -48,7 +48,8 @@
 void MockUpdateHandler::RecordRemoteInvalidation(
     std::unique_ptr<SyncInvalidation> incoming) {}
 
-void MockUpdateHandler::RecordDownloadFailure() const {}
+void MockUpdateHandler::RecordDownloadFailure(
+    UpdateHandler::NudgedUpdateResult failure_result) const {}
 
 void MockUpdateHandler::CollectPendingInvalidations(
     sync_pb::GetUpdateTriggers* msg) {
diff --git a/components/sync/test/mock_update_handler.h b/components/sync/test/mock_update_handler.h
index 4fa3f069..ad35495 100644
--- a/components/sync/test/mock_update_handler.h
+++ b/components/sync/test/mock_update_handler.h
@@ -32,7 +32,8 @@
   void ApplyUpdates(StatusController* status, bool cycle_done) override;
   void RecordRemoteInvalidation(
       std::unique_ptr<SyncInvalidation> incoming) override;
-  void RecordDownloadFailure() const override;
+  void RecordDownloadFailure(
+      UpdateHandler::NudgedUpdateResult failure_result) const override;
   void CollectPendingInvalidations(sync_pb::GetUpdateTriggers* msg) override;
   bool HasPendingInvalidations() const override;
 
diff --git a/components/trusted_vault/BUILD.gn b/components/trusted_vault/BUILD.gn
index 6eb1273..49ae2ee2 100644
--- a/components/trusted_vault/BUILD.gn
+++ b/components/trusted_vault/BUILD.gn
@@ -61,6 +61,9 @@
       "trusted_vault_request.h",
       "trusted_vault_server_constants.cc",
       "trusted_vault_server_constants.h",
+      "trusted_vault_throttling_connection.h",
+      "trusted_vault_throttling_connection_impl.cc",
+      "trusted_vault_throttling_connection_impl.h",
     ]
 
     deps = [
@@ -94,6 +97,7 @@
       "trusted_vault_degraded_recoverability_handler_unittest.cc",
       "trusted_vault_request_unittest.cc",
       "trusted_vault_server_constants_unittest.cc",
+      "trusted_vault_throttling_connection_impl_unittest.cc",
     ]
 
     configs += [ "//build/config:precompiled_headers" ]
@@ -138,10 +142,12 @@
 
   if (!is_android) {
     sources += [
+      "test/fake_file_access.cc",
+      "test/fake_file_access.h",
       "test/fake_security_domains_server.cc",
       "test/fake_security_domains_server.h",
-      "test/mock_trusted_vault_connection.cc",
-      "test/mock_trusted_vault_connection.h",
+      "test/mock_trusted_vault_throttling_connection.cc",
+      "test/mock_trusted_vault_throttling_connection.h",
     ]
 
     public_deps += [
diff --git a/components/trusted_vault/local_recovery_factor.h b/components/trusted_vault/local_recovery_factor.h
index ad95e663..078fcd75 100644
--- a/components/trusted_vault/local_recovery_factor.h
+++ b/components/trusted_vault/local_recovery_factor.h
@@ -10,8 +10,8 @@
 
 #include "base/functional/callback.h"
 #include "components/signin/public/identity_manager/account_info.h"
-#include "components/trusted_vault/trusted_vault_connection.h"
 #include "components/trusted_vault/trusted_vault_histograms.h"
+#include "components/trusted_vault/trusted_vault_throttling_connection.h"
 #include "google_apis/gaia/gaia_id.h"
 
 namespace trusted_vault {
@@ -43,10 +43,7 @@
   virtual ~LocalRecoveryFactor() = default;
 
   // Attempts a key recovery.
-  // Note: If `connection_requests_throttled` is true, implementations of this
-  // method are not allowed to make requests to `connection`.
-  virtual void AttemptRecovery(TrustedVaultConnection* connection,
-                               bool connection_requests_throttled,
+  virtual void AttemptRecovery(TrustedVaultThrottlingConnection* connection,
                                AttemptRecoveryCallback cb,
                                AttemptRecoveryFailureCallback failure_cb) = 0;
 
@@ -61,11 +58,8 @@
   // and currently available local data is sufficient to do it. It returns an
   // enum representing the registration state, intended to be used for metric
   // recording.
-  // Note: If `connection_requests_throttled` is true, implementations of this
-  // method are not allowed to make requests to `connection`.
   virtual TrustedVaultDeviceRegistrationStateForUMA MaybeRegister(
-      TrustedVaultConnection* connection,
-      bool connection_requests_throttled,
+      TrustedVaultThrottlingConnection* connection,
       RegisterCallback cb) = 0;
 };
 
diff --git a/components/trusted_vault/physical_device_recovery_factor.cc b/components/trusted_vault/physical_device_recovery_factor.cc
index 92e6e82..1cf66e7b 100644
--- a/components/trusted_vault/physical_device_recovery_factor.cc
+++ b/components/trusted_vault/physical_device_recovery_factor.cc
@@ -25,8 +25,7 @@
 PhysicalDeviceRecoveryFactor::~PhysicalDeviceRecoveryFactor() = default;
 
 void PhysicalDeviceRecoveryFactor::AttemptRecovery(
-    TrustedVaultConnection* connection,
-    bool connection_requests_throttled,
+    TrustedVaultThrottlingConnection* connection,
     AttemptRecoveryCallback cb,
     AttemptRecoveryFailureCallback failure_cb) {
   auto* per_user_vault = GetPrimaryAccountVault();
@@ -42,7 +41,7 @@
     return;
   }
 
-  if (connection_requests_throttled) {
+  if (connection->AreRequestsThrottled(*primary_account_)) {
     base::BindPostTaskToCurrentDefault(
         base::BindOnce(
             std::move(failure_cb),
@@ -103,9 +102,9 @@
 }
 
 TrustedVaultDeviceRegistrationStateForUMA
-PhysicalDeviceRecoveryFactor::MaybeRegister(TrustedVaultConnection* connection,
-                                            bool connection_requests_throttled,
-                                            RegisterCallback cb) {
+PhysicalDeviceRecoveryFactor::MaybeRegister(
+    TrustedVaultThrottlingConnection* connection,
+    RegisterCallback cb) {
   auto* per_user_vault = GetPrimaryAccountVault();
 
   if (per_user_vault->local_device_registration_info().device_registered()) {
@@ -121,7 +120,7 @@
     return TrustedVaultDeviceRegistrationStateForUMA::kLocalKeysAreStale;
   }
 
-  if (connection_requests_throttled) {
+  if (connection->AreRequestsThrottled(*primary_account_)) {
     return TrustedVaultDeviceRegistrationStateForUMA::kThrottledClientSide;
   }
 
diff --git a/components/trusted_vault/physical_device_recovery_factor.h b/components/trusted_vault/physical_device_recovery_factor.h
index e6fd310..a3c7c50 100644
--- a/components/trusted_vault/physical_device_recovery_factor.h
+++ b/components/trusted_vault/physical_device_recovery_factor.h
@@ -13,8 +13,8 @@
 #include "components/trusted_vault/local_recovery_factor.h"
 #include "components/trusted_vault/proto/local_trusted_vault.pb.h"
 #include "components/trusted_vault/standalone_trusted_vault_storage.h"
-#include "components/trusted_vault/trusted_vault_connection.h"
 #include "components/trusted_vault/trusted_vault_histograms.h"
+#include "components/trusted_vault/trusted_vault_throttling_connection.h"
 #include "google_apis/gaia/gaia_id.h"
 
 namespace trusted_vault {
@@ -36,8 +36,7 @@
       delete;
   ~PhysicalDeviceRecoveryFactor() override;
 
-  void AttemptRecovery(TrustedVaultConnection* connection,
-                       bool connection_requests_throttled,
+  void AttemptRecovery(TrustedVaultThrottlingConnection* connection,
                        AttemptRecoveryCallback cb,
                        AttemptRecoveryFailureCallback failure_cb) override;
 
@@ -46,8 +45,7 @@
   void ClearRegistrationAttemptInfo(const GaiaId& gaia_id) override;
 
   TrustedVaultDeviceRegistrationStateForUMA MaybeRegister(
-      TrustedVaultConnection* connection,
-      bool connection_requests_throttled,
+      TrustedVaultThrottlingConnection* connection,
       RegisterCallback cb) override;
 
  private:
diff --git a/components/trusted_vault/standalone_trusted_vault_backend.cc b/components/trusted_vault/standalone_trusted_vault_backend.cc
index 9c9bb4e..efa988b 100644
--- a/components/trusted_vault/standalone_trusted_vault_backend.cc
+++ b/components/trusted_vault/standalone_trusted_vault_backend.cc
@@ -14,14 +14,12 @@
 #include "base/feature_list.h"
 #include "base/functional/callback_forward.h"
 #include "base/functional/callback_helpers.h"
+#include "base/memory/ptr_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/sequence_checker.h"
 #include "base/stl_util.h"
 #include "base/task/sequenced_task_runner.h"
-#include "base/time/clock.h"
-#include "base/time/default_clock.h"
-#include "base/time/time.h"
 #include "components/signin/public/identity_manager/account_info.h"
 #include "components/signin/public/identity_manager/accounts_in_cookie_jar_info.h"
 #include "components/trusted_vault/features.h"
@@ -34,6 +32,7 @@
 #include "components/trusted_vault/trusted_vault_connection.h"
 #include "components/trusted_vault/trusted_vault_histograms.h"
 #include "components/trusted_vault/trusted_vault_server_constants.h"
+#include "components/trusted_vault/trusted_vault_throttling_connection_impl.h"
 #include "google_apis/gaia/gaia_auth_util.h"
 #include "google_apis/gaia/gaia_id.h"
 #include "google_apis/gaia/google_service_auth_error.h"
@@ -172,11 +171,36 @@
     : security_domain_id_(security_domain_id),
       storage_(std::move(storage)),
       delegate_(std::move(delegate)),
-      connection_(std::move(connection)),
-      clock_(base::DefaultClock::GetInstance()) {}
+      connection_(connection
+                      ? std::make_unique<TrustedVaultThrottlingConnectionImpl>(
+                            std::move(connection),
+                            storage_.get())
+                      : nullptr) {}
+
+StandaloneTrustedVaultBackend::StandaloneTrustedVaultBackend(
+    SecurityDomainId security_domain_id,
+    std::unique_ptr<StandaloneTrustedVaultStorage> storage,
+    std::unique_ptr<Delegate> delegate,
+    std::unique_ptr<TrustedVaultThrottlingConnection> connection)
+    : security_domain_id_(security_domain_id),
+      storage_(std::move(storage)),
+      delegate_(std::move(delegate)),
+      connection_(std::move(connection)) {}
 
 StandaloneTrustedVaultBackend::~StandaloneTrustedVaultBackend() = default;
 
+// static
+scoped_refptr<StandaloneTrustedVaultBackend>
+StandaloneTrustedVaultBackend::CreateForTesting(
+    SecurityDomainId security_domain_id,
+    std::unique_ptr<StandaloneTrustedVaultStorage> storage,
+    std::unique_ptr<StandaloneTrustedVaultBackend::Delegate> delegate,
+    std::unique_ptr<TrustedVaultThrottlingConnection> connection) {
+  return base::WrapRefCounted(new StandaloneTrustedVaultBackend(
+      security_domain_id, std::move(storage), std::move(delegate),
+      std::move(connection)));
+}
+
 void StandaloneTrustedVaultBackend::WriteDegradedRecoverabilityState(
     const trusted_vault_pb::LocalTrustedVaultDegradedRecoverabilityState&
         degraded_recoverability_state) {
@@ -253,7 +277,7 @@
   CHECK(local_recovery_factor >= 0 &&
         local_recovery_factor < local_recovery_factors_.size());
   local_recovery_factors_[local_recovery_factor]->AttemptRecovery(
-      connection_.get(), AreConnectionRequestsThrottled(),
+      connection_.get(),
       // |this| outlives |local_recovery_factors_|, and destroying
       // |local_recovery_factors_| guarantees cancellation of all callbacks.
       base::BindOnce(&StandaloneTrustedVaultBackend::OnKeysDownloaded,
@@ -594,19 +618,11 @@
   WriteDataToDiskAndNotify();
 }
 
-void StandaloneTrustedVaultBackend::SetClockForTesting(base::Clock* clock) {
-  clock_ = clock;
-}
-
 bool StandaloneTrustedVaultBackend::HasPendingTrustedRecoveryMethodForTesting()
     const {
   return pending_trusted_recovery_method_.has_value();
 }
 
-bool StandaloneTrustedVaultBackend::AreConnectionRequestsThrottledForTesting() {
-  return AreConnectionRequestsThrottled();
-}
-
 void StandaloneTrustedVaultBackend::ResetLocalRecoveryFactors() {
   local_recovery_factors_.clear();
   // |storage_| outlives |local_recovery_factors_|.
@@ -637,7 +653,7 @@
   // Unretained because |this| outlives |local_recovery_factors_| (and
   // destroying |local_recovery_factors_| cancels all callbacks).
   return local_recovery_factors_[0]->MaybeRegister(
-      connection_.get(), AreConnectionRequestsThrottled(),
+      connection_.get(),
       base::BindOnce(&StandaloneTrustedVaultBackend::OnDeviceRegistered,
                      base::Unretained(this)));
 }
@@ -706,7 +722,7 @@
       // Request wasn't sent to the server, so there is no need for throttling.
       return;
     case TrustedVaultRegistrationStatus::kOtherError:
-      RecordFailedConnectionRequestForThrottling();
+      connection_->RecordFailedRequestForThrottling(*primary_account_);
       return;
   }
 }
@@ -750,7 +766,7 @@
       // download. This is bad because key download attempts are triggered for
       // the case where local keys have been marked as stale, which means the
       // user is likely in an unrecoverable state.
-      RecordFailedConnectionRequestForThrottling();
+      connection_->RecordFailedRequestForThrottling(*primary_account_);
       // Persist the keys anyway, since some old keys could be removed from the
       // server.
       StoreKeys(primary_account_->gaia, downloaded_vault_keys,
@@ -766,7 +782,7 @@
       // Request wasn't sent to the server, so there is no need for throttling.
       break;
     case TrustedVaultDownloadKeysStatus::kOtherError:
-      RecordFailedConnectionRequestForThrottling();
+      connection_->RecordFailedRequestForThrottling(*primary_account_);
       break;
   }
 
@@ -835,38 +851,6 @@
   std::move(callback).Run(vault_keys);
 }
 
-bool StandaloneTrustedVaultBackend::AreConnectionRequestsThrottled() {
-  DCHECK(clock_);
-  DCHECK(primary_account_.has_value());
-
-  trusted_vault_pb::LocalTrustedVaultPerUser* per_user_vault =
-      storage_->FindUserVault(primary_account_->gaia);
-  DCHECK(per_user_vault);
-
-  const base::Time current_time = clock_->Now();
-  base::Time last_failed_request_time = ProtoTimeToTime(
-      per_user_vault->last_failed_request_millis_since_unix_epoch());
-
-  // Fix |last_failed_request_time| if it's set to the future.
-  if (last_failed_request_time > current_time) {
-    // Immediately unthrottle, but don't write new state to the file.
-    last_failed_request_time = base::Time();
-  }
-
-  return last_failed_request_time + kThrottlingDuration > current_time;
-}
-
-void StandaloneTrustedVaultBackend::
-    RecordFailedConnectionRequestForThrottling() {
-  DCHECK(clock_);
-  DCHECK(primary_account_.has_value());
-
-  storage_->FindUserVault(primary_account_->gaia)
-      ->set_last_failed_request_millis_since_unix_epoch(
-          TimeToProtoTime(clock_->Now()));
-  WriteDataToDiskAndNotify();
-}
-
 void StandaloneTrustedVaultBackend::
     RemoveNonPrimaryAccountKeysIfMarkedForDeletion() {
   auto should_remove_user_data =
diff --git a/components/trusted_vault/standalone_trusted_vault_backend.h b/components/trusted_vault/standalone_trusted_vault_backend.h
index 4a3ad4d..257710c 100644
--- a/components/trusted_vault/standalone_trusted_vault_backend.h
+++ b/components/trusted_vault/standalone_trusted_vault_backend.h
@@ -20,17 +20,13 @@
 #include "components/trusted_vault/local_recovery_factor.h"
 #include "components/trusted_vault/proto/local_trusted_vault.pb.h"
 #include "components/trusted_vault/standalone_trusted_vault_storage.h"
-#include "components/trusted_vault/trusted_vault_connection.h"
 #include "components/trusted_vault/trusted_vault_degraded_recoverability_handler.h"
 #include "components/trusted_vault/trusted_vault_histograms.h"
 #include "components/trusted_vault/trusted_vault_server_constants.h"
+#include "components/trusted_vault/trusted_vault_throttling_connection.h"
 #include "google_apis/gaia/gaia_id.h"
 #include "google_apis/gaia/google_service_auth_error.h"
 
-namespace base {
-class Clock;
-}  // namespace base
-
 namespace signin {
 class AccountsInCookieJarInfo;
 }  // namespace signin
@@ -146,21 +142,25 @@
   void SetLastRegistrationReturnedLocalDataObsoleteForTesting(
       const GaiaId& gaia_id);
 
-  void SetClockForTesting(base::Clock* clock);
-
   bool HasPendingTrustedRecoveryMethodForTesting() const;
 
-  bool AreConnectionRequestsThrottledForTesting();
-
-  // Specifies how long requests shouldn't be retried after encountering
-  // transient error. Note, that this doesn't affect requests related to
-  // degraded recoverability.
-  // Exposed for testing.
-  static constexpr base::TimeDelta kThrottlingDuration = base::Days(1);
+  static scoped_refptr<StandaloneTrustedVaultBackend> CreateForTesting(
+      SecurityDomainId security_domain_id,
+      std::unique_ptr<StandaloneTrustedVaultStorage> storage,
+      std::unique_ptr<Delegate> delegate,
+      std::unique_ptr<TrustedVaultThrottlingConnection> connection);
 
  private:
   friend class base::RefCountedThreadSafe<StandaloneTrustedVaultBackend>;
 
+  // Constructor which allows specifying a TrustedVaultThrottlingConnection.
+  // Only used in tests.
+  StandaloneTrustedVaultBackend(
+      SecurityDomainId security_domain_id,
+      std::unique_ptr<StandaloneTrustedVaultStorage> storage,
+      std::unique_ptr<Delegate> delegate,
+      std::unique_ptr<TrustedVaultThrottlingConnection> connection);
+
   static TrustedVaultDownloadKeysStatusForUMA
   GetDownloadKeysStatusForUMAFromResponse(
       TrustedVaultDownloadKeysStatus response_status);
@@ -211,16 +211,6 @@
   void FulfillOngoingFetchKeys(
       std::optional<TrustedVaultDownloadKeysStatusForUMA> status_for_uma);
 
-  // Returns true if the last failed request time imply that upcoming requests
-  // should be throttled now (certain amount of time should pass since the last
-  // failed request). Handles the situation, when last failed request time is
-  // set to the future.
-  bool AreConnectionRequestsThrottled();
-
-  // Records request failure time, that will be used to determine whether new
-  // requests should be throttled.
-  void RecordFailedConnectionRequestForThrottling();
-
   // Removes all data for non-primary accounts if they were previously marked
   // for deletion due to accounts in cookie jar changes.
   void RemoveNonPrimaryAccountKeysIfMarkedForDeletion();
@@ -236,10 +226,12 @@
   // Used for communication with trusted vault server. Can be null, in this case
   // functionality that involves interaction with vault service (such as device
   // registration, keys downloading, etc.) will be disabled.
+  // Note: |connection_| depends on |storage_|, so it needs to be destroyed
+  // first. Thus, the field order matters.
   // TODO(crbug.com/40143544): |connection_| can be null if URL passed as
   // kTrustedVaultServiceURLSwitch is not valid, consider making it non-nullable
   // even in this case and clean up related logic.
-  const std::unique_ptr<TrustedVaultConnection> connection_;
+  const std::unique_ptr<TrustedVaultThrottlingConnection> connection_;
 
   // Only current |primary_account_| can be used for communication with trusted
   // vault server.
@@ -296,10 +288,6 @@
   std::unique_ptr<TrustedVaultConnection::Request>
       ongoing_add_recovery_method_request_;
 
-  // Used to determine current time, set to base::DefaultClock in prod and can
-  // be overridden in tests.
-  raw_ptr<base::Clock> clock_;
-
   // Used to take care of polling the degraded recoverability state from the
   // server for the |primary_account|. Instance changes whenever
   // |primary_account| changes.
diff --git a/components/trusted_vault/standalone_trusted_vault_backend_unittest.cc b/components/trusted_vault/standalone_trusted_vault_backend_unittest.cc
index 6ae5eb4..1def851a 100644
--- a/components/trusted_vault/standalone_trusted_vault_backend_unittest.cc
+++ b/components/trusted_vault/standalone_trusted_vault_backend_unittest.cc
@@ -19,7 +19,6 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/mock_callback.h"
 #include "base/test/scoped_feature_list.h"
-#include "base/test/simple_test_clock.h"
 #include "base/test/task_environment.h"
 #include "base/time/time.h"
 #include "components/signin/public/identity_manager/account_info.h"
@@ -29,10 +28,13 @@
 #include "components/trusted_vault/proto_string_bytes_conversion.h"
 #include "components/trusted_vault/securebox.h"
 #include "components/trusted_vault/standalone_trusted_vault_storage.h"
-#include "components/trusted_vault/test/mock_trusted_vault_connection.h"
+#include "components/trusted_vault/test/fake_file_access.h"
+#include "components/trusted_vault/test/mock_trusted_vault_throttling_connection.h"
 #include "components/trusted_vault/trusted_vault_connection.h"
 #include "components/trusted_vault/trusted_vault_histograms.h"
 #include "components/trusted_vault/trusted_vault_server_constants.h"
+#include "components/trusted_vault/trusted_vault_throttling_connection.h"
+#include "components/trusted_vault/trusted_vault_throttling_connection_impl.h"
 #include "google_apis/gaia/gaia_id.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -106,46 +108,15 @@
   MOCK_METHOD(void, NotifyStateChanged, (), (override));
 };
 
-class FakeFileAccess : public StandaloneTrustedVaultStorage::FileAccess {
- public:
-  FakeFileAccess() = default;
-  FakeFileAccess(const FakeFileAccess& other) = delete;
-  FakeFileAccess& operator=(const FakeFileAccess& other) = delete;
-  ~FakeFileAccess() override = default;
-
-  trusted_vault_pb::LocalTrustedVault ReadFromDisk() override {
-    return stored_data_;
-  }
-  void WriteToDisk(const trusted_vault_pb::LocalTrustedVault& data) override {
-    stored_data_ = data;
-  }
-
-  void SetStoredLocalTrustedVault(
-      const trusted_vault_pb::LocalTrustedVault& local_trusted_vault) {
-    stored_data_ = local_trusted_vault;
-  }
-  trusted_vault_pb::LocalTrustedVault GetStoredLocalTrustedVault() const {
-    return stored_data_;
-  }
-
- private:
-  trusted_vault_pb::LocalTrustedVault stored_data_;
-};
-
-// TODO(crbug.com/405381481): Move / duplicate relevant tests in this file to
-// PhysicalDeviceRecoveryFactorTest.
 class StandaloneTrustedVaultBackendTest : public testing::Test {
  public:
-  StandaloneTrustedVaultBackendTest() {
-    clock_.SetNow(base::Time::Now());
-    ResetBackend();
-  }
+  StandaloneTrustedVaultBackendTest() { ResetBackend(); }
 
   ~StandaloneTrustedVaultBackendTest() override = default;
 
   void ResetBackend() {
-    auto connection =
-        std::make_unique<testing::NiceMock<MockTrustedVaultConnection>>();
+    auto connection = std::make_unique<
+        testing::NiceMock<MockTrustedVaultThrottlingConnection>>();
 
     // To avoid DCHECK failures in tests that exercise SetPrimaryAccount(),
     // return non-null for RegisterAuthenticationFactor(). This registration
@@ -163,7 +134,7 @@
   }
 
   void ResetBackend(
-      std::unique_ptr<testing::NiceMock<MockTrustedVaultConnection>>
+      std::unique_ptr<testing::NiceMock<MockTrustedVaultThrottlingConnection>>
           connection) {
     auto file_access = std::make_unique<FakeFileAccess>();
     if (file_access_) {
@@ -172,24 +143,22 @@
           file_access_->GetStoredLocalTrustedVault());
     }
     file_access_ = file_access.get();
+    auto storage =
+        StandaloneTrustedVaultStorage::CreateForTesting(std::move(file_access));
 
     auto delegate = std::make_unique<testing::NiceMock<MockDelegate>>();
 
     connection_ = connection.get();
 
-    backend_ = base::MakeRefCounted<StandaloneTrustedVaultBackend>(
-        security_domain_id(),
-        StandaloneTrustedVaultStorage::CreateForTesting(std::move(file_access)),
-        std::move(delegate), std::move(connection));
-    backend_->SetClockForTesting(&clock_);
+    backend_ = StandaloneTrustedVaultBackend::CreateForTesting(
+        security_domain_id(), std::move(storage), std::move(delegate),
+        std::move(connection));
     backend_->ReadDataFromDisk();
   }
 
   FakeFileAccess* file_access() { return file_access_; }
 
-  MockTrustedVaultConnection* connection() { return connection_; }
-
-  base::SimpleTestClock* clock() { return &clock_; }
+  MockTrustedVaultThrottlingConnection* connection() { return connection_; }
 
   StandaloneTrustedVaultBackend* backend() { return backend_.get(); }
 
@@ -261,10 +230,10 @@
   }
 
  private:
-  base::SimpleTestClock clock_;
   scoped_refptr<StandaloneTrustedVaultBackend> backend_;
   raw_ptr<FakeFileAccess> file_access_ = nullptr;
-  raw_ptr<testing::NiceMock<MockTrustedVaultConnection>> connection_ = nullptr;
+  raw_ptr<testing::NiceMock<MockTrustedVaultThrottlingConnection>> connection_ =
+      nullptr;
 };
 
 TEST_F(StandaloneTrustedVaultBackendTest,
@@ -928,13 +897,16 @@
   Mock::VerifyAndClearExpectations(connection());
 
   // Mimic transient failure.
+  EXPECT_CALL(*connection(), RecordFailedRequestForThrottling);
   std::move(device_registration_callback)
       .Run(TrustedVaultRegistrationStatus::kOtherError, /*key_version=*/0);
+  Mock::VerifyAndClearExpectations(connection());
 
   // Mimic a restart to trigger device registration attempt, which should remain
   // throttled.
   base::HistogramTester histogram_tester;
   ResetBackend();
+  ON_CALL(*connection(), AreRequestsThrottled).WillByDefault(Return(true));
   EXPECT_CALL(*connection(), RegisterAuthenticationFactor).Times(0);
   SetPrimaryAccountWithUnknownAuthError(account_info);
   histogram_tester.ExpectUniqueSample(
@@ -942,13 +914,14 @@
       /*sample=*/
       TrustedVaultDeviceRegistrationStateForUMA::kThrottledClientSide,
       /*expected_bucket_count=*/1);
+  Mock::VerifyAndClearExpectations(connection());
 
   // Mimic a restart after sufficient time has passed, to trigger another device
   // registration attempt, which should now be unthrottled.
   base::HistogramTester histogram_tester2;
   ResetBackend();
+  ON_CALL(*connection(), AreRequestsThrottled).WillByDefault(Return(false));
   EXPECT_CALL(*connection(), RegisterAuthenticationFactor);
-  clock()->Advance(StandaloneTrustedVaultBackend::kThrottlingDuration);
   SetPrimaryAccountWithUnknownAuthError(account_info);
   histogram_tester2.ExpectUniqueSample(
       "TrustedVault.DeviceRegistrationState." + security_domain_name_for_uma(),
@@ -985,7 +958,9 @@
 
   base::HistogramTester histogram_tester;
 
-  // Mimic access token fetching failure.
+  // Mimic access token fetching failure. The expectation is that the backend
+  // doesn't treat this as a failure for throttling.
+  EXPECT_CALL(*connection(), RecordFailedRequestForThrottling).Times(0);
   std::move(device_registration_callback)
       .Run(TrustedVaultRegistrationStatus::kTransientAccessTokenFetchError,
            /*key_version=*/0);
@@ -997,12 +972,6 @@
       TrustedVaultDeviceRegistrationOutcomeForUMA::
           kTransientAccessTokenFetchError,
       /*expected_bucket_count=*/1);
-
-  // Mimic a restart to trigger device registration attempt, which should not be
-  // throttled.
-  ResetBackend();
-  EXPECT_CALL(*connection(), RegisterAuthenticationFactor);
-  SetPrimaryAccountWithUnknownAuthError(account_info);
 }
 
 TEST_F(StandaloneTrustedVaultBackendTest, ShouldNotThrottleUponNetworkError) {
@@ -1029,61 +998,10 @@
   ASSERT_FALSE(device_registration_callback.is_null());
   Mock::VerifyAndClearExpectations(connection());
 
-  // Mimic network error.
+  // Mimic network error. This should not throttle.
+  EXPECT_CALL(*connection(), RecordFailedRequestForThrottling).Times(0);
   std::move(device_registration_callback)
       .Run(TrustedVaultRegistrationStatus::kNetworkError, /*key_version=*/0);
-
-  // Mimic a restart to trigger device registration attempt, which should not be
-  // throttled.
-  ResetBackend();
-  EXPECT_CALL(*connection(), RegisterAuthenticationFactor);
-  SetPrimaryAccountWithUnknownAuthError(account_info);
-}
-
-// System time can be changed to the past and if this situation not handled,
-// requests could be throttled for unreasonable amount of time.
-TEST_F(StandaloneTrustedVaultBackendTest,
-       ShouldUnthrottleDeviceRegistrationWhenTimeSetToPast) {
-  const CoreAccountInfo account_info = MakeAccountInfoWithGaiaId("user");
-  const std::vector<uint8_t> kVaultKey = {1, 2, 3};
-  const int kLastKeyVersion = 1;
-
-  backend()->StoreKeys(account_info.gaia, {kVaultKey}, kLastKeyVersion);
-  TrustedVaultConnection::RegisterAuthenticationFactorCallback
-      device_registration_callback;
-  ON_CALL(*connection(), RegisterAuthenticationFactor)
-      .WillByDefault(
-          [&](const CoreAccountInfo&, const MemberKeysSource&,
-              const SecureBoxPublicKey&, AuthenticationFactorType,
-              TrustedVaultConnection::RegisterAuthenticationFactorCallback
-                  callback) {
-            device_registration_callback = std::move(callback);
-            return std::make_unique<TrustedVaultConnection::Request>();
-          });
-
-  clock()->SetNow(base::Time::Now());
-
-  EXPECT_CALL(*connection(), RegisterAuthenticationFactor);
-  // Setting the primary account will trigger device registration.
-  SetPrimaryAccountWithUnknownAuthError(account_info);
-  ASSERT_FALSE(device_registration_callback.is_null());
-  Mock::VerifyAndClearExpectations(connection());
-
-  // Mimic transient failure.
-  std::move(device_registration_callback)
-      .Run(TrustedVaultRegistrationStatus::kOtherError, /*key_version=*/0);
-
-  // Mimic system set to the past.
-  clock()->Advance(base::Seconds(-1));
-
-  device_registration_callback =
-      TrustedVaultConnection::RegisterAuthenticationFactorCallback();
-  EXPECT_CALL(*connection(), RegisterAuthenticationFactor);
-  // Reset and set primary account to trigger device registration attempt.
-  SetPrimaryAccountWithUnknownAuthError(/*primary_account=*/std::nullopt);
-  SetPrimaryAccountWithUnknownAuthError(account_info);
-
-  EXPECT_FALSE(device_registration_callback.is_null());
 }
 
 // Unless keys marked as stale, FetchKeys() should be completed immediately,
@@ -1208,9 +1126,9 @@
 }
 
 TEST_F(StandaloneTrustedVaultBackendTest,
-       ShouldThrottleAndUntrottleKeysDownloading) {
-  // The TaskEnvironment is needed because this PhysicalDeviceRecoveryFactor
-  // posts callbacks as tasks.
+       ShouldThrottleAndUnthrottleKeysDownloading) {
+  // The TaskEnvironment is needed because PhysicalDeviceRecoveryFactor posts
+  // callbacks as tasks.
   base::test::SingleThreadTaskEnvironment environment;
 
   const CoreAccountInfo account_info = MakeAccountInfoWithGaiaId("user");
@@ -1235,8 +1153,6 @@
           });
 
   {
-    clock()->SetNow(base::Time::Now());
-
     EXPECT_CALL(*connection(), DownloadNewKeys);
 
     base::RunLoop run_loop;
@@ -1249,6 +1165,7 @@
     Mock::VerifyAndClearExpectations(connection());
 
     // Mimic transient failure.
+    EXPECT_CALL(*connection(), RecordFailedRequestForThrottling);
     base::HistogramTester histogram_tester;
     std::move(download_keys_callback)
         .Run(TrustedVaultDownloadKeysStatus::kOtherError,
@@ -1260,11 +1177,13 @@
         "TrustedVault.DownloadKeysStatus." + security_domain_name_for_uma(),
         /*sample=*/TrustedVaultDownloadKeysStatusForUMA::kOtherError,
         /*expected_bucket_count=*/1);
-    EXPECT_TRUE(backend()->AreConnectionRequestsThrottledForTesting());
+    Mock::VerifyAndClearExpectations(connection());
   }
 
   {
     download_keys_callback = TrustedVaultConnection::DownloadNewKeysCallback();
+    EXPECT_CALL(*connection(), AreRequestsThrottled)
+        .WillRepeatedly(Return(true));
     EXPECT_CALL(*connection(), DownloadNewKeys).Times(0);
 
     base::RunLoop run_loop;
@@ -1281,9 +1200,9 @@
   {
     download_keys_callback = TrustedVaultConnection::DownloadNewKeysCallback();
 
-    // Advance time to pass the throttling duration and trigger another attempt.
-    clock()->Advance(StandaloneTrustedVaultBackend::kThrottlingDuration);
-    EXPECT_FALSE(backend()->AreConnectionRequestsThrottledForTesting());
+    // Unthrottle and trigger another attempt.
+    EXPECT_CALL(*connection(), AreRequestsThrottled)
+        .WillRepeatedly(Return(false));
     EXPECT_CALL(*connection(), DownloadNewKeys);
 
     base::RunLoop run_loop;
@@ -1331,6 +1250,7 @@
   Mock::VerifyAndClearExpectations(connection());
 
   // Mimic the server having no new keys.
+  EXPECT_CALL(*connection(), RecordFailedRequestForThrottling);
   base::HistogramTester histogram_tester;
   std::move(download_keys_callback)
       .Run(TrustedVaultDownloadKeysStatus::kNoNewKeys,
@@ -1340,8 +1260,7 @@
       "TrustedVault.DownloadKeysStatus." + security_domain_name_for_uma(),
       /*sample=*/TrustedVaultDownloadKeysStatusForUMA::kNoNewKeys,
       /*expected_bucket_count=*/1);
-
-  EXPECT_TRUE(backend()->AreConnectionRequestsThrottledForTesting());
+  Mock::VerifyAndClearExpectations(connection());
 
   // Registration should remain intact.
   EXPECT_TRUE(backend()
diff --git a/components/trusted_vault/test/fake_file_access.cc b/components/trusted_vault/test/fake_file_access.cc
new file mode 100644
index 0000000..21c0c5c
--- /dev/null
+++ b/components/trusted_vault/test/fake_file_access.cc
@@ -0,0 +1,30 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/trusted_vault/test/fake_file_access.h"
+
+namespace trusted_vault {
+
+FakeFileAccess::FakeFileAccess() = default;
+FakeFileAccess::~FakeFileAccess() = default;
+
+trusted_vault_pb::LocalTrustedVault FakeFileAccess::ReadFromDisk() {
+  return stored_data_;
+}
+void FakeFileAccess::WriteToDisk(
+    const trusted_vault_pb::LocalTrustedVault& data) {
+  stored_data_ = data;
+}
+
+void FakeFileAccess::SetStoredLocalTrustedVault(
+    const trusted_vault_pb::LocalTrustedVault& local_trusted_vault) {
+  stored_data_ = local_trusted_vault;
+}
+
+trusted_vault_pb::LocalTrustedVault FakeFileAccess::GetStoredLocalTrustedVault()
+    const {
+  return stored_data_;
+}
+
+}  // namespace trusted_vault
diff --git a/components/trusted_vault/test/fake_file_access.h b/components/trusted_vault/test/fake_file_access.h
new file mode 100644
index 0000000..2c309ae
--- /dev/null
+++ b/components/trusted_vault/test/fake_file_access.h
@@ -0,0 +1,32 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_TRUSTED_VAULT_TEST_FAKE_FILE_ACCESS_H_
+#define COMPONENTS_TRUSTED_VAULT_TEST_FAKE_FILE_ACCESS_H_
+
+#include "components/trusted_vault/standalone_trusted_vault_storage.h"
+
+namespace trusted_vault {
+
+class FakeFileAccess : public StandaloneTrustedVaultStorage::FileAccess {
+ public:
+  FakeFileAccess();
+  FakeFileAccess(const FakeFileAccess& other) = delete;
+  FakeFileAccess& operator=(const FakeFileAccess& other) = delete;
+  ~FakeFileAccess() override;
+
+  trusted_vault_pb::LocalTrustedVault ReadFromDisk() override;
+  void WriteToDisk(const trusted_vault_pb::LocalTrustedVault& data) override;
+
+  void SetStoredLocalTrustedVault(
+      const trusted_vault_pb::LocalTrustedVault& local_trusted_vault);
+  trusted_vault_pb::LocalTrustedVault GetStoredLocalTrustedVault() const;
+
+ private:
+  trusted_vault_pb::LocalTrustedVault stored_data_;
+};
+
+}  // namespace trusted_vault
+
+#endif  // COMPONENTS_TRUSTED_VAULT_TEST_FAKE_FILE_ACCESS_H_
diff --git a/components/trusted_vault/test/mock_trusted_vault_connection.cc b/components/trusted_vault/test/mock_trusted_vault_connection.cc
deleted file mode 100644
index ca5f6c7e..0000000
--- a/components/trusted_vault/test/mock_trusted_vault_connection.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/trusted_vault/test/mock_trusted_vault_connection.h"
-
-namespace trusted_vault {
-
-MockTrustedVaultConnection::MockTrustedVaultConnection() = default;
-
-MockTrustedVaultConnection::~MockTrustedVaultConnection() = default;
-
-}  // namespace trusted_vault
diff --git a/components/trusted_vault/test/mock_trusted_vault_throttling_connection.cc b/components/trusted_vault/test/mock_trusted_vault_throttling_connection.cc
new file mode 100644
index 0000000..6169f95
--- /dev/null
+++ b/components/trusted_vault/test/mock_trusted_vault_throttling_connection.cc
@@ -0,0 +1,15 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/trusted_vault/test/mock_trusted_vault_throttling_connection.h"
+
+namespace trusted_vault {
+
+MockTrustedVaultThrottlingConnection::MockTrustedVaultThrottlingConnection() =
+    default;
+
+MockTrustedVaultThrottlingConnection::~MockTrustedVaultThrottlingConnection() =
+    default;
+
+}  // namespace trusted_vault
diff --git a/components/trusted_vault/test/mock_trusted_vault_connection.h b/components/trusted_vault/test/mock_trusted_vault_throttling_connection.h
similarity index 70%
rename from components/trusted_vault/test/mock_trusted_vault_connection.h
rename to components/trusted_vault/test/mock_trusted_vault_throttling_connection.h
index 006ce759..250eae1 100644
--- a/components/trusted_vault/test/mock_trusted_vault_connection.h
+++ b/components/trusted_vault/test/mock_trusted_vault_throttling_connection.h
@@ -1,24 +1,25 @@
-// Copyright 2024 The Chromium Authors
+// Copyright 2025 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_TRUSTED_VAULT_TEST_MOCK_TRUSTED_VAULT_CONNECTION_H_
-#define COMPONENTS_TRUSTED_VAULT_TEST_MOCK_TRUSTED_VAULT_CONNECTION_H_
+#ifndef COMPONENTS_TRUSTED_VAULT_TEST_MOCK_TRUSTED_VAULT_THROTTLING_CONNECTION_H_
+#define COMPONENTS_TRUSTED_VAULT_TEST_MOCK_TRUSTED_VAULT_THROTTLING_CONNECTION_H_
 
 #include <memory>
 
 #include "base/functional/callback.h"
 #include "components/signin/public/identity_manager/account_info.h"
 #include "components/trusted_vault/securebox.h"
-#include "components/trusted_vault/trusted_vault_connection.h"
+#include "components/trusted_vault/trusted_vault_throttling_connection.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace trusted_vault {
 
-class MockTrustedVaultConnection : public TrustedVaultConnection {
+class MockTrustedVaultThrottlingConnection
+    : public TrustedVaultThrottlingConnection {
  public:
-  MockTrustedVaultConnection();
-  ~MockTrustedVaultConnection() override;
+  MockTrustedVaultThrottlingConnection();
+  ~MockTrustedVaultThrottlingConnection() override;
   MOCK_METHOD(std::unique_ptr<Request>,
               RegisterAuthenticationFactor,
               (const CoreAccountInfo& account_info,
@@ -52,8 +53,16 @@
                DownloadAuthenticationFactorsRegistrationStateCallback callback,
                base::RepeatingClosure keep_alive_callback),
               (override));
+  MOCK_METHOD(bool,
+              AreRequestsThrottled,
+              (const CoreAccountInfo& account_info),
+              (override));
+  MOCK_METHOD(void,
+              RecordFailedRequestForThrottling,
+              (const CoreAccountInfo& account_info),
+              (override));
 };
 
 }  // namespace trusted_vault
 
-#endif  // COMPONENTS_TRUSTED_VAULT_TEST_MOCK_TRUSTED_VAULT_CONNECTION_H_
+#endif  // COMPONENTS_TRUSTED_VAULT_TEST_MOCK_TRUSTED_VAULT_THROTTLING_CONNECTION_H_
diff --git a/components/trusted_vault/trusted_vault_degraded_recoverability_handler_unittest.cc b/components/trusted_vault/trusted_vault_degraded_recoverability_handler_unittest.cc
index f3e28f5..3aaa7e8e 100644
--- a/components/trusted_vault/trusted_vault_degraded_recoverability_handler_unittest.cc
+++ b/components/trusted_vault/trusted_vault_degraded_recoverability_handler_unittest.cc
@@ -18,7 +18,7 @@
 #include "components/trusted_vault/proto/local_trusted_vault.pb.h"
 #include "components/trusted_vault/proto_time_conversion.h"
 #include "components/trusted_vault/securebox.h"
-#include "components/trusted_vault/test/mock_trusted_vault_connection.h"
+#include "components/trusted_vault/test/mock_trusted_vault_throttling_connection.h"
 #include "components/trusted_vault/trusted_vault_connection.h"
 #include "google_apis/gaia/gaia_id.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -86,7 +86,7 @@
 TEST_F(TrustedVaultDegradedRecoverabilityHandlerTest,
        ShouldRecordTheDegradedRecoverabilityValueOnStart) {
   base::HistogramTester histogram_tester;
-  testing::NiceMock<MockTrustedVaultConnection> connection;
+  testing::NiceMock<MockTrustedVaultThrottlingConnection> connection;
   testing::NiceMock<MockDelegate> delegate;
   trusted_vault_pb::LocalTrustedVaultDegradedRecoverabilityState
       degraded_recoverability_state;
@@ -112,7 +112,7 @@
 
 TEST_F(TrustedVaultDegradedRecoverabilityHandlerTest,
        ShouldPendTheCallbackUntilTheFirstRefreshIsCalled) {
-  testing::NiceMock<MockTrustedVaultConnection> connection;
+  testing::NiceMock<MockTrustedVaultThrottlingConnection> connection;
   testing::NiceMock<MockDelegate> delegate;
 
   // Passing empty LocalDegradedRecoverability state indicates that this is the
@@ -126,8 +126,8 @@
   EXPECT_CALL(connection, DownloadIsRecoverabilityDegraded(
                               Eq(MakeAccountInfoWithGaiaId("user")), _))
       .WillOnce([&](const CoreAccountInfo&,
-                    MockTrustedVaultConnection::IsRecoverabilityDegradedCallback
-                        callback) {
+                    MockTrustedVaultThrottlingConnection::
+                        IsRecoverabilityDegradedCallback callback) {
         std::move(callback).Run(TrustedVaultRecoverabilityStatus::kDegraded);
         return std::make_unique<TrustedVaultConnection::Request>();
       });
@@ -140,7 +140,7 @@
        ShouldInvokeTheCallbackImmediatelyWhenTheFirstRefreshIsAlreadyCalled) {
   // Note: The first Refresh() could already be happened on a previous handler
   // instance.
-  testing::NiceMock<MockTrustedVaultConnection> connection;
+  testing::NiceMock<MockTrustedVaultThrottlingConnection> connection;
   testing::NiceMock<MockDelegate> delegate;
   trusted_vault_pb::LocalTrustedVaultDegradedRecoverabilityState
       degraded_recoverability_state;
@@ -163,17 +163,15 @@
 TEST_F(TrustedVaultDegradedRecoverabilityHandlerTest,
        ShouldRefreshImmediatelyAndRecordTheReason) {
   base::HistogramTester histogram_tester;
-  testing::NiceMock<MockTrustedVaultConnection> connection;
+  testing::NiceMock<MockTrustedVaultThrottlingConnection> connection;
   ON_CALL(connection, DownloadIsRecoverabilityDegraded(
                           Eq(MakeAccountInfoWithGaiaId("user")), _))
-      .WillByDefault(
-          [&](const CoreAccountInfo&,
-              MockTrustedVaultConnection::IsRecoverabilityDegradedCallback
-                  callback) {
-            std::move(callback).Run(
-                TrustedVaultRecoverabilityStatus::kNotDegraded);
-            return std::make_unique<TrustedVaultConnection::Request>();
-          });
+      .WillByDefault([&](const CoreAccountInfo&,
+                         MockTrustedVaultThrottlingConnection::
+                             IsRecoverabilityDegradedCallback callback) {
+        std::move(callback).Run(TrustedVaultRecoverabilityStatus::kNotDegraded);
+        return std::make_unique<TrustedVaultConnection::Request>();
+      });
   testing::NiceMock<MockDelegate> delegate;
 
   // Passing empty LocalDegradedRecoverability state indicates that this is the
@@ -202,7 +200,7 @@
 
 TEST_F(TrustedVaultDegradedRecoverabilityHandlerTest,
        ShouldRefreshOncePerShortPeriod) {
-  testing::NiceMock<MockTrustedVaultConnection> connection;
+  testing::NiceMock<MockTrustedVaultThrottlingConnection> connection;
   testing::NiceMock<MockDelegate> delegate;
   trusted_vault_pb::LocalTrustedVaultDegradedRecoverabilityState
       degraded_recoverability_state;
@@ -226,7 +224,7 @@
 
 TEST_F(TrustedVaultDegradedRecoverabilityHandlerTest,
        ShouldRefreshOncePerLongPeriod) {
-  testing::NiceMock<MockTrustedVaultConnection> connection;
+  testing::NiceMock<MockTrustedVaultThrottlingConnection> connection;
   testing::NiceMock<MockDelegate> delegate;
   trusted_vault_pb::LocalTrustedVaultDegradedRecoverabilityState
       degraded_recoverability_state;
@@ -255,7 +253,7 @@
 
 TEST_F(TrustedVaultDegradedRecoverabilityHandlerTest,
        ShouldSwitchToShortPeriod) {
-  testing::NiceMock<MockTrustedVaultConnection> connection;
+  testing::NiceMock<MockTrustedVaultThrottlingConnection> connection;
   testing::NiceMock<MockDelegate> delegate;
 
   // Passing empty LocalDegradedRecoverability state indicates that this is the
@@ -269,8 +267,8 @@
   EXPECT_CALL(connection, DownloadIsRecoverabilityDegraded(
                               Eq(MakeAccountInfoWithGaiaId("user")), _))
       .WillOnce([&](const CoreAccountInfo&,
-                    MockTrustedVaultConnection::IsRecoverabilityDegradedCallback
-                        callback) {
+                    MockTrustedVaultThrottlingConnection::
+                        IsRecoverabilityDegradedCallback callback) {
         std::move(callback).Run(TrustedVaultRecoverabilityStatus::kDegraded);
         return std::make_unique<TrustedVaultConnection::Request>();
       });
@@ -289,7 +287,7 @@
 
 TEST_F(TrustedVaultDegradedRecoverabilityHandlerTest,
        ShouldSwitchToLongPeriod) {
-  testing::NiceMock<MockTrustedVaultConnection> connection;
+  testing::NiceMock<MockTrustedVaultThrottlingConnection> connection;
   testing::NiceMock<MockDelegate> delegate;
   trusted_vault_pb::LocalTrustedVaultDegradedRecoverabilityState
       degraded_recoverability_state;
@@ -309,8 +307,8 @@
   EXPECT_CALL(connection, DownloadIsRecoverabilityDegraded(
                               Eq(MakeAccountInfoWithGaiaId("user")), _))
       .WillOnce([&](const CoreAccountInfo&,
-                    MockTrustedVaultConnection::IsRecoverabilityDegradedCallback
-                        callback) {
+                    MockTrustedVaultThrottlingConnection::
+                        IsRecoverabilityDegradedCallback callback) {
         std::move(callback).Run(TrustedVaultRecoverabilityStatus::kNotDegraded);
         return std::make_unique<TrustedVaultConnection::Request>();
       });
@@ -336,17 +334,15 @@
 
 TEST_F(TrustedVaultDegradedRecoverabilityHandlerTest,
        ShouldWriteTheStateImmediatelyWithRecoverabilityDegradedAndCurrentTime) {
-  testing::NiceMock<MockTrustedVaultConnection> connection;
+  testing::NiceMock<MockTrustedVaultThrottlingConnection> connection;
   ON_CALL(connection, DownloadIsRecoverabilityDegraded(
                           Eq(MakeAccountInfoWithGaiaId("user")), _))
-      .WillByDefault(
-          [&](const CoreAccountInfo&,
-              MockTrustedVaultConnection::IsRecoverabilityDegradedCallback
-                  callback) {
-            std::move(callback).Run(
-                TrustedVaultRecoverabilityStatus::kNotDegraded);
-            return std::make_unique<TrustedVaultConnection::Request>();
-          });
+      .WillByDefault([&](const CoreAccountInfo&,
+                         MockTrustedVaultThrottlingConnection::
+                             IsRecoverabilityDegradedCallback callback) {
+        std::move(callback).Run(TrustedVaultRecoverabilityStatus::kNotDegraded);
+        return std::make_unique<TrustedVaultConnection::Request>();
+      });
   testing::NiceMock<MockDelegate> delegate;
 
   // Passing empty LocalDegradedRecoverability state indicates that this is the
@@ -373,8 +369,8 @@
   EXPECT_CALL(connection, DownloadIsRecoverabilityDegraded(
                               Eq(MakeAccountInfoWithGaiaId("user")), _))
       .WillOnce([&](const CoreAccountInfo&,
-                    MockTrustedVaultConnection::IsRecoverabilityDegradedCallback
-                        callback) {
+                    MockTrustedVaultThrottlingConnection::
+                        IsRecoverabilityDegradedCallback callback) {
         std::move(callback).Run(TrustedVaultRecoverabilityStatus::kDegraded);
         return std::make_unique<TrustedVaultConnection::Request>();
       });
@@ -388,17 +384,15 @@
 TEST_F(
     TrustedVaultDegradedRecoverabilityHandlerTest,
     ShouldWriteTheStateImmediatelyWithRecoverabilityNotDegradedAndCurrentTime) {
-  testing::NiceMock<MockTrustedVaultConnection> connection;
+  testing::NiceMock<MockTrustedVaultThrottlingConnection> connection;
   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>();
-          });
+      .WillByDefault([&](const CoreAccountInfo&,
+                         MockTrustedVaultThrottlingConnection::
+                             IsRecoverabilityDegradedCallback callback) {
+        std::move(callback).Run(TrustedVaultRecoverabilityStatus::kDegraded);
+        return std::make_unique<TrustedVaultConnection::Request>();
+      });
   testing::NiceMock<MockDelegate> delegate;
 
   // Passing empty LocalDegradedRecoverability state indicates that this is the
@@ -425,8 +419,8 @@
   EXPECT_CALL(connection, DownloadIsRecoverabilityDegraded(
                               Eq(MakeAccountInfoWithGaiaId("user")), _))
       .WillOnce([&](const CoreAccountInfo&,
-                    MockTrustedVaultConnection::IsRecoverabilityDegradedCallback
-                        callback) {
+                    MockTrustedVaultThrottlingConnection::
+                        IsRecoverabilityDegradedCallback callback) {
         std::move(callback).Run(TrustedVaultRecoverabilityStatus::kNotDegraded);
         return std::make_unique<TrustedVaultConnection::Request>();
       });
@@ -439,7 +433,7 @@
 
 TEST_F(TrustedVaultDegradedRecoverabilityHandlerTest,
        ShouldComputeTheNextRefreshTimeBasedOnTheStoredState) {
-  testing::NiceMock<MockTrustedVaultConnection> connection;
+  testing::NiceMock<MockTrustedVaultThrottlingConnection> connection;
   testing::NiceMock<MockDelegate> delegate;
   trusted_vault_pb::LocalTrustedVaultDegradedRecoverabilityState
       degraded_recoverability_state;
@@ -460,7 +454,7 @@
 
 TEST_F(TrustedVaultDegradedRecoverabilityHandlerTest,
        ShouldRecordDegradedRecoverabilityStatusOnRequestCompletion) {
-  testing::NiceMock<MockTrustedVaultConnection> connection;
+  testing::NiceMock<MockTrustedVaultThrottlingConnection> connection;
   testing::NiceMock<MockDelegate> delegate;
 
   // Start the handler, this will trigger the first request.
@@ -473,15 +467,14 @@
     base::RunLoop run_loop;
     ON_CALL(connection, DownloadIsRecoverabilityDegraded(
                             Eq(MakeAccountInfoWithGaiaId("user")), _))
-        .WillByDefault(
-            [&](const CoreAccountInfo&,
-                MockTrustedVaultConnection::IsRecoverabilityDegradedCallback
-                    callback) {
-              std::move(callback).Run(
-                  TrustedVaultRecoverabilityStatus::kNotDegraded);
-              run_loop.Quit();
-              return std::make_unique<TrustedVaultConnection::Request>();
-            });
+        .WillByDefault([&](const CoreAccountInfo&,
+                           MockTrustedVaultThrottlingConnection::
+                               IsRecoverabilityDegradedCallback callback) {
+          std::move(callback).Run(
+              TrustedVaultRecoverabilityStatus::kNotDegraded);
+          run_loop.Quit();
+          return std::make_unique<TrustedVaultConnection::Request>();
+        });
 
     base::HistogramTester histogram_tester;
     // This will start the handler and trigger the first request.
@@ -499,15 +492,13 @@
     base::RunLoop run_loop;
     ON_CALL(connection, DownloadIsRecoverabilityDegraded(
                             Eq(MakeAccountInfoWithGaiaId("user")), _))
-        .WillByDefault(
-            [&](const CoreAccountInfo&,
-                MockTrustedVaultConnection::IsRecoverabilityDegradedCallback
-                    callback) {
-              std::move(callback).Run(
-                  TrustedVaultRecoverabilityStatus::kDegraded);
-              run_loop.Quit();
-              return std::make_unique<TrustedVaultConnection::Request>();
-            });
+        .WillByDefault([&](const CoreAccountInfo&,
+                           MockTrustedVaultThrottlingConnection::
+                               IsRecoverabilityDegradedCallback callback) {
+          std::move(callback).Run(TrustedVaultRecoverabilityStatus::kDegraded);
+          run_loop.Quit();
+          return std::make_unique<TrustedVaultConnection::Request>();
+        });
 
     base::HistogramTester histogram_tester;
     // This will force a request.
@@ -525,14 +516,13 @@
     base::RunLoop run_loop;
     ON_CALL(connection, DownloadIsRecoverabilityDegraded(
                             Eq(MakeAccountInfoWithGaiaId("user")), _))
-        .WillByDefault(
-            [&](const CoreAccountInfo&,
-                MockTrustedVaultConnection::IsRecoverabilityDegradedCallback
-                    callback) {
-              std::move(callback).Run(TrustedVaultRecoverabilityStatus::kError);
-              run_loop.Quit();
-              return std::make_unique<TrustedVaultConnection::Request>();
-            });
+        .WillByDefault([&](const CoreAccountInfo&,
+                           MockTrustedVaultThrottlingConnection::
+                               IsRecoverabilityDegradedCallback callback) {
+          std::move(callback).Run(TrustedVaultRecoverabilityStatus::kError);
+          run_loop.Quit();
+          return std::make_unique<TrustedVaultConnection::Request>();
+        });
 
     base::HistogramTester histogram_tester;
     // This will force a request.
diff --git a/components/trusted_vault/trusted_vault_throttling_connection.h b/components/trusted_vault/trusted_vault_throttling_connection.h
new file mode 100644
index 0000000..271e144
--- /dev/null
+++ b/components/trusted_vault/trusted_vault_throttling_connection.h
@@ -0,0 +1,39 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_TRUSTED_VAULT_TRUSTED_VAULT_THROTTLING_CONNECTION_H_
+#define COMPONENTS_TRUSTED_VAULT_TRUSTED_VAULT_THROTTLING_CONNECTION_H_
+
+#include "components/signin/public/identity_manager/account_info.h"
+#include "components/trusted_vault/trusted_vault_connection.h"
+
+namespace trusted_vault {
+
+// Extends the `TrustedVaultConnection` interface by client side throttling.
+class TrustedVaultThrottlingConnection : public TrustedVaultConnection {
+ public:
+  TrustedVaultThrottlingConnection() = default;
+  TrustedVaultThrottlingConnection(
+      const TrustedVaultThrottlingConnection& other) = delete;
+  TrustedVaultThrottlingConnection& operator=(
+      const TrustedVaultThrottlingConnection& other) = delete;
+  ~TrustedVaultThrottlingConnection() override = default;
+
+  // Returns true if the last failed request time implies that upcoming requests
+  // should be throttled now (certain amount of time should pass since the last
+  // failed request). Handles the situation when last failed request time is
+  // set to the future.
+  //
+  // Note: It's the clients responsibility to not make any requests to this
+  // connection if this method returns true. Such requests would not be blocked.
+  virtual bool AreRequestsThrottled(const CoreAccountInfo& account_info) = 0;
+  // Records request failure time, that will be used to determine whether new
+  // requests should be throttled.
+  virtual void RecordFailedRequestForThrottling(
+      const CoreAccountInfo& account_info) = 0;
+};
+
+}  // namespace trusted_vault
+
+#endif  // COMPONENTS_TRUSTED_VAULT_TRUSTED_VAULT_THROTTLING_CONNECTION_H_
diff --git a/components/trusted_vault/trusted_vault_throttling_connection_impl.cc b/components/trusted_vault/trusted_vault_throttling_connection_impl.cc
new file mode 100644
index 0000000..87e17e7
--- /dev/null
+++ b/components/trusted_vault/trusted_vault_throttling_connection_impl.cc
@@ -0,0 +1,126 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/trusted_vault/trusted_vault_throttling_connection_impl.h"
+
+#include <cstddef>
+#include <memory>
+
+#include "base/memory/ptr_util.h"
+#include "base/time/clock.h"
+#include "base/time/default_clock.h"
+#include "components/trusted_vault/proto_time_conversion.h"
+#include "components/trusted_vault/securebox.h"
+
+namespace trusted_vault {
+
+TrustedVaultThrottlingConnectionImpl::TrustedVaultThrottlingConnectionImpl(
+    std::unique_ptr<TrustedVaultConnection> delegate,
+    raw_ptr<StandaloneTrustedVaultStorage> storage)
+    : TrustedVaultThrottlingConnectionImpl(std::move(delegate),
+                                           storage,
+                                           base::DefaultClock::GetInstance()) {}
+
+TrustedVaultThrottlingConnectionImpl::TrustedVaultThrottlingConnectionImpl(
+    std::unique_ptr<TrustedVaultConnection> delegate,
+    raw_ptr<StandaloneTrustedVaultStorage> storage,
+    raw_ptr<base::Clock> clock)
+    : delegate_(std::move(delegate)), storage_(storage), clock_(clock) {
+  CHECK(delegate_);
+  CHECK(storage_);
+  CHECK(clock_);
+}
+
+// static
+std::unique_ptr<TrustedVaultThrottlingConnectionImpl>
+TrustedVaultThrottlingConnectionImpl::CreateForTesting(
+    std::unique_ptr<TrustedVaultConnection> delegate,
+    raw_ptr<StandaloneTrustedVaultStorage> storage,
+    raw_ptr<base::Clock> clock) {
+  return base::WrapUnique(new TrustedVaultThrottlingConnectionImpl(
+      std::move(delegate), storage, clock));
+}
+
+TrustedVaultThrottlingConnectionImpl::~TrustedVaultThrottlingConnectionImpl() =
+    default;
+
+bool TrustedVaultThrottlingConnectionImpl::AreRequestsThrottled(
+    const CoreAccountInfo& account_info) {
+  auto* per_user_vault = storage_->FindUserVault(account_info.gaia);
+  CHECK(per_user_vault);
+
+  const base::Time current_time = clock_->Now();
+  base::Time last_failed_request_time = ProtoTimeToTime(
+      per_user_vault->last_failed_request_millis_since_unix_epoch());
+
+  // Fix |last_failed_request_time| if it's set to the future.
+  if (last_failed_request_time > current_time) {
+    // Immediately unthrottle, but don't write new state to the file.
+    last_failed_request_time = base::Time();
+  }
+
+  return last_failed_request_time + kThrottlingDuration > current_time;
+}
+
+void TrustedVaultThrottlingConnectionImpl::RecordFailedRequestForThrottling(
+    const CoreAccountInfo& account_info) {
+  auto* per_user_vault = storage_->FindUserVault(account_info.gaia);
+  CHECK(per_user_vault);
+
+  per_user_vault->set_last_failed_request_millis_since_unix_epoch(
+      TimeToProtoTime(clock_->Now()));
+  storage_->WriteDataToDisk();
+}
+
+std::unique_ptr<TrustedVaultConnection::Request>
+TrustedVaultThrottlingConnectionImpl::RegisterAuthenticationFactor(
+    const CoreAccountInfo& account_info,
+    const MemberKeysSource& member_keys_source,
+    const SecureBoxPublicKey& authentication_factor_public_key,
+    AuthenticationFactorType authentication_factor_type,
+    RegisterAuthenticationFactorCallback callback) {
+  return delegate_->RegisterAuthenticationFactor(
+      account_info, member_keys_source, authentication_factor_public_key,
+      authentication_factor_type, std::move(callback));
+}
+
+std::unique_ptr<TrustedVaultConnection::Request>
+TrustedVaultThrottlingConnectionImpl::RegisterLocalDeviceWithoutKeys(
+    const CoreAccountInfo& account_info,
+    const SecureBoxPublicKey& device_public_key,
+    RegisterAuthenticationFactorCallback callback) {
+  return delegate_->RegisterLocalDeviceWithoutKeys(
+      account_info, device_public_key, std::move(callback));
+}
+
+std::unique_ptr<TrustedVaultConnection::Request>
+TrustedVaultThrottlingConnectionImpl::DownloadNewKeys(
+    const CoreAccountInfo& account_info,
+    const TrustedVaultKeyAndVersion& last_trusted_vault_key_and_version,
+    std::unique_ptr<SecureBoxKeyPair> device_key_pair,
+    DownloadNewKeysCallback callback) {
+  return delegate_->DownloadNewKeys(
+      account_info, last_trusted_vault_key_and_version,
+      std::move(device_key_pair), std::move(callback));
+}
+
+std::unique_ptr<TrustedVaultConnection::Request>
+TrustedVaultThrottlingConnectionImpl::DownloadIsRecoverabilityDegraded(
+    const CoreAccountInfo& account_info,
+    IsRecoverabilityDegradedCallback callback) {
+  return delegate_->DownloadIsRecoverabilityDegraded(account_info,
+                                                     std::move(callback));
+}
+
+std::unique_ptr<TrustedVaultConnection::Request>
+TrustedVaultThrottlingConnectionImpl::
+    DownloadAuthenticationFactorsRegistrationState(
+        const CoreAccountInfo& account_info,
+        DownloadAuthenticationFactorsRegistrationStateCallback callback,
+        base::RepeatingClosure keep_alive_callback) {
+  return delegate_->DownloadAuthenticationFactorsRegistrationState(
+      account_info, std::move(callback), keep_alive_callback);
+}
+
+}  // namespace trusted_vault
diff --git a/components/trusted_vault/trusted_vault_throttling_connection_impl.h b/components/trusted_vault/trusted_vault_throttling_connection_impl.h
new file mode 100644
index 0000000..1749ce0
--- /dev/null
+++ b/components/trusted_vault/trusted_vault_throttling_connection_impl.h
@@ -0,0 +1,94 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_TRUSTED_VAULT_TRUSTED_VAULT_THROTTLING_CONNECTION_IMPL_H_
+#define COMPONENTS_TRUSTED_VAULT_TRUSTED_VAULT_THROTTLING_CONNECTION_IMPL_H_
+
+#include <memory>
+
+#include "base/time/clock.h"
+#include "components/signin/public/identity_manager/account_info.h"
+#include "components/trusted_vault/standalone_trusted_vault_storage.h"
+#include "components/trusted_vault/trusted_vault_access_token_fetcher.h"
+#include "components/trusted_vault/trusted_vault_connection.h"
+#include "components/trusted_vault/trusted_vault_throttling_connection.h"
+
+namespace trusted_vault {
+
+enum class SecurityDomainId;
+
+class TrustedVaultThrottlingConnectionImpl
+    : public TrustedVaultThrottlingConnection {
+ public:
+  // `storage` is guaranteed to outlive this object.
+  TrustedVaultThrottlingConnectionImpl(
+      std::unique_ptr<TrustedVaultConnection> delegate,
+      raw_ptr<StandaloneTrustedVaultStorage> storage);
+
+  TrustedVaultThrottlingConnectionImpl(
+      const TrustedVaultThrottlingConnectionImpl& other) = delete;
+  TrustedVaultThrottlingConnectionImpl& operator=(
+      const TrustedVaultThrottlingConnectionImpl& other) = delete;
+  ~TrustedVaultThrottlingConnectionImpl() override;
+
+  bool AreRequestsThrottled(const CoreAccountInfo& account_info) override;
+  void RecordFailedRequestForThrottling(
+      const CoreAccountInfo& account_info) override;
+
+  std::unique_ptr<Request> RegisterAuthenticationFactor(
+      const CoreAccountInfo& account_info,
+      const MemberKeysSource& member_keys_source,
+      const SecureBoxPublicKey& authentication_factor_public_key,
+      AuthenticationFactorType authentication_factor_type,
+      RegisterAuthenticationFactorCallback callback) override;
+
+  std::unique_ptr<Request> RegisterLocalDeviceWithoutKeys(
+      const CoreAccountInfo& account_info,
+      const SecureBoxPublicKey& device_public_key,
+      RegisterAuthenticationFactorCallback callback) override;
+
+  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;
+
+  std::unique_ptr<Request> DownloadIsRecoverabilityDegraded(
+      const CoreAccountInfo& account_info,
+      IsRecoverabilityDegradedCallback callback) override;
+
+  std::unique_ptr<TrustedVaultConnection::Request>
+  DownloadAuthenticationFactorsRegistrationState(
+      const CoreAccountInfo& account_info,
+      DownloadAuthenticationFactorsRegistrationStateCallback callback,
+      base::RepeatingClosure keep_alive_callback) override;
+
+  // Specifies how long requests shouldn't be retried after encountering
+  // transient error. Note, that this doesn't affect requests related to
+  // degraded recoverability.
+  // Exposed for testing.
+  static constexpr base::TimeDelta kThrottlingDuration = base::Days(1);
+
+  static std::unique_ptr<TrustedVaultThrottlingConnectionImpl> CreateForTesting(
+      std::unique_ptr<TrustedVaultConnection> delegate,
+      raw_ptr<StandaloneTrustedVaultStorage> storage,
+      raw_ptr<base::Clock> clock);
+
+ private:
+  TrustedVaultThrottlingConnectionImpl(
+      std::unique_ptr<TrustedVaultConnection> delegate,
+      raw_ptr<StandaloneTrustedVaultStorage> storage,
+      raw_ptr<base::Clock> clock);
+
+  const std::unique_ptr<TrustedVaultConnection> delegate_;
+  const raw_ptr<StandaloneTrustedVaultStorage> storage_;
+
+  // Used to determine current time, set to base::DefaultClock in prod and can
+  // be overridden in tests.
+  const raw_ptr<base::Clock> clock_;
+};
+
+}  // namespace trusted_vault
+
+#endif  // COMPONENTS_TRUSTED_VAULT_TRUSTED_VAULT_THROTTLING_CONNECTION_IMPL_H_
diff --git a/components/trusted_vault/trusted_vault_throttling_connection_impl_unittest.cc b/components/trusted_vault/trusted_vault_throttling_connection_impl_unittest.cc
new file mode 100644
index 0000000..8a1b825
--- /dev/null
+++ b/components/trusted_vault/trusted_vault_throttling_connection_impl_unittest.cc
@@ -0,0 +1,211 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/trusted_vault/trusted_vault_throttling_connection_impl.h"
+
+#include <memory>
+
+#include "base/functional/callback_helpers.h"
+#include "base/test/simple_test_clock.h"
+#include "components/trusted_vault/standalone_trusted_vault_storage.h"
+#include "components/trusted_vault/test/fake_file_access.h"
+#include "components/trusted_vault/test/mock_trusted_vault_throttling_connection.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace trusted_vault {
+
+namespace {
+
+using testing::InvokeWithoutArgs;
+using testing::NiceMock;
+using testing::NotNull;
+
+class TrustedVaultThrottlingConnectionImplTest : public testing::Test {
+ public:
+  TrustedVaultThrottlingConnectionImplTest() {
+    clock_.SetNow(base::Time::Now());
+    ResetThrottlingConnection();
+  }
+
+  void ResetThrottlingConnection() {
+    // Destroy `throttling_connection_`, otherwise it would hold a reference to
+    // `storage_` which is destroyed before `throttling_connection_` below.
+    // Also, set `delegate_` to null, because it points to an object owned by
+    // `throttling_connection_`.
+    delegate_ = nullptr;
+    throttling_connection_ = nullptr;
+
+    std::unique_ptr<FakeFileAccess> file_access =
+        std::make_unique<FakeFileAccess>();
+    if (file_access_) {
+      // Retain the stored state.
+      file_access->SetStoredLocalTrustedVault(
+          file_access_->GetStoredLocalTrustedVault());
+    }
+    file_access_ = file_access.get();
+    storage_ =
+        StandaloneTrustedVaultStorage::CreateForTesting(std::move(file_access));
+    storage_->ReadDataFromDisk();
+    if (storage_->FindUserVault(account_info().gaia) == nullptr) {
+      storage_->AddUserVault(account_info().gaia);
+    }
+
+    std::unique_ptr<NiceMock<MockTrustedVaultThrottlingConnection>> delegate =
+        std::make_unique<NiceMock<MockTrustedVaultThrottlingConnection>>();
+    delegate_ = delegate.get();
+
+    throttling_connection_ =
+        TrustedVaultThrottlingConnectionImpl::CreateForTesting(
+            std::move(delegate), storage_.get(), &clock_);
+  }
+
+  ~TrustedVaultThrottlingConnectionImplTest() override = default;
+
+  MockTrustedVaultThrottlingConnection* delegate() { return delegate_; }
+
+  base::SimpleTestClock* clock() { return &clock_; }
+
+  TrustedVaultThrottlingConnectionImpl* throttling_connection() {
+    return throttling_connection_.get();
+  }
+
+  CoreAccountInfo account_info() {
+    CoreAccountInfo account_info;
+    account_info.gaia = GaiaId("user");
+    return account_info;
+  }
+
+ private:
+  base::SimpleTestClock clock_;
+  std::unique_ptr<StandaloneTrustedVaultStorage> storage_;
+  std::unique_ptr<TrustedVaultThrottlingConnectionImpl> throttling_connection_;
+  raw_ptr<NiceMock<MockTrustedVaultThrottlingConnection>> delegate_ = nullptr;
+  raw_ptr<FakeFileAccess> file_access_ = nullptr;
+};
+
+TEST_F(TrustedVaultThrottlingConnectionImplTest, ShouldNotThrottleByDefault) {
+  EXPECT_FALSE(throttling_connection()->AreRequestsThrottled(account_info()));
+}
+
+TEST_F(TrustedVaultThrottlingConnectionImplTest, FailedAttemptShouldThrottle) {
+  EXPECT_FALSE(throttling_connection()->AreRequestsThrottled(account_info()));
+
+  throttling_connection()->RecordFailedRequestForThrottling(account_info());
+
+  EXPECT_TRUE(throttling_connection()->AreRequestsThrottled(account_info()));
+}
+
+TEST_F(TrustedVaultThrottlingConnectionImplTest, ShouldRemainThrottled) {
+  // Record a failed attempt at time "now".
+  throttling_connection()->RecordFailedRequestForThrottling(account_info());
+  EXPECT_TRUE(throttling_connection()->AreRequestsThrottled(account_info()));
+
+  // Advance time to just before the throttling duration.
+  clock()->Advance(TrustedVaultThrottlingConnectionImpl::kThrottlingDuration -
+                   base::Seconds(1));
+  EXPECT_TRUE(throttling_connection()->AreRequestsThrottled(account_info()));
+}
+
+TEST_F(TrustedVaultThrottlingConnectionImplTest,
+       ShouldUnthrottleAfterThrottlingDuration) {
+  // Record a failed attempt at time "now".
+  throttling_connection()->RecordFailedRequestForThrottling(account_info());
+  EXPECT_TRUE(throttling_connection()->AreRequestsThrottled(account_info()));
+
+  // Advance time to pass the throttling duration.
+  clock()->Advance(TrustedVaultThrottlingConnectionImpl::kThrottlingDuration);
+  EXPECT_FALSE(throttling_connection()->AreRequestsThrottled(account_info()));
+}
+
+// System time can be changed to the past and if this situation not handled,
+// requests could be throttled for unreasonable amount of time.
+TEST_F(TrustedVaultThrottlingConnectionImplTest,
+       ShouldUnthrottleWhenTimeSetToPast) {
+  // Record a failed attempt at time "now".
+  throttling_connection()->RecordFailedRequestForThrottling(account_info());
+  EXPECT_TRUE(throttling_connection()->AreRequestsThrottled(account_info()));
+
+  // Mimic system set to the past, which should unthrottle automatically.
+  clock()->Advance(base::Seconds(-1));
+  EXPECT_FALSE(throttling_connection()->AreRequestsThrottled(account_info()));
+}
+
+TEST_F(TrustedVaultThrottlingConnectionImplTest, ShouldRestoreThrottlingState) {
+  // Record a failed attempt at time "now".
+  throttling_connection()->RecordFailedRequestForThrottling(account_info());
+  EXPECT_TRUE(throttling_connection()->AreRequestsThrottled(account_info()));
+
+  // Reset the connection, which restores the previously stored state.
+  ResetThrottlingConnection();
+
+  EXPECT_TRUE(throttling_connection()->AreRequestsThrottled(account_info()));
+}
+
+TEST_F(TrustedVaultThrottlingConnectionImplTest,
+       ShouldCallRegisterAuthenticationFactor) {
+  EXPECT_CALL(*delegate(), RegisterAuthenticationFactor)
+      .WillOnce(InvokeWithoutArgs([]() {
+        return std::make_unique<TrustedVaultConnection::Request>();
+      }));
+  std::unique_ptr<TrustedVaultConnection::Request> request =
+      throttling_connection()->RegisterAuthenticationFactor(
+          account_info(),
+          GetTrustedVaultKeysWithVersions(std::vector<std::vector<uint8_t>>(),
+                                          0),
+          SecureBoxKeyPair::GenerateRandom()->public_key(),
+          LocalPhysicalDevice(), base::DoNothing());
+  EXPECT_THAT(request, NotNull());
+}
+
+TEST_F(TrustedVaultThrottlingConnectionImplTest,
+       ShouldCallRegisterLocalDeviceWithoutKeys) {
+  EXPECT_CALL(*delegate(), RegisterLocalDeviceWithoutKeys)
+      .WillOnce(InvokeWithoutArgs([]() {
+        return std::make_unique<TrustedVaultConnection::Request>();
+      }));
+  std::unique_ptr<TrustedVaultConnection::Request> request =
+      throttling_connection()->RegisterLocalDeviceWithoutKeys(
+          account_info(), SecureBoxKeyPair::GenerateRandom()->public_key(),
+          base::DoNothing());
+  EXPECT_THAT(request, NotNull());
+}
+
+TEST_F(TrustedVaultThrottlingConnectionImplTest, ShouldCallDownloadNewKeys) {
+  EXPECT_CALL(*delegate(), DownloadNewKeys).WillOnce(InvokeWithoutArgs([]() {
+    return std::make_unique<TrustedVaultConnection::Request>();
+  }));
+  std::unique_ptr<TrustedVaultConnection::Request> request =
+      throttling_connection()->DownloadNewKeys(
+          account_info(), TrustedVaultKeyAndVersion(std::vector<uint8_t>(), 0),
+          SecureBoxKeyPair::GenerateRandom(), base::DoNothing());
+  EXPECT_THAT(request, NotNull());
+}
+
+TEST_F(TrustedVaultThrottlingConnectionImplTest,
+       ShouldCallDownloadIsRecoverabilityDegraded) {
+  EXPECT_CALL(*delegate(), DownloadIsRecoverabilityDegraded)
+      .WillOnce(InvokeWithoutArgs([]() {
+        return std::make_unique<TrustedVaultConnection::Request>();
+      }));
+  std::unique_ptr<TrustedVaultConnection::Request> request =
+      throttling_connection()->DownloadIsRecoverabilityDegraded(
+          account_info(), base::DoNothing());
+  EXPECT_THAT(request, NotNull());
+}
+
+TEST_F(TrustedVaultThrottlingConnectionImplTest,
+       ShouldCallDownloadAuthenticationFactorsRegistrationState) {
+  EXPECT_CALL(*delegate(), DownloadAuthenticationFactorsRegistrationState)
+      .WillOnce(InvokeWithoutArgs([]() {
+        return std::make_unique<TrustedVaultConnection::Request>();
+      }));
+  std::unique_ptr<TrustedVaultConnection::Request> request =
+      throttling_connection()->DownloadAuthenticationFactorsRegistrationState(
+          account_info(), base::DoNothing(), base::DoNothing());
+  EXPECT_THAT(request, NotNull());
+}
+
+}  // namespace
+
+}  // namespace trusted_vault
diff --git a/components/update_client/net/network_impl.cc b/components/update_client/net/network_impl.cc
index e5a61b5..47fb01b0 100644
--- a/components/update_client/net/network_impl.cc
+++ b/components/update_client/net/network_impl.cc
@@ -11,6 +11,7 @@
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
 #include "base/functional/callback_helpers.h"
+#include "base/memory/weak_ptr.h"
 #include "base/numerics/safe_conversions.h"
 #include "components/update_client/net/network_chromium.h"
 #include "net/base/load_flags.h"
@@ -132,10 +133,10 @@
   // `Content-Type` header present in the |ResourceRequest| above.
   simple_url_loader->AttachStringForUpload(post_data, content_type);
   simple_url_loader->SetOnResponseStartedCallback(base::BindOnce(
-      &NetworkFetcherImpl::OnResponseStartedCallback, base::Unretained(this),
-      std::move(response_started_callback)));
+      &NetworkFetcherImpl::OnResponseStartedCallback,
+      weak_ptr_factory_.GetWeakPtr(), std::move(response_started_callback)));
   simple_url_loader->SetOnDownloadProgressCallback(base::BindRepeating(
-      &NetworkFetcherImpl::OnProgressCallback, base::Unretained(this),
+      &NetworkFetcherImpl::OnProgressCallback, weak_ptr_factory_.GetWeakPtr(),
       std::move(progress_callback)));
   constexpr size_t kMaxResponseSize = 1024 * 1024;
   simple_url_loader->DownloadToString(
@@ -181,10 +182,10 @@
       network::SimpleURLLoader::RetryMode::RETRY_ON_NETWORK_CHANGE);
   simple_url_loader->SetAllowPartialResults(true);
   simple_url_loader->SetOnResponseStartedCallback(base::BindOnce(
-      &NetworkFetcherImpl::OnResponseStartedCallback, base::Unretained(this),
-      std::move(response_started_callback)));
+      &NetworkFetcherImpl::OnResponseStartedCallback,
+      weak_ptr_factory_.GetWeakPtr(), std::move(response_started_callback)));
   simple_url_loader->SetOnDownloadProgressCallback(base::BindRepeating(
-      &NetworkFetcherImpl::OnProgressCallback, base::Unretained(this),
+      &NetworkFetcherImpl::OnProgressCallback, weak_ptr_factory_.GetWeakPtr(),
       std::move(progress_callback)));
   simple_url_loader->DownloadToFile(
       shared_url_network_factory_.get(),
diff --git a/components/update_client/net/network_impl.h b/components/update_client/net/network_impl.h
index 9313073..df7c032 100644
--- a/components/update_client/net/network_impl.h
+++ b/components/update_client/net/network_impl.h
@@ -12,6 +12,7 @@
 
 #include "base/functional/callback_forward.h"
 #include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
 #include "components/update_client/net/network_chromium.h"
 #include "components/update_client/network.h"
 #include "services/network/public/mojom/url_response_head.mojom-forward.h"
@@ -63,6 +64,7 @@
 
   scoped_refptr<network::SharedURLLoaderFactory> shared_url_network_factory_;
   SendCookiesPredicate cookie_predicate_;
+  base::WeakPtrFactory<NetworkFetcherImpl> weak_ptr_factory_{this};
 };
 
 }  // namespace update_client
diff --git a/components/update_client/update_client.cc b/components/update_client/update_client.cc
index e48cc05..f204c6b9 100644
--- a/components/update_client/update_client.cc
+++ b/components/update_client/update_client.cc
@@ -17,6 +17,7 @@
 #include "base/functional/callback.h"
 #include "base/location.h"
 #include "base/logging.h"
+#include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 #include "base/sequence_checker.h"
 #include "base/task/sequenced_task_runner.h"
@@ -67,14 +68,12 @@
     scoped_refptr<Configurator> config,
     scoped_refptr<PingManager> ping_manager,
     UpdateChecker::Factory update_checker_factory)
-    : config_(config),
-      ping_manager_(ping_manager),
-      update_engine_(base::MakeRefCounted<UpdateEngine>(
-          config,
-          update_checker_factory,
-          ping_manager_.get(),
-          base::BindRepeating(&UpdateClientImpl::NotifyObservers,
-                              base::Unretained(this)))) {}
+    : config_(config), ping_manager_(ping_manager) {
+  update_engine_ = base::MakeRefCounted<UpdateEngine>(
+      config, update_checker_factory, ping_manager_.get(),
+      base::BindRepeating(&UpdateClientImpl::NotifyObservers,
+                          weak_ptr_factory_.GetWeakPtr()));
+}
 
 UpdateClientImpl::~UpdateClientImpl() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/components/update_client/update_client_internal.h b/components/update_client/update_client_internal.h
index aac915c..d596e2e 100644
--- a/components/update_client/update_client_internal.h
+++ b/components/update_client/update_client_internal.h
@@ -13,6 +13,7 @@
 #include "base/containers/circular_deque.h"
 #include "base/functional/callback_forward.h"
 #include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 #include "base/sequence_checker.h"
 #include "components/update_client/crx_downloader.h"
@@ -92,6 +93,7 @@
   scoped_refptr<PingManager> ping_manager_;
   scoped_refptr<UpdateEngine> update_engine_;
   base::ObserverList<Observer>::Unchecked observer_list_;
+  base::WeakPtrFactory<UpdateClientImpl> weak_ptr_factory_{this};
 };
 
 }  // namespace update_client
diff --git a/components/viz/common/features.cc b/components/viz/common/features.cc
index e463f158..486cef1 100644
--- a/components/viz/common/features.cc
+++ b/components/viz/common/features.cc
@@ -638,12 +638,13 @@
 bool ShouldRemoveRedirectionBitmap() {
   // Redirection bitmap should not be removed if Direct Composition is
   // disabled. On devices with DComp disabled, ANGLE draws to the redirection
-  // bitmap via a blit swap chain. DWM_SYSTEMBACKDROP_TYPE is only available
-  // on Win11 22H2+, therefore limit the bitmap removal to those versions or
-  // higher so that an appropriate background replacement is available.
+  // bitmap via a blit swap chain. Windows.UI.Composition DesktopWindowTarget
+  // is supported on on Win10 version 1511 and higher, therefore limit the
+  // bitmap removal to those versions or higher so that an appropriate
+  // background replacement is available.
   // Note: the disable-direct-composition command line check is a workaround for
   // https://crbug.com/40276881.
-  return base::win::GetVersion() >= base::win::Version::WIN11_22H2 &&
+  return base::win::GetVersion() >= base::win::Version::WIN10_RS4 &&
          !base::CommandLine::ForCurrentProcess()->HasSwitch(
              switches::kDisableDirectComposition) &&
          base::FeatureList::IsEnabled(kRemoveRedirectionBitmap);
diff --git a/components/viz/common/resources/peak_gpu_memory_callback.cc b/components/viz/common/resources/peak_gpu_memory_callback.cc
index 3ef88e1d..3a54dff 100644
--- a/components/viz/common/resources/peak_gpu_memory_callback.cc
+++ b/components/viz/common/resources/peak_gpu_memory_callback.cc
@@ -2,14 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/342213636): Remove this and spanify to fix the errors.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "components/viz/common/resources/peak_gpu_memory_callback.h"
 
 #include <memory>
+#include <string>
+#include <utility>
 
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
diff --git a/components/viz/common/resources/resource_sizes_unittest.cc b/components/viz/common/resources/resource_sizes_unittest.cc
index bcc5f5e8..632afac 100644
--- a/components/viz/common/resources/resource_sizes_unittest.cc
+++ b/components/viz/common/resources/resource_sizes_unittest.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
-#pragma allow_unsafe_buffers
-#endif
-
 #include <stddef.h>
 
 #include "components/viz/common/resources/resource_sizes.h"
@@ -22,33 +17,31 @@
   size_t expected_bytes_aligned;
 };
 
-// Modify this constant as per TestFormat variables defined in following tests.
-const int kTestFormats = 4;
-
 class ResourceUtilTest : public testing::Test {
  public:
-  void TestCheckedWidthInBytes(int width, const TestFormat* test_formats) {
-    for (int i = 0; i < kTestFormats; ++i) {
-      size_t bytes = ResourceSizes::CheckedWidthInBytes<size_t>(
-          width, test_formats[i].format);
-      EXPECT_EQ(bytes, test_formats[i].expected_bytes);
+  void TestCheckedWidthInBytes(int width, base::span<TestFormat> test_formats) {
+    for (auto& test_format : test_formats) {
+      size_t bytes =
+          ResourceSizes::CheckedWidthInBytes<size_t>(width, test_format.format);
+      EXPECT_EQ(bytes, test_format.expected_bytes);
     }
   }
 
-  void TestUncheckedWidthInBytes(int width, const TestFormat* test_formats) {
-    for (int i = 0; i < kTestFormats; ++i) {
+  void TestUncheckedWidthInBytes(int width,
+                                 base::span<TestFormat> test_formats) {
+    for (auto& test_format : test_formats) {
       size_t bytes = ResourceSizes::UncheckedWidthInBytes<size_t>(
-          width, test_formats[i].format);
-      EXPECT_EQ(bytes, test_formats[i].expected_bytes);
+          width, test_format.format);
+      EXPECT_EQ(bytes, test_format.expected_bytes);
     }
   }
 
   void TestCheckedSizeInBytes(const gfx::Size& size,
-                              const TestFormat* test_formats) {
-    for (int i = 0; i < kTestFormats; ++i) {
-      size_t bytes = ResourceSizes::CheckedSizeInBytes<size_t>(
-          size, test_formats[i].format);
-      EXPECT_EQ(bytes, test_formats[i].expected_bytes);
+                              base::span<TestFormat> test_formats) {
+    for (auto& test_format : test_formats) {
+      size_t bytes =
+          ResourceSizes::CheckedSizeInBytes<size_t>(size, test_format.format);
+      EXPECT_EQ(bytes, test_format.expected_bytes);
     }
   }
 };
diff --git a/components/viz/service/input/input_manager.cc b/components/viz/service/input/input_manager.cc
index b6b8ce6e..44e4f1d 100644
--- a/components/viz/service/input/input_manager.cc
+++ b/components/viz/service/input/input_manager.cc
@@ -12,8 +12,11 @@
 
 #include <utility>
 
+#include "base/debug/crash_logging.h"
+#include "base/json/values_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/values.h"
 #include "components/viz/service/input/render_input_router_delegate_impl.h"
 #include "components/viz/service/input/render_input_router_iterator_impl.h"
 #include "components/viz/service/input/render_input_router_support_child_frame.h"
@@ -69,7 +72,8 @@
     std::unique_ptr<RenderInputRouterDelegateImpl> delegate)
     : grouping_id(grouping_id),
       rir_support(std::move(support)),
-      rir_delegate(std::move(delegate)) {}
+      rir_delegate(std::move(delegate)),
+      creation_time(base::TimeTicks::Now()) {}
 
 FrameSinkMetadata::~FrameSinkMetadata() = default;
 
@@ -272,6 +276,32 @@
   }
 }
 
+void InputManager::OnRegisteredFrameSinkHierarchy(
+    const FrameSinkId& parent_frame_sink_id,
+    const FrameSinkId& child_frame_sink_id) {
+  auto it = frame_sink_metadata_map_.find(child_frame_sink_id);
+  if (it == frame_sink_metadata_map_.end()) {
+    return;
+  }
+
+  it->second.operations.emplace_back(
+      FrameSinkMetadata::Operation::Type::kRegisterFrameSinkHierarchy,
+      parent_frame_sink_id, base::TimeTicks::Now() - it->second.creation_time);
+}
+
+void InputManager::OnUnregisteredFrameSinkHierarchy(
+    const FrameSinkId& parent_frame_sink_id,
+    const FrameSinkId& child_frame_sink_id) {
+  auto it = frame_sink_metadata_map_.find(child_frame_sink_id);
+  if (it == frame_sink_metadata_map_.end()) {
+    return;
+  }
+
+  it->second.operations.emplace_back(
+      FrameSinkMetadata::Operation::Type::kUnregisterFrameSinkHierarchy,
+      parent_frame_sink_id, base::TimeTicks::Now() - it->second.creation_time);
+}
+
 void InputManager::OnFrameSinkDeviceScaleFactorChanged(
     const FrameSinkId& frame_sink_id,
     float device_scale_factor) {
@@ -421,6 +451,42 @@
       ->StateOnOverscrollTransfer(frame_sink_id, std::move(params));
 }
 
+std::string InputManager::EmitFrameSinkOperations(
+    const FrameSinkId& frame_sink_id) {
+  auto it = frame_sink_metadata_map_.find(frame_sink_id);
+  CHECK(it != frame_sink_metadata_map_.end());
+  const FrameSinkMetadata& metadata = it->second;
+
+  base::Value::Dict frame_sink_operations = base::Value::Dict();
+  frame_sink_operations.Set("id", frame_sink_id.ToString());
+
+  FrameSinkId root_compositor_frame_sink_id =
+      GetRootCompositorFrameSinkId(frame_sink_id);
+  frame_sink_operations.Set("root_id",
+                            root_compositor_frame_sink_id.ToString());
+
+  {
+    base::Value::List operations_list = base::Value::List();
+    for (const auto& operation : metadata.operations) {
+      base::Value::Dict dict = base::Value::Dict();
+      dict.Set("operation_type", static_cast<int>(operation.type));
+      if (operation.parent_frame_sink_id.has_value()) {
+        dict.Set("parent", operation.parent_frame_sink_id->ToString());
+      }
+      dict.Set("timestamp",
+               base::TimeDeltaToValue(operation.time_since_metadata_creation));
+      operations_list.Append(std::move(dict));
+    }
+    frame_sink_operations.Set("operations", std::move(operations_list));
+  }
+
+  std::string debug_string = frame_sink_operations.DebugString();
+  if (debug_string.size() >= 1024) {
+    return "";
+  }
+  return debug_string;
+}
+
 void InputManager::StateOnTouchTransfer(
     input::mojom::TouchTransferStatePtr state) {
 #if BUILDFLAG(IS_ANDROID)
@@ -443,7 +509,13 @@
       UMA_HISTOGRAM_ENUMERATION(
           kStateProcessingResultHistogram,
           InputOnVizStateProcessingResult::kFrameSinkIdCorrespondsToChildView);
-      base::debug::DumpWithoutCrashing();
+      {
+        // TODO(404741207): Remove crash keys after investigation.
+        SCOPED_CRASH_KEY_STRING1024(
+            "crbug404741207", "frame_sink_operations",
+            EmitFrameSinkOperations(state->root_widget_frame_sink_id));
+        base::debug::DumpWithoutCrashing();
+      }
     }
   } else {
     UMA_HISTOGRAM_ENUMERATION(
@@ -566,6 +638,9 @@
         iter->second.rir_support->IsRenderInputRouterSupportChildFrame()) {
       iter->second.rir_support.reset();
       auto* rir = rir_map_.find(frame_sink_id)->second.get();
+      iter->second.operations.emplace_back(
+          FrameSinkMetadata::Operation::Type::kRecreateSupport, std::nullopt,
+          base::TimeTicks::Now() - iter->second.creation_time);
       iter->second.rir_support =
           MakeRenderInputRouterSupport(rir, frame_sink_id);
     }
diff --git a/components/viz/service/input/input_manager.h b/components/viz/service/input/input_manager.h
index 48c77bb2..30a935b2 100644
--- a/components/viz/service/input/input_manager.h
+++ b/components/viz/service/input/input_manager.h
@@ -6,6 +6,7 @@
 #define COMPONENTS_VIZ_SERVICE_INPUT_INPUT_MANAGER_H_
 
 #include <memory>
+#include <string>
 #include <vector>
 
 #include "base/containers/flat_map.h"
@@ -52,6 +53,19 @@
   base::UnguessableToken grouping_id;
   std::unique_ptr<RenderInputRouterSupportBase> rir_support;
   std::unique_ptr<RenderInputRouterDelegateImpl> rir_delegate;
+
+  struct Operation {
+    enum class Type {
+      kRecreateSupport,
+      kRegisterFrameSinkHierarchy,
+      kUnregisterFrameSinkHierarchy,
+    } type;
+    // The value is set only for (un)RegisterFrameSinkHierarchy operations.
+    std::optional<FrameSinkId> parent_frame_sink_id;
+    base::TimeDelta time_since_metadata_creation;
+  };
+  std::vector<Operation> operations;
+  base::TimeTicks creation_time;
 };
 
 class VIZ_SERVICE_EXPORT InputManager
@@ -82,6 +96,12 @@
   // FrameSinkObserver overrides.
   void OnDestroyedCompositorFrameSink(
       const FrameSinkId& frame_sink_id) override;
+  void OnRegisteredFrameSinkHierarchy(
+      const FrameSinkId& parent_frame_sink_id,
+      const FrameSinkId& child_frame_sink_id) override;
+  void OnUnregisteredFrameSinkHierarchy(
+      const FrameSinkId& parent_frame_sink_id,
+      const FrameSinkId& child_frame_sink_id) override;
   void OnFrameSinkDeviceScaleFactorChanged(const FrameSinkId& frame_sink_id,
                                            float device_scale_factor) override;
 
@@ -199,6 +219,8 @@
 
   friend class MockInputManager;
 
+  std::string EmitFrameSinkOperations(const FrameSinkId& frame_sink_id);
+
   // Keeps track of InputEventRouter corresponding to FrameSinkIds using a
   // CompositorFrameSink grouping_id sent from the browser, allowing mirroring
   // 1:1 relationship in browser between WebContentsImpl and
diff --git a/components/webrtc/media_stream_devices_controller.cc b/components/webrtc/media_stream_devices_controller.cc
index 5f1ca23..0f720a2 100644
--- a/components/webrtc/media_stream_devices_controller.cc
+++ b/components/webrtc/media_stream_devices_controller.cc
@@ -14,6 +14,7 @@
 #include "components/permissions/permission_util.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/permission_result.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
@@ -90,7 +91,7 @@
       new MediaStreamDevicesController(web_contents, enumerator, request,
                                        std::move(callback)));
 
-  std::vector<blink::PermissionType> permission_types;
+  std::vector<blink::mojom::PermissionDescriptorPtr> permission_types;
 
   content::PermissionController* permission_controller =
       web_contents->GetBrowserContext()->GetPermissionController();
@@ -114,7 +115,9 @@
       return;
     }
 
-    permission_types.push_back(blink::PermissionType::AUDIO_CAPTURE);
+    permission_types.push_back(content::PermissionDescriptorUtil::
+                                   CreatePermissionDescriptorForPermissionType(
+                                       blink::PermissionType::AUDIO_CAPTURE));
     requested_audio_capture_device_ids = request.requested_audio_device_ids;
   }
   if (controller->ShouldRequestVideo()) {
@@ -133,7 +136,9 @@
       return;
     }
 
-    permission_types.push_back(blink::PermissionType::VIDEO_CAPTURE);
+    permission_types.push_back(content::PermissionDescriptorUtil::
+                                   CreatePermissionDescriptorForPermissionType(
+                                       blink::PermissionType::VIDEO_CAPTURE));
     requested_video_capture_device_ids = request.requested_video_device_ids;
 
     bool has_pan_tilt_zoom_camera = controller->HasAvailableDevices(
@@ -154,12 +159,15 @@
         return;
       }
 
-      permission_types.push_back(blink::PermissionType::CAMERA_PAN_TILT_ZOOM);
+      permission_types.push_back(
+          content::PermissionDescriptorUtil::
+              CreatePermissionDescriptorForPermissionType(
+                  blink::PermissionType::CAMERA_PAN_TILT_ZOOM));
     }
   }
 
   content::PermissionRequestDescription permission_request_description{
-      permission_types, request.user_gesture};
+      std::move(permission_types), request.user_gesture};
   permission_request_description.requested_audio_capture_device_ids =
       requested_audio_capture_device_ids;
   permission_request_description.requested_video_capture_device_ids =
diff --git a/components/webrtc/media_stream_devices_controller_unittest.cc b/components/webrtc/media_stream_devices_controller_unittest.cc
index 16b98dd..8d7feba 100644
--- a/components/webrtc/media_stream_devices_controller_unittest.cc
+++ b/components/webrtc/media_stream_devices_controller_unittest.cc
@@ -8,6 +8,7 @@
 #include "base/test/test_future.h"
 #include "components/webrtc/media_stream_devices_util.h"
 #include "content/public/browser/global_routing_id.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/browser_test_utils.h"
@@ -160,13 +161,20 @@
           };
         });
 
-    std::vector<blink::PermissionType> expected_permissions;
+    std::vector<blink::mojom::PermissionDescriptorPtr> expected_permissions;
     if (request_audio) {
-      expected_permissions.push_back(blink::PermissionType::AUDIO_CAPTURE);
+      expected_permissions.push_back(
+          content::PermissionDescriptorUtil::
+              CreatePermissionDescriptorForPermissionType(
+                  blink::PermissionType::AUDIO_CAPTURE));
     }
     if (request_video) {
-      expected_permissions.push_back(blink::PermissionType::VIDEO_CAPTURE);
+      expected_permissions.push_back(
+          content::PermissionDescriptorUtil::
+              CreatePermissionDescriptorForPermissionType(
+                  blink::PermissionType::VIDEO_CAPTURE));
     }
+
     content::PermissionRequestDescription expected_description{
         std::move(expected_permissions), false};
     expected_description.requested_audio_capture_device_ids =
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index c807cd67..20b991b 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -1380,6 +1380,7 @@
     "media/capture/desktop_capture_device_uma_types.h",
     "media/capture/desktop_streams_registry_impl.cc",
     "media/capture/desktop_streams_registry_impl.h",
+    "permissions/permission_descriptor_util.cc",
 
     # TODO(crbug.com/202736352): This is built even if enable_screen_capture is
     # false. Consider better separation of the screen capture and the other
diff --git a/content/browser/accessibility/accessibility_tree_formatter_android.cc b/content/browser/accessibility/accessibility_tree_formatter_android.cc
index d9e18bf..ef61281 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_android.cc
+++ b/content/browser/accessibility/accessibility_tree_formatter_android.cc
@@ -27,7 +27,6 @@
 // clang-format off
 const char* const BOOL_ATTRIBUTES[] = {
     "checkable",
-    "checked",
     "clickable",
     "collapsed",
     "collection",
@@ -82,6 +81,7 @@
     "text_change_removed_count",
     "selection_mode",
     "expanded_state",
+    "checked",
 };
 
 const char* const ACTION_ATTRIBUTES[] = {
@@ -168,7 +168,6 @@
 
   // Bool attributes.
   dict->Set("checkable", android_node->IsCheckable());
-  dict->Set("checked", android_node->IsChecked());
   dict->Set("clickable", android_node->IsClickable());
   dict->Set("collapsed", android_node->IsCollapsed());
   dict->Set("collection", android_node->IsCollection());
@@ -225,6 +224,7 @@
             android_node->GetTextChangeRemovedCount());
   dict->Set("selection_mode", android_node->GetSelectionMode());
   dict->Set("expanded_state", android_node->ExpandedState());
+  dict->Set("checked", android_node->GetChecked());
 
   // Actions.
   dict->Set("action_expand", android_node->IsCollapsed());
diff --git a/content/browser/accessibility/browser_accessibility_android.cc b/content/browser/accessibility/browser_accessibility_android.cc
index acd4bdf..e7ddb12 100644
--- a/content/browser/accessibility/browser_accessibility_android.cc
+++ b/content/browser/accessibility/browser_accessibility_android.cc
@@ -85,6 +85,14 @@
   ANDROID_VIEW_ACCESSIBILITY_SELECTION_MODE_MULTIPLE = 2,
 };
 
+// These are enums from
+// android.view.accessibility.AccessibilityNodeInfo.CheckedState in Java:
+enum {
+  ANDROID_VIEW_ACCESSIBILITY_CHECKED_STATE_FALSE = 0,
+  ANDROID_VIEW_ACCESSIBILITY_CHECKED_STATE_TRUE = 1,
+  ANDROID_VIEW_ACCESSIBILITY_CHECKED_STATE_PARTIAL = 2,
+};
+
 }  // namespace
 
 namespace ui {
@@ -352,13 +360,6 @@
          HasFloatAttribute(ax::mojom::FloatAttribute::kValueForRange);
 }
 
-bool BrowserAccessibilityAndroid::IsReportingCheckable() const {
-  // To communicate kMixed state Checkboxes, we will rely on state description,
-  // so we will not report node as checkable to avoid duplicate utterances.
-  return IsCheckable() &&
-         GetData().GetCheckedState() != ax::mojom::CheckedState::kMixed;
-}
-
 bool BrowserAccessibilityAndroid::IsRequired() const {
   return HasState(ax::mojom::State::kRequired);
 }
@@ -999,13 +1000,8 @@
     state_descs.push_back(GetMultiselectableStateDescription());
   }
 
-  // For Checkboxes, if we are in a kMixed state, we will communicate
-  // "partially checked" through the state description. This is mutually
-  // exclusive with the on/off of toggle buttons below.
-  if (IsCheckable() && !IsReportingCheckable()) {
-    state_descs.push_back(GetCheckboxStateDescription());
-  } else if (GetRole() == ax::mojom::Role::kToggleButton ||
-             GetRole() == ax::mojom::Role::kSwitch) {
+  if (GetRole() == ax::mojom::Role::kToggleButton ||
+      GetRole() == ax::mojom::Role::kSwitch) {
     // For Toggle buttons and switches, we will append "on"/"off" in the state
     // description.
     state_descs.push_back(GetToggleStateDescription());
@@ -1112,11 +1108,6 @@
   return GetLocalizedString(IDS_AX_TOGGLE_BUTTON_OFF);
 }
 
-std::u16string BrowserAccessibilityAndroid::GetCheckboxStateDescription()
-    const {
-  return GetLocalizedString(IDS_AX_CHECKBOX_PARTIALLY_CHECKED);
-}
-
 std::u16string BrowserAccessibilityAndroid::GetAriaCurrentStateDescription()
     const {
   int message_id;
@@ -1278,6 +1269,19 @@
   return ui::ToString(GetRole());
 }
 
+int BrowserAccessibilityAndroid::GetChecked() const {
+  ax::mojom::CheckedState checkedState = GetData().GetCheckedState();
+  switch (checkedState) {
+    case ax::mojom::CheckedState::kNone:
+    case ax::mojom::CheckedState::kFalse:
+      return ANDROID_VIEW_ACCESSIBILITY_CHECKED_STATE_FALSE;
+    case ax::mojom::CheckedState::kTrue:
+      return ANDROID_VIEW_ACCESSIBILITY_CHECKED_STATE_TRUE;
+    case ax::mojom::CheckedState::kMixed:
+      return ANDROID_VIEW_ACCESSIBILITY_CHECKED_STATE_PARTIAL;
+  }
+}
+
 std::u16string BrowserAccessibilityAndroid::GetRoleDescription() const {
   // If an element has an aria-roledescription set, use that value by default.
   if (HasStringAttribute(ax::mojom::StringAttribute::kRoleDescription)) {
diff --git a/content/browser/accessibility/browser_accessibility_android.h b/content/browser/accessibility/browser_accessibility_android.h
index 70e256c..01e2977 100644
--- a/content/browser/accessibility/browser_accessibility_android.h
+++ b/content/browser/accessibility/browser_accessibility_android.h
@@ -198,6 +198,8 @@
   int GetMaxScrollY() const;
   bool Scroll(int direction, bool is_page_scroll) const;
 
+  int GetChecked() const;
+
   int GetTextChangeFromIndex() const;
   int GetTextChangeAddedCount() const;
   int GetTextChangeRemovedCount() const;
diff --git a/content/browser/accessibility/web_contents_accessibility_android.cc b/content/browser/accessibility/web_contents_accessibility_android.cc
index 8065241..ae52abc6 100644
--- a/content/browser/accessibility/web_contents_accessibility_android.cc
+++ b/content/browser/accessibility/web_contents_accessibility_android.cc
@@ -1246,11 +1246,10 @@
   }
 
   Java_AccessibilityNodeInfoBuilder_setAccessibilityNodeInfoBooleanAttributes(
-      env, obj, info, unique_id, node->IsReportingCheckable(),
-      node->IsChecked(), node->IsClickable(), node->IsContentInvalid(),
-      node->IsEnabled(), node->IsFocusable(), node->IsFocused(),
-      node->HasImage(), node->IsPasswordField(), node->IsScrollable(),
-      node->IsSelected(), node->IsVisibleToUser(),
+      env, obj, info, unique_id, node->IsCheckable(), node->IsClickable(),
+      node->IsContentInvalid(), node->IsEnabled(), node->IsFocusable(),
+      node->IsFocused(), node->HasImage(), node->IsPasswordField(),
+      node->IsScrollable(), node->IsSelected(), node->IsVisibleToUser(),
       node->HasCharacterLocations(), node->IsRequired());
 
   Java_AccessibilityNodeInfoBuilder_addAccessibilityNodeInfoActions(
@@ -1275,7 +1274,7 @@
       node->ClickableScore(), GetCanonicalJNIString(env, node->GetCSSDisplay()),
       base::android::ConvertUTF16ToJavaString(env, node->GetBrailleLabel()),
       GetCanonicalJNIString(env, node->GetBrailleRoleDescription()),
-      node->ExpandedState());
+      node->ExpandedState(), node->GetChecked());
 
   ScopedJavaLocalRef<jintArray> suggestion_starts_java;
   ScopedJavaLocalRef<jintArray> suggestion_ends_java;
diff --git a/content/browser/attribution_reporting/attribution_constants.h b/content/browser/attribution_reporting/attribution_constants.h
index b3eb20f2..0388498 100644
--- a/content/browser/attribution_reporting/attribution_constants.h
+++ b/content/browser/attribution_reporting/attribution_constants.h
@@ -5,11 +5,15 @@
 #ifndef CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_CONSTANTS_H_
 #define CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_CONSTANTS_H_
 
+#include "base/time/time.h"
+
 namespace content {
 
 inline constexpr char kAttributionReportingInfoHeader[] =
     "Attribution-Reporting-Info";
 
+inline constexpr base::TimeDelta kReportExpiry = base::Days(30);
+
 }  // namespace content
 
 #endif  // CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_CONSTANTS_H_
diff --git a/content/browser/attribution_reporting/attribution_features.cc b/content/browser/attribution_reporting/attribution_features.cc
index 67471dd..88a50e9 100644
--- a/content/browser/attribution_reporting/attribution_features.cc
+++ b/content/browser/attribution_reporting/attribution_features.cc
@@ -19,4 +19,8 @@
         &kAttributionReportDeliveryOnNewNavigation, "navigation_window",
         base::Minutes(2)};
 
+BASE_FEATURE(kAttributionReportExpiry,
+             "AttributionReportExpiry",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
 }  // namespace content
diff --git a/content/browser/attribution_reporting/attribution_features.h b/content/browser/attribution_reporting/attribution_features.h
index 7788a08..5ba4e0b 100644
--- a/content/browser/attribution_reporting/attribution_features.h
+++ b/content/browser/attribution_reporting/attribution_features.h
@@ -20,6 +20,8 @@
 CONTENT_EXPORT extern const base::FeatureParam<base::TimeDelta>
     kAttributionReportingNavigationForReportDeliveryWindow;
 
+CONTENT_EXPORT BASE_DECLARE_FEATURE(kAttributionReportExpiry);
+
 }  // namespace content
 
 #endif  // CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_FEATURES_H_
diff --git a/content/browser/attribution_reporting/attribution_internals.mojom b/content/browser/attribution_reporting/attribution_internals.mojom
index 4deb344..f64d527 100644
--- a/content/browser/attribution_reporting/attribution_internals.mojom
+++ b/content/browser/attribution_reporting/attribution_internals.mojom
@@ -61,6 +61,7 @@
   // Contains the external report ID of the replacement report.
   string replaced_by_higher_priority_report;
   Empty prohibited_by_browser_policy;
+  Empty expired;
   NetworkStatus network_status;
   Empty failed_to_assemble;
 };
diff --git a/content/browser/attribution_reporting/attribution_internals_browsertest.cc b/content/browser/attribution_reporting/attribution_internals_browsertest.cc
index 6474f84..b8fcefa 100644
--- a/content/browser/attribution_reporting/attribution_internals_browsertest.cc
+++ b/content/browser/attribution_reporting/attribution_internals_browsertest.cc
@@ -1166,19 +1166,26 @@
           .SetReportTime(now + base::Hours(4))
           .SetAggregatableHistogramContributions(contributions)
           .BuildAggregatableAttribution(),
-      /*is_debug_report=*/false, SendResult(SendResult::Dropped()));
+      /*is_debug_report=*/false, SendResult(SendResult::Expired()));
   manager()->NotifyReportSent(
       ReportBuilder(AttributionInfoBuilder().Build(),
                     SourceBuilder(now).BuildStored())
           .SetReportTime(now + base::Hours(5))
           .SetAggregatableHistogramContributions(contributions)
           .BuildAggregatableAttribution(),
+      /*is_debug_report=*/false, SendResult(SendResult::Dropped()));
+  manager()->NotifyReportSent(
+      ReportBuilder(AttributionInfoBuilder().Build(),
+                    SourceBuilder(now).BuildStored())
+          .SetReportTime(now + base::Hours(6))
+          .SetAggregatableHistogramContributions(contributions)
+          .BuildAggregatableAttribution(),
       /*is_debug_report=*/false,
       SendResult(SendResult::AssemblyFailure(/*transient=*/false)));
   manager()->NotifyReportSent(
       ReportBuilder(AttributionInfoBuilder().Build(),
                     SourceBuilder(now).BuildStored())
-          .SetReportTime(now + base::Hours(6))
+          .SetReportTime(now + base::Hours(7))
           .SetAggregatableHistogramContributions(contributions)
           .BuildAggregatableAttribution(),
       /*is_debug_report=*/false,
@@ -1209,7 +1216,7 @@
       const table = document.querySelector('#aggregatable-report-panel attribution-internals-table')
           .shadowRoot.querySelector('tbody');
       const setTitleIfDone = (_, obs) => {
-        if (table.rows.length === 6 &&
+        if (table.rows.length === 7 &&
             table.rows[0].cells[1]?.innerText ===
               'https://report.test/.well-known/attribution-reporting/report-aggregate-attribution' &&
             table.rows[0].cells[0]?.innerText === 'Pending' &&
@@ -1217,11 +1224,12 @@
             table.rows[0].cells[5]?.innerText === 'https://aws.example.test' &&
             table.rows[0].cells[6]?.innerText === 'false' &&
             table.rows[1].cells[0]?.innerText === 'Sent: HTTP 200' &&
-            table.rows[2].cells[0]?.innerText === 'Prohibited by browser policy' &&
-            table.rows[3].cells[0]?.innerText === 'Dropped due to assembly failure' &&
-            table.rows[4].cells[0]?.innerText === 'Network error: ERR_INVALID_REDIRECT' &&
-            table.rows[5].cells[4]?.innerText === '[ {  "key": "0x0",  "value": 0,  "filteringId": "0" }]' &&
-            table.rows[5].cells[6]?.innerText === 'true') {
+            table.rows[2].cells[0]?.innerText === 'Expired' &&
+            table.rows[3].cells[0]?.innerText === 'Prohibited by browser policy' &&
+            table.rows[4].cells[0]?.innerText === 'Dropped due to assembly failure' &&
+            table.rows[5].cells[0]?.innerText === 'Network error: ERR_INVALID_REDIRECT' &&
+            table.rows[6].cells[4]?.innerText === '[ {  "key": "0x0",  "value": 0,  "filteringId": "0" }]' &&
+            table.rows[6].cells[6]?.innerText === 'true') {
           if (obs) {
             obs.disconnect();
           }
diff --git a/content/browser/attribution_reporting/attribution_internals_handler_impl.cc b/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
index eb7a9ab..70435a40 100644
--- a/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
+++ b/content/browser/attribution_reporting/attribution_internals_handler_impl.cc
@@ -392,6 +392,9 @@
           [](SendResult::Sent sent) {
             return ReportStatus::NewNetworkStatus(NetworkStatus(sent.status));
           },
+          [](SendResult::Expired) {
+            return ReportStatus::NewExpired(Empty::New());
+          },
           [](SendResult::Dropped) {
             return ReportStatus::NewProhibitedByBrowserPolicy(Empty::New());
           },
diff --git a/content/browser/attribution_reporting/attribution_manager_impl.cc b/content/browser/attribution_reporting/attribution_manager_impl.cc
index 8dd580c..1d386671c 100644
--- a/content/browser/attribution_reporting/attribution_manager_impl.cc
+++ b/content/browser/attribution_reporting/attribution_manager_impl.cc
@@ -56,6 +56,7 @@
 #include "content/browser/aggregation_service/report_scheduler_timer.h"
 #include "content/browser/attribution_reporting/aggregatable_attribution_utils.h"
 #include "content/browser/attribution_reporting/aggregatable_debug_report.h"
+#include "content/browser/attribution_reporting/attribution_constants.h"
 #include "content/browser/attribution_reporting/attribution_data_host_manager.h"
 #include "content/browser/attribution_reporting/attribution_data_host_manager_impl.h"
 #include "content/browser/attribution_reporting/attribution_debug_report.h"
@@ -123,7 +124,8 @@
   kFailed = 1,
   kDropped = 2,
   kFailedToAssemble = 3,
-  kMaxValue = kFailedToAssemble,
+  kExpired = 4,
+  kMaxValue = kExpired,
 };
 // LINT.ThenChange(//tools/metrics/histograms/metadata/attribution_reporting/enums.xml:ConversionReportSendOutcome)
 
@@ -293,6 +295,8 @@
       return ConversionReportSendOutcome::kFailed;
     case SendResult::Status::kDropped:
       return ConversionReportSendOutcome::kDropped;
+    case SendResult::Status::kExpired:
+      return ConversionReportSendOutcome::kExpired;
     case SendResult::Status::kAssemblyFailure:
     case SendResult::Status::kTransientAssemblyFailure:
       return ConversionReportSendOutcome::kFailedToAssemble;
@@ -424,6 +428,7 @@
           /*buckets=*/100);
       break;
     case SendResult::Status::kDropped:
+    case SendResult::Status::kExpired:
     case SendResult::Status::kAssemblyFailure:
     case SendResult::Status::kTransientAssemblyFailure:
       break;
@@ -1157,11 +1162,18 @@
     return;
   }
 
+  // Drop the report on the floor if the report is expired. We need to make sure
+  // we forward that the report was "sent" to ensure it is deleted from storage,
+  // etc. This simulates sending the report through a null channel.
+  if (base::FeatureList::IsEnabled(kAttributionReportExpiry) && now > report.initial_report_time() + kReportExpiry) {
+    OnReportSent(std::move(web_ui_callback), std::move(report),
+                 SendResult(SendResult::Expired()));
+    return;
+  }
+
   if (!IsReportAllowed(report)) {
-    // If measurement is disallowed, just drop the report on the floor. We
-    // need to make sure we forward that the report was "sent" to ensure it is
-    // deleted from storage, etc. This simulates sending the report through a
-    // null channel.
+    // If measurement is disallowed, just drop the report on the floor the same
+    // way we do above.
     OnReportSent(std::move(web_ui_callback), std::move(report),
                  SendResult(SendResult::Dropped()));
     return;
@@ -1240,6 +1252,9 @@
                      [](SendResult::Dropped) -> std::optional<base::Time> {
                        return std::nullopt;
                      },
+                     [](SendResult::Expired) -> std::optional<base::Time> {
+                       return std::nullopt;
+                     },
                      [&](SendResult::AssemblyFailure failure)
                          -> std::optional<base::Time> {
                        // TODO(linnan): Retry on transient assembly failure
diff --git a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
index f43a719..d3239f0b 100644
--- a/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_manager_impl_unittest.cc
@@ -55,6 +55,7 @@
 #include "content/browser/aggregation_service/aggregation_service_test_utils.h"
 #include "content/browser/attribution_reporting/aggregatable_attribution_utils.h"
 #include "content/browser/attribution_reporting/aggregatable_debug_report.h"
+#include "content/browser/attribution_reporting/attribution_constants.h"
 #include "content/browser/attribution_reporting/attribution_debug_report.h"
 #include "content/browser/attribution_reporting/attribution_features.h"
 #include "content/browser/attribution_reporting/attribution_input_event.h"
@@ -779,15 +780,46 @@
       "Conversions.EventLevelReport.ReportRetriesTillSuccessOrFailure", 3, 1);
 }
 
-TEST_F(AttributionManagerImplTest, ReportExpiredAtStartup_Sent) {
+TEST_F(AttributionManagerImplTest, ReportExpiredAtStartup_Deleted) {
+  base::HistogramTester histograms;
+
+  EXPECT_CALL(*report_sender_, SendReport(_, /*is_debug_report=*/false, _))
+      .Times(0);
+
+  attribution_manager_->HandleSource(TestAggregatableSourceProvider()
+                                         .GetBuilder()
+                                         .SetExpiry(kImpressionExpiry)
+                                         .Build(),
+                                     kFrameId);
+  attribution_manager_->HandleTrigger(
+      DefaultAggregatableTriggerBuilder().Build(), kFrameId);
+
+  ShutdownManager();
+
+  // Fast-forward past report expiry.
+  task_environment_.FastForwardBy(kImpressionExpiry + kReportExpiry);
+
+  // Simulate startup and ensure the report is deleted.
+  CreateManager();
+
+  task_environment_.FastForwardBy(kDefaultOfflineReportDelay.max);
+  EXPECT_THAT(StoredReports(), IsEmpty());
+  // kExpired = 4
+  histograms.ExpectBucketCount("Conversions.ReportSendOutcome3", 4, 1);
+  histograms.ExpectBucketCount(
+      "Conversions.AggregatableReport.ReportSendOutcome2", 4, 1);
+}
+
+TEST_F(AttributionManagerImplTest, ReportSourceExpiredAtStartup_Sent) {
   attribution_manager_->HandleSource(
       SourceBuilder().SetExpiry(kImpressionExpiry).Build(), kFrameId);
+  task_environment_.FastForwardBy(base::Microseconds(1));
   attribution_manager_->HandleTrigger(DefaultTrigger(), kFrameId);
 
   ShutdownManager();
 
   // Fast-forward past source expiry.
-  task_environment_.FastForwardBy(kImpressionExpiry + base::Microseconds(1));
+  task_environment_.FastForwardBy(kImpressionExpiry - base::Microseconds(1));
 
   // Simulate startup and ensure the report is sent.
   // Advance by the max offline report delay, per
@@ -795,6 +827,8 @@
   CreateManager();
 
   EXPECT_CALL(*report_sender_, SendReport(_, /*is_debug_report=*/false, _));
+  EXPECT_THAT(StoredReports(), SizeIs(1));
+  EXPECT_THAT(StoredSources(), IsEmpty());
   task_environment_.FastForwardBy(kDefaultOfflineReportDelay.max);
 }
 
@@ -815,6 +849,33 @@
   histograms.ExpectUniqueSample("Conversions.ReportSendOutcome3", 0, 1);
 }
 
+TEST_F(AttributionManagerImplTest, ExpiredReportSend_Deleted) {
+  base::HistogramTester histograms;
+
+  EXPECT_CALL(*report_sender_, SendReport(_, /*is_debug_report=*/false, _))
+      .Times(0);
+
+  attribution_manager_->HandleSource(TestAggregatableSourceProvider()
+                                         .GetBuilder()
+                                         .SetExpiry(kImpressionExpiry)
+                                         .Build(),
+                                     kFrameId);
+  attribution_manager_->HandleTrigger(
+      DefaultAggregatableTriggerBuilder().Build(), kFrameId);
+  task_environment_.FastForwardBy(base::Microseconds(1));
+
+  // Delay report send until after report expiry.
+  task_environment_.AdvanceClock(kImpressionExpiry + kReportExpiry);
+
+  task_environment_.FastForwardBy(kDefaultOfflineReportDelay.max);
+
+  EXPECT_THAT(StoredReports(), IsEmpty());
+  // kExpired = 4
+  histograms.ExpectBucketCount("Conversions.ReportSendOutcome3", 4, 1);
+  histograms.ExpectBucketCount(
+      "Conversions.AggregatableReport.ReportSendOutcome2", 4, 1);
+}
+
 TEST_F(AttributionManagerImplTest, QueuedReportSent_ObserversNotified) {
   base::HistogramTester histograms;
 
@@ -1950,6 +2011,45 @@
       network::mojom::ConnectionType::CONNECTION_UNKNOWN);
 }
 
+TEST_F(AttributionManagerImplTest, Offline_ExpiredReportDeleted) {
+  base::HistogramTester histograms;
+  Checkpoint checkpoint;
+  {
+    InSequence seq;
+
+    EXPECT_CALL(*report_sender_, SendReport(_, /*is_debug_report=*/false, _))
+        .Times(0);
+    EXPECT_CALL(checkpoint, Call(1));
+    EXPECT_CALL(*report_sender_, SendReport(_, /*is_debug_report=*/false, _))
+        .Times(0);
+  }
+
+  attribution_manager_->HandleSource(TestAggregatableSourceProvider()
+                                         .GetBuilder()
+                                         .SetExpiry(kImpressionExpiry)
+                                         .Build(),
+                                     kFrameId);
+  attribution_manager_->HandleTrigger(
+      DefaultAggregatableTriggerBuilder().Build(), kFrameId);
+  EXPECT_THAT(StoredReports(), SizeIs(2));
+
+  SetConnectionTypeAndWaitForObserversToBeNotified(
+      network::mojom::ConnectionType::CONNECTION_NONE);
+  task_environment_.FastForwardBy(kImpressionExpiry + kReportExpiry);
+
+  checkpoint.Call(1);
+
+  SetConnectionTypeAndWaitForObserversToBeNotified(
+      network::mojom::ConnectionType::CONNECTION_UNKNOWN);
+
+  task_environment_.FastForwardBy(kDefaultOfflineReportDelay.max);
+  EXPECT_THAT(StoredReports(), IsEmpty());
+  // kExpired = 4
+  histograms.ExpectBucketCount("Conversions.ReportSendOutcome3", 4, 1);
+  histograms.ExpectBucketCount(
+      "Conversions.AggregatableReport.ReportSendOutcome2", 4, 1);
+}
+
 class AttributionManagerImplOnlineConnectionTypeTest
     : public AttributionManagerImplTest {
  protected:
diff --git a/content/browser/attribution_reporting/attribution_test_utils.cc b/content/browser/attribution_reporting/attribution_test_utils.cc
index b0e8a24..a9788b6 100644
--- a/content/browser/attribution_reporting/attribution_test_utils.cc
+++ b/content/browser/attribution_reporting/attribution_test_utils.cc
@@ -856,6 +856,8 @@
       return out << "kTransientFailure";
     case SendResult::Status::kFailure:
       return out << "kFailure";
+    case SendResult::Status::kExpired:
+      return out << "kExpired";
     case SendResult::Status::kDropped:
       return out << "kDropped";
     case SendResult::Status::kAssemblyFailure:
@@ -883,6 +885,7 @@
                    out << ",status=" << sent.status << "}}";
                  },
                  [&](SendResult::Dropped) { out << "{Dropped={}}"; },
+                 [&](SendResult::Expired) { out << "{Expired={}}"; },
                  [&](SendResult::AssemblyFailure failure) {
                    out << "{AssemblyFailure={transient=" << failure.transient
                        << "}}";
diff --git a/content/browser/attribution_reporting/send_result.cc b/content/browser/attribution_reporting/send_result.cc
index c57fc73..d83febf7 100644
--- a/content/browser/attribution_reporting/send_result.cc
+++ b/content/browser/attribution_reporting/send_result.cc
@@ -23,6 +23,7 @@
                          }
                        },
                        [](Dropped) { return Status::kDropped; },
+                       [](Expired) { return Status::kExpired; },
                        [](AssemblyFailure failure) {
                          return failure.transient
                                     ? Status::kTransientAssemblyFailure
diff --git a/content/browser/attribution_reporting/send_result.h b/content/browser/attribution_reporting/send_result.h
index 83823f1..1172e01 100644
--- a/content/browser/attribution_reporting/send_result.h
+++ b/content/browser/attribution_reporting/send_result.h
@@ -27,6 +27,8 @@
     // The report was dropped because of transient assembly failure, e.g. the
     // public key was not fetched.
     kTransientAssemblyFailure,
+    // The report was dropped because it exceeded the max report lifetime.
+    kExpired,
   };
 
   struct Sent {
@@ -43,6 +45,8 @@
     friend bool operator==(const Sent&, const Sent&) = default;
   };
 
+  struct Expired {};
+
   struct Dropped {};
 
   struct AssemblyFailure {
@@ -52,7 +56,7 @@
 
   Status status() const;
 
-  using Result = std::variant<Sent, Dropped, AssemblyFailure>;
+  using Result = std::variant<Sent, Dropped, Expired, AssemblyFailure>;
   Result result;
 };
 
diff --git a/content/browser/compute_pressure/pressure_service_for_worker_unittest.cc b/content/browser/compute_pressure/pressure_service_for_worker_unittest.cc
index 8ce9ceb4..c425031 100644
--- a/content/browser/compute_pressure/pressure_service_for_worker_unittest.cc
+++ b/content/browser/compute_pressure/pressure_service_for_worker_unittest.cc
@@ -146,7 +146,8 @@
         rfh->GetGlobalId(), rfh->GetGlobalId(), rfh->GetStorageKey(),
         rfh->GetStorageKey().origin(), rfh->GetIsolationInfoForSubresources(),
         rfh->BuildClientSecurityState(), nullptr, nullptr,
-        mojo::PendingReceiver<blink::mojom::DedicatedWorkerHost>());
+        mojo::PendingReceiver<blink::mojom::DedicatedWorkerHost>(),
+        net::StorageAccessApiStatus::kNone);
     mojo::Receiver<blink::mojom::BrowserInterfaceBroker>& bib =
         worker_host_->browser_interface_broker_receiver_for_testing();
     blink::mojom::BrowserInterfaceBroker* broker = bib.internal_state()->impl();
diff --git a/content/browser/font_access/font_access_manager.cc b/content/browser/font_access/font_access_manager.cc
index 605e247..192620c 100644
--- a/content/browser/font_access/font_access_manager.cc
+++ b/content/browser/font_access/font_access_manager.cc
@@ -23,6 +23,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/global_routing_id.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/permission_request_description.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/common/content_client.h"
@@ -125,8 +126,11 @@
 
   permission_controller->RequestPermissionFromCurrentDocument(
       rfh,
-      PermissionRequestDescription(blink::PermissionType::LOCAL_FONTS,
-                                   /*user_gesture=*/true),
+      PermissionRequestDescription(
+          content::PermissionDescriptorUtil::
+              CreatePermissionDescriptorForPermissionType(
+                  blink::PermissionType::LOCAL_FONTS),
+          /*user_gesture=*/true),
       base::BindOnce(&FontAccessManager::DidRequestPermission,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
diff --git a/content/browser/font_access/font_access_test_utils.cc b/content/browser/font_access/font_access_test_utils.cc
index 1e590746..988c4cf1 100644
--- a/content/browser/font_access/font_access_test_utils.cc
+++ b/content/browser/font_access/font_access_test_utils.cc
@@ -17,7 +17,8 @@
     const PermissionRequestDescription& request_description,
     base::OnceCallback<void(const std::vector<blink::mojom::PermissionStatus>&)>
         callback) {
-  EXPECT_EQ(request_description.permissions[0],
+  EXPECT_EQ(blink::PermissionDescriptorToPermissionType(
+                request_description.permissions[0]),
             blink::PermissionType::LOCAL_FONTS);
   EXPECT_TRUE(request_description.user_gesture);
   request_callback_.Run(std::move(callback));
diff --git a/content/browser/generic_sensor/frame_sensor_provider_proxy.cc b/content/browser/generic_sensor/frame_sensor_provider_proxy.cc
index 5af2bdd..2836e523 100644
--- a/content/browser/generic_sensor/frame_sensor_provider_proxy.cc
+++ b/content/browser/generic_sensor/frame_sensor_provider_proxy.cc
@@ -10,10 +10,10 @@
 #include "content/browser/renderer_host/render_frame_host_impl.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/permission_request_description.h"
 #include "content/public/browser/web_contents_user_data.h"
 #include "services/device/public/mojom/sensor_provider.mojom-shared.h"
-#include "third_party/blink/public/common/permissions/permission_utils.h"
 #include "third_party/blink/public/mojom/permissions/permission_status.mojom.h"
 
 using device::mojom::SensorType;
@@ -89,7 +89,10 @@
       ->GetPermissionController()
       ->RequestPermissionFromCurrentDocument(
           &render_frame_host(),
-          PermissionRequestDescription(blink::PermissionType::SENSORS),
+          PermissionRequestDescription(
+              content::PermissionDescriptorUtil::
+                  CreatePermissionDescriptorForPermissionType(
+                      blink::PermissionType::SENSORS)),
           base::BindOnce(
               &FrameSensorProviderProxy::OnPermissionRequestCompleted,
               weak_factory_.GetWeakPtr(), type, std::move(callback)));
diff --git a/content/browser/generic_sensor/web_contents_sensor_provider_proxy_unittest.cc b/content/browser/generic_sensor/web_contents_sensor_provider_proxy_unittest.cc
index 4df5f16..9f0b0bb 100644
--- a/content/browser/generic_sensor/web_contents_sensor_provider_proxy_unittest.cc
+++ b/content/browser/generic_sensor/web_contents_sensor_provider_proxy_unittest.cc
@@ -34,7 +34,8 @@
           void(const std::vector<blink::mojom::PermissionStatus>&)> callback)
       override {
     ASSERT_EQ(request_description.permissions.size(), 1ul);
-    ASSERT_EQ(request_description.permissions[0],
+    ASSERT_EQ(blink::PermissionDescriptorToPermissionType(
+                  request_description.permissions[0]),
               blink::PermissionType::SENSORS);
     std::move(callback).Run({blink::mojom::PermissionStatus::GRANTED});
   }
diff --git a/content/browser/geolocation/geolocation_service_impl.cc b/content/browser/geolocation/geolocation_service_impl.cc
index b638975..119f4ad 100644
--- a/content/browser/geolocation/geolocation_service_impl.cc
+++ b/content/browser/geolocation/geolocation_service_impl.cc
@@ -10,6 +10,7 @@
 #include "content/browser/permissions/permission_controller_impl.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/permission_request_description.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
@@ -45,8 +46,11 @@
       ->GetPermissionController()
       ->RequestPermissionFromCurrentDocument(
           render_frame_host,
-          PermissionRequestDescription(blink::PermissionType::GEOLOCATION,
-                                       user_gesture),
+          PermissionRequestDescription(
+              content::PermissionDescriptorUtil::
+                  CreatePermissionDescriptorForPermissionType(
+                      blink::PermissionType::GEOLOCATION),
+              user_gesture),
           base::BindOnce(&GeolocationServiceImplContext::HandlePermissionStatus,
                          weak_factory_.GetWeakPtr(), std::move(callback)));
 }
diff --git a/content/browser/geolocation/geolocation_service_impl_unittest.cc b/content/browser/geolocation/geolocation_service_impl_unittest.cc
index 51b68733..23373c8 100644
--- a/content/browser/geolocation/geolocation_service_impl_unittest.cc
+++ b/content/browser/geolocation/geolocation_service_impl_unittest.cc
@@ -58,7 +58,8 @@
           void(const std::vector<blink::mojom::PermissionStatus>&)> callback)
       override {
     ASSERT_EQ(request_description.permissions.size(), 1u);
-    EXPECT_EQ(request_description.permissions[0],
+    EXPECT_EQ(blink::PermissionDescriptorToPermissionType(
+                  request_description.permissions[0]),
               blink::PermissionType::GEOLOCATION);
     EXPECT_TRUE(request_description.user_gesture);
     request_callback_.Run(std::move(callback));
diff --git a/content/browser/gpu/gpu_data_manager_impl_private.cc b/content/browser/gpu/gpu_data_manager_impl_private.cc
index 30ac930..ac8e19f 100644
--- a/content/browser/gpu/gpu_data_manager_impl_private.cc
+++ b/content/browser/gpu/gpu_data_manager_impl_private.cc
@@ -435,7 +435,7 @@
 class HDRProxy {
  public:
   static void Initialize() {
-    display::win::ScreenWin::SetRequestHDRStatusCallback(
+    display::win::GetScreenWin()->SetRequestHDRStatusCallback(
         base::BindRepeating(&HDRProxy::RequestHDRStatus));
   }
 
@@ -451,7 +451,7 @@
   }
 
   static void GotResult(gfx::mojom::DXGIInfoPtr dxgi_info) {
-    display::win::ScreenWin::SetDXGIInfo(std::move(dxgi_info));
+    display::win::GetScreenWin()->SetDXGIInfo(std::move(dxgi_info));
   }
 };
 
diff --git a/content/browser/media/captured_surface_control_permission_manager.cc b/content/browser/media/captured_surface_control_permission_manager.cc
index 4691e6e..2fc493d0 100644
--- a/content/browser/media/captured_surface_control_permission_manager.cc
+++ b/content/browser/media/captured_surface_control_permission_manager.cc
@@ -12,6 +12,7 @@
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/common/content_features.h"
 #include "media/base/media_switches.h"
@@ -93,7 +94,10 @@
   permission_controller->RequestPermissionFromCurrentDocument(
       capturer_rfhi,
       PermissionRequestDescription(
-          blink::PermissionType::CAPTURED_SURFACE_CONTROL, user_gesture),
+          content::PermissionDescriptorUtil::
+              CreatePermissionDescriptorForPermissionType(
+                  blink::PermissionType::CAPTURED_SURFACE_CONTROL),
+          user_gesture),
       WrapCallback(std::move(callback)));
 }
 
diff --git a/content/browser/media/key_system_support_impl.cc b/content/browser/media/key_system_support_impl.cc
index 5fdc322..c0017ef2 100644
--- a/content/browser/media/key_system_support_impl.cc
+++ b/content/browser/media/key_system_support_impl.cc
@@ -8,6 +8,7 @@
 #include "content/browser/permissions/permission_util.h"
 #include "content/browser/web_contents/web_contents_impl.h"
 #include "content/public/browser/browser_context.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/render_frame_host.h"
 
 namespace content {
@@ -118,7 +119,9 @@
       ->RequestPermissionFromCurrentDocument(
           &render_frame_host(),
           PermissionRequestDescription(
-              blink::PermissionType::PROTECTED_MEDIA_IDENTIFIER,
+              content::PermissionDescriptorUtil::
+                  CreatePermissionDescriptorForPermissionType(
+                      blink::PermissionType::PROTECTED_MEDIA_IDENTIFIER),
               render_frame_host().HasTransientUserActivation()),
           base::BindOnce(&KeySystemSupportImpl::
                              OnProtectedMediaIdentifierPermissionInitialized,
diff --git a/content/browser/media/key_system_support_impl_unittest.cc b/content/browser/media/key_system_support_impl_unittest.cc
index 79b0f1f..ae660e3 100644
--- a/content/browser/media/key_system_support_impl_unittest.cc
+++ b/content/browser/media/key_system_support_impl_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/test/bind.h"
 #include "base/test/gmock_callback_support.h"
 #include "base/test/mock_callback.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/mock_permission_controller.h"
 #include "content/public/test/test_browser_context.h"
@@ -133,7 +134,9 @@
             RequestPermissionFromCurrentDocument(
                 main_rfh(),
                 PermissionRequestDescription(
-                    blink::PermissionType::PROTECTED_MEDIA_IDENTIFIER,
+                    PermissionDescriptorUtil::
+                        CreatePermissionDescriptorForPermissionType(
+                            blink::PermissionType::PROTECTED_MEDIA_IDENTIFIER),
                     main_rfh()->HasTransientUserActivation()),
                 _))
         .WillByDefault(RunOnceCallback<2>(permission_status));
diff --git a/content/browser/permissions/permission_controller_impl.cc b/content/browser/permissions/permission_controller_impl.cc
index 0c6b537..421baef 100644
--- a/content/browser/permissions/permission_controller_impl.cc
+++ b/content/browser/permissions/permission_controller_impl.cc
@@ -14,7 +14,6 @@
 #include "content/public/browser/disallow_activation_reason.h"
 #include "content/public/browser/permission_controller.h"
 #include "content/public/browser/permission_controller_delegate.h"
-#include "content/public/browser/permission_request_description.h"
 #include "content/public/browser/permission_result.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
@@ -135,7 +134,7 @@
 }
 
 bool IsRequestAllowed(
-    const std::vector<blink::PermissionType>& permissions,
+    const std::vector<blink::mojom::PermissionDescriptorPtr>& permissions,
     RenderFrameHost* render_frame_host,
     base::OnceCallback<void(const std::vector<PermissionStatus>&)>& callback) {
   if (!render_frame_host) {
@@ -156,16 +155,18 @@
 
   // Verify each permission independently to generate proper warning messages.
   bool is_permission_allowed = true;
-  for (PermissionType permission : permissions) {
+  for (const auto& permission : permissions) {
+    PermissionType permission_type =
+        blink::PermissionDescriptorToPermissionType(permission);
     PermissionResult result =
-        VerifyContextOfCurrentDocument(permission, render_frame_host);
+        VerifyContextOfCurrentDocument(permission_type, render_frame_host);
 
     if (result.status == PermissionStatus::DENIED) {
       switch (result.source) {
         case PermissionStatusSource::FENCED_FRAME:
           render_frame_host->GetOutermostMainFrame()->AddMessageToConsole(
               blink::mojom::ConsoleMessageLevel::kWarning,
-              blink::GetPermissionString(permission) +
+              blink::GetPermissionString(permission_type) +
                   " permission has been blocked because it was requested "
                   "inside a fenced frame. Fenced frames don't currently "
                   "support permission requests.");
@@ -174,7 +175,7 @@
         case PermissionStatusSource::FEATURE_POLICY:
           render_frame_host->GetOutermostMainFrame()->AddMessageToConsole(
               blink::mojom::ConsoleMessageLevel::kWarning,
-              blink::GetPermissionString(permission) +
+              blink::GetPermissionString(permission_type) +
                   " permission has been blocked because of a permissions "
                   "policy applied to the current document. See "
                   "https://goo.gl/EuHzyv for more details.");
@@ -253,14 +254,16 @@
     PermissionRequestDescription& description,
     RenderFrameHost* render_frame_host,
     const PermissionOverrides& permission_overrides) {
-  std::vector<blink::PermissionType> permissions_without_overrides;
+  std::vector<blink::mojom::PermissionDescriptorPtr>
+      permissions_without_overrides;
   std::vector<std::optional<blink::mojom::PermissionStatus>> results;
   const url::Origin& origin = render_frame_host->GetLastCommittedOrigin();
   for (const auto& permission : description.permissions) {
     std::optional<blink::mojom::PermissionStatus> override_status =
-        permission_overrides.Get(origin, permission);
+        permission_overrides.Get(
+            origin, blink::PermissionDescriptorToPermissionType(permission));
     if (!override_status) {
-      permissions_without_overrides.push_back(permission);
+      permissions_without_overrides.push_back(permission.Clone());
     }
     results.push_back(override_status);
   }
@@ -428,8 +431,11 @@
     return;
   }
 
-  for (PermissionType permission : request_description.permissions) {
-    NotifySchedulerAboutPermissionRequest(render_frame_host, permission);
+  for (const blink::mojom::PermissionDescriptorPtr& permission :
+       request_description.permissions) {
+    NotifySchedulerAboutPermissionRequest(
+        render_frame_host,
+        blink::PermissionDescriptorToPermissionType(permission));
   }
 
   std::vector<std::optional<blink::mojom::PermissionStatus>> override_results =
@@ -475,8 +481,10 @@
     return;
   }
 
-  for (PermissionType permission : request_description.permissions) {
-    NotifySchedulerAboutPermissionRequest(render_frame_host, permission);
+  for (const auto& permission : request_description.permissions) {
+    NotifySchedulerAboutPermissionRequest(
+        render_frame_host,
+        blink::PermissionDescriptorToPermissionType(permission));
   }
 
   request_description.requesting_origin =
diff --git a/content/browser/permissions/permission_controller_impl_unittest.cc b/content/browser/permissions/permission_controller_impl_unittest.cc
index cbbcec0..c4574bd 100644
--- a/content/browser/permissions/permission_controller_impl_unittest.cc
+++ b/content/browser/permissions/permission_controller_impl_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/test/mock_callback.h"
 #include "content/public/browser/permission_controller.h"
 #include "content/public/browser/permission_controller_delegate.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/mock_permission_manager.h"
 #include "content/public/test/navigation_simulator.h"
@@ -280,19 +281,24 @@
       if (test_case.expect_death) {
         // Death tests cannot track these expectations but arguments should be
         // forwarded to ensure death occurs.
-        ON_CALL(*mock_manager(), RequestPermissionsFromCurrentDocument(
-                                     rfh,
-                                     PermissionRequestDescription(
-                                         test_case.delegated_permissions,
-                                         /*user_gesture*/ true, GURL(kTestUrl)),
-                                     testing::_))
+        ON_CALL(*mock_manager(),
+                RequestPermissionsFromCurrentDocument(
+                    rfh,
+                    PermissionRequestDescription(
+                        content::PermissionDescriptorUtil::
+                            CreatePermissionDescriptorForPermissionTypes(
+                                test_case.delegated_permissions),
+                        /*user_gesture*/ true, GURL(kTestUrl)),
+                    testing::_))
             .WillByDefault(testing::Invoke(forward_callbacks));
       } else {
         EXPECT_CALL(*mock_manager(),
                     RequestPermissionsFromCurrentDocument(
                         rfh,
                         PermissionRequestDescription(
-                            test_case.delegated_permissions,
+                            content::PermissionDescriptorUtil::
+                                CreatePermissionDescriptorForPermissionTypes(
+                                    test_case.delegated_permissions),
                             /*user_gesture*/ true, GURL(kTestUrl)),
                         testing::_))
             .WillOnce(testing::Invoke(forward_callbacks));
@@ -309,8 +315,11 @@
       EXPECT_DEATH_IF_SUPPORTED(
           PermissionControllerRequestPermissionsFromCurrentDocument(
               rfh,
-              PermissionRequestDescription(kTypesToQuery,
-                                           /*user_gesture*/ true),
+              PermissionRequestDescription(
+                  content::PermissionDescriptorUtil::
+                      CreatePermissionDescriptorForPermissionTypes(
+                          kTypesToQuery),
+                  /*user_gesture*/ true),
               callback.Get()),
           "");
     } else {
@@ -319,7 +328,10 @@
                   Run(testing::ElementsAreArray(test_case.expected_results)));
       PermissionControllerRequestPermissionsFromCurrentDocument(
           rfh,
-          PermissionRequestDescription(kTypesToQuery, /*user_gesture*/ true),
+          PermissionRequestDescription(
+              content::PermissionDescriptorUtil::
+                  CreatePermissionDescriptorForPermissionTypes(kTypesToQuery),
+              /*user_gesture*/ true),
           callback.Get());
     }
   }
@@ -368,20 +380,25 @@
         // Death tests cannot track these expectations but arguments should be
         // forwarded to ensure death occurs.
         ON_CALL(*mock_manager(),
-                RequestPermissions(rfh,
-                                   PermissionRequestDescription(
-                                       test_case.delegated_permissions,
-                                       /*user_gesture*/ true, GURL(kTestUrl)),
-                                   testing::_))
+                RequestPermissions(
+                    rfh,
+                    PermissionRequestDescription(
+                        content::PermissionDescriptorUtil::
+                            CreatePermissionDescriptorForPermissionTypes(
+                                test_case.delegated_permissions),
+                        /*user_gesture*/ true, GURL(kTestUrl)),
+                    testing::_))
             .WillByDefault(testing::Invoke(forward_callbacks));
       } else {
-        EXPECT_CALL(
-            *mock_manager(),
-            RequestPermissions(rfh,
-                               PermissionRequestDescription(
-                                   test_case.delegated_permissions,
-                                   /*user_gesture*/ true, GURL(kTestUrl)),
-                               testing::_))
+        EXPECT_CALL(*mock_manager(),
+                    RequestPermissions(
+                        rfh,
+                        PermissionRequestDescription(
+                            content::PermissionDescriptorUtil::
+                                CreatePermissionDescriptorForPermissionTypes(
+                                    test_case.delegated_permissions),
+                            /*user_gesture*/ true, GURL(kTestUrl)),
+                        testing::_))
             .WillOnce(testing::Invoke(forward_callbacks));
       }
     } else {
@@ -396,8 +413,11 @@
       EXPECT_DEATH_IF_SUPPORTED(
           PermissionControllerRequestPermissions(
               rfh,
-              PermissionRequestDescription(kTypesToQuery, /*user_gesture*/ true,
-                                           GURL(kTestUrl)),
+              PermissionRequestDescription(
+                  content::PermissionDescriptorUtil::
+                      CreatePermissionDescriptorForPermissionTypes(
+                          kTypesToQuery),
+                  /*user_gesture*/ true, GURL(kTestUrl)),
               callback.Get()),
           "");
     } else {
@@ -406,8 +426,10 @@
                   Run(testing::ElementsAreArray(test_case.expected_results)));
       PermissionControllerRequestPermissions(
           rfh,
-          PermissionRequestDescription(kTypesToQuery, /*user_gesture*/ true,
-                                       GURL(kTestUrl)),
+          PermissionRequestDescription(
+              content::PermissionDescriptorUtil::
+                  CreatePermissionDescriptorForPermissionTypes(kTypesToQuery),
+              /*user_gesture*/ true, GURL(kTestUrl)),
           callback.Get());
     }
   }
diff --git a/content/browser/permissions/permission_descriptor_util.cc b/content/browser/permissions/permission_descriptor_util.cc
new file mode 100644
index 0000000..02f33dc5
--- /dev/null
+++ b/content/browser/permissions/permission_descriptor_util.cc
@@ -0,0 +1,191 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/public/browser/permission_descriptor_util.h"
+
+namespace {
+static blink::mojom::PermissionDescriptorPtr CreatePermissionDescriptor(
+    blink::mojom::PermissionName name) {
+  auto descriptor = blink::mojom::PermissionDescriptor::New();
+  descriptor->name = name;
+  return descriptor;
+}
+
+static blink::mojom::PermissionDescriptorPtr CreateMidiPermissionDescriptor(
+    bool sysex) {
+  auto descriptor =
+      CreatePermissionDescriptor(blink::mojom::PermissionName::MIDI);
+  auto midi_extension = blink::mojom::MidiPermissionDescriptor::New();
+  midi_extension->sysex = sysex;
+  descriptor->extension = blink::mojom::PermissionDescriptorExtension::NewMidi(
+      std::move(midi_extension));
+  return descriptor;
+}
+
+static blink::mojom::PermissionDescriptorPtr
+CreateClipboardPermissionDescriptor(blink::mojom::PermissionName name,
+                                    bool has_user_gesture,
+                                    bool will_be_sanitized) {
+  auto descriptor = CreatePermissionDescriptor(name);
+  auto clipboard_extension = blink::mojom::ClipboardPermissionDescriptor::New(
+      has_user_gesture, will_be_sanitized);
+  descriptor->extension =
+      blink::mojom::PermissionDescriptorExtension::NewClipboard(
+          std::move(clipboard_extension));
+  return descriptor;
+}
+
+static blink::mojom::PermissionDescriptorPtr
+CreateVideoCapturePermissionDescriptor(bool pan_tilt_zoom) {
+  auto descriptor =
+      CreatePermissionDescriptor(blink::mojom::PermissionName::VIDEO_CAPTURE);
+  auto camera_device_extension =
+      blink::mojom::CameraDevicePermissionDescriptor::New(pan_tilt_zoom);
+  descriptor->extension =
+      blink::mojom::PermissionDescriptorExtension::NewCameraDevice(
+          std::move(camera_device_extension));
+  return descriptor;
+}
+
+static blink::mojom::PermissionDescriptorPtr
+CreateFullscreenPermissionDescriptor(bool allow_without_user_gesture) {
+  auto descriptor =
+      CreatePermissionDescriptor(blink::mojom::PermissionName::FULLSCREEN);
+  auto fullscreen_extension = blink::mojom::FullscreenPermissionDescriptor::New(
+      allow_without_user_gesture);
+  descriptor->extension =
+      blink::mojom::PermissionDescriptorExtension::NewFullscreen(
+          std::move(fullscreen_extension));
+  return descriptor;
+}
+}  // namespace
+
+namespace content {
+
+// static
+blink::mojom::PermissionDescriptorPtr
+content::PermissionDescriptorUtil::CreatePermissionDescriptorForPermissionType(
+    blink::PermissionType permission_type) {
+  switch (permission_type) {
+    case blink::PermissionType::MIDI_SYSEX:
+      return CreateMidiPermissionDescriptor(/*sysex=*/true);
+    case blink::PermissionType::NOTIFICATIONS:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::NOTIFICATIONS);
+    case blink::PermissionType::GEOLOCATION:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::GEOLOCATION);
+    case blink::PermissionType::PROTECTED_MEDIA_IDENTIFIER:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::PROTECTED_MEDIA_IDENTIFIER);
+    case blink::PermissionType::MIDI:
+      return CreateMidiPermissionDescriptor(false);
+    case blink::PermissionType::DURABLE_STORAGE:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::DURABLE_STORAGE);
+    case blink::PermissionType::AUDIO_CAPTURE:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::AUDIO_CAPTURE);
+    case blink::PermissionType::VIDEO_CAPTURE:
+      return CreateVideoCapturePermissionDescriptor(/*pan_tilt_zoom=*/false);
+    case blink::PermissionType::BACKGROUND_SYNC:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::BACKGROUND_SYNC);
+    case blink::PermissionType::SENSORS:
+      return CreatePermissionDescriptor(blink::mojom::PermissionName::SENSORS);
+    case blink::PermissionType::PAYMENT_HANDLER:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::PAYMENT_HANDLER);
+    case blink::PermissionType::BACKGROUND_FETCH:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::BACKGROUND_FETCH);
+    case blink::PermissionType::IDLE_DETECTION:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::IDLE_DETECTION);
+    case blink::PermissionType::PERIODIC_BACKGROUND_SYNC:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::PERIODIC_BACKGROUND_SYNC);
+    case blink::PermissionType::WAKE_LOCK_SCREEN:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::SCREEN_WAKE_LOCK);
+    case blink::PermissionType::WAKE_LOCK_SYSTEM:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::SYSTEM_WAKE_LOCK);
+    case blink::PermissionType::NFC:
+      return CreatePermissionDescriptor(blink::mojom::PermissionName::NFC);
+    case blink::PermissionType::CLIPBOARD_READ_WRITE:
+      return CreateClipboardPermissionDescriptor(
+          blink::mojom::PermissionName::CLIPBOARD_WRITE, false, false);
+    case blink::PermissionType::CLIPBOARD_SANITIZED_WRITE:
+      return CreateClipboardPermissionDescriptor(
+          blink::mojom::PermissionName::CLIPBOARD_WRITE, true, true);
+    case blink::PermissionType::VR:
+      return CreatePermissionDescriptor(blink::mojom::PermissionName::VR);
+    case blink::PermissionType::AR:
+      return CreatePermissionDescriptor(blink::mojom::PermissionName::AR);
+    case blink::PermissionType::STORAGE_ACCESS_GRANT:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::STORAGE_ACCESS);
+    case blink::PermissionType::CAMERA_PAN_TILT_ZOOM:
+      return CreateVideoCapturePermissionDescriptor(true);
+    case blink::PermissionType::WINDOW_MANAGEMENT:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::WINDOW_MANAGEMENT);
+    case blink::PermissionType::LOCAL_FONTS:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::LOCAL_FONTS);
+    case blink::PermissionType::DISPLAY_CAPTURE:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::DISPLAY_CAPTURE);
+    case blink::PermissionType::TOP_LEVEL_STORAGE_ACCESS:
+      NOTREACHED();
+    case blink::PermissionType::CAPTURED_SURFACE_CONTROL:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::CAPTURED_SURFACE_CONTROL);
+    case blink::PermissionType::SMART_CARD:
+      NOTREACHED();
+    case blink::PermissionType::WEB_PRINTING:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::WEB_PRINTING);
+    case blink::PermissionType::SPEAKER_SELECTION:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::SPEAKER_SELECTION);
+    case blink::PermissionType::KEYBOARD_LOCK:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::KEYBOARD_LOCK);
+    case blink::PermissionType::POINTER_LOCK:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::POINTER_LOCK);
+    case blink::PermissionType::AUTOMATIC_FULLSCREEN:
+      return CreateFullscreenPermissionDescriptor(
+          /*allow_without_user_gesture=*/true);
+    case blink::PermissionType::HAND_TRACKING:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::HAND_TRACKING);
+    case blink::PermissionType::WEB_APP_INSTALLATION:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::WEB_APP_INSTALLATION);
+    case blink::PermissionType::LOCAL_NETWORK_ACCESS:
+      return CreatePermissionDescriptor(
+          blink::mojom::PermissionName::LOCAL_NETWORK_ACCESS);
+    case blink::PermissionType::NUM:
+      NOTREACHED();
+  }
+  NOTREACHED();
+}
+
+// static
+std::vector<blink::mojom::PermissionDescriptorPtr>
+PermissionDescriptorUtil::CreatePermissionDescriptorForPermissionTypes(
+    const std::vector<blink::PermissionType>& permission_types) {
+  std::vector<blink::mojom::PermissionDescriptorPtr> descriptors;
+  descriptors.reserve(permission_types.size());
+  for (const auto& permission_type : permission_types) {
+    descriptors.emplace_back(
+        CreatePermissionDescriptorForPermissionType(permission_type));
+  }
+  return descriptors;
+}
+
+}  // namespace content
diff --git a/content/browser/permissions/permission_service_impl.cc b/content/browser/permissions/permission_service_impl.cc
index 0b3987a..d3b7fb7 100644
--- a/content/browser/permissions/permission_service_impl.cc
+++ b/content/browser/permissions/permission_service_impl.cc
@@ -76,38 +76,37 @@
       PermissionStatusToEmbeddedPermissionControlResult(statuses[0]));
 }
 
-// Helper converts the given vector `PermissionDescriptorPtr` to vector
-// `PermissionType`. Checks and returns empty vector if there's duplicate
-// permission in the input vector.
-std::vector<blink::PermissionType> GetPermissionTypesAndCheckDuplicates(
+// Helper which returns true if there are any duplicate or invalid permissions.
+bool HasDuplicatesOrInvalidPermissions(
     const std::vector<PermissionDescriptorPtr>& permissions) {
   std::vector<blink::PermissionType> types(permissions.size());
   std::set<blink::PermissionType> duplicates_check;
   for (size_t i = 0; i < types.size(); ++i) {
-    auto type = blink::PermissionDescriptorToPermissionType(permissions[i]);
+    auto type =
+        blink::MaybePermissionDescriptorToPermissionType(permissions[i]);
     if (!type) {
-      return std::vector<blink::PermissionType>();
+      return true;
     }
 
     types[i] = *type;
 
     bool inserted = duplicates_check.insert(types[i]).second;
     if (!inserted) {
-      return std::vector<blink::PermissionType>();
+      return true;
     }
   }
-
-  return types;
+  return false;
 }
 
 // Helper check if permission types are all supported by Page Embedded
 // Permission.
 bool CheckPageEmbeddedPermissionTypes(
-    const std::vector<blink::PermissionType>& permission_types) {
-  for (auto permission_type : permission_types) {
-    if (permission_type != blink::PermissionType::GEOLOCATION &&
-        permission_type != blink::PermissionType::AUDIO_CAPTURE &&
-        permission_type != blink::PermissionType::VIDEO_CAPTURE) {
+    const std::vector<PermissionDescriptorPtr>& permissions) {
+  for (const auto& permission_type : permissions) {
+    auto type = blink::PermissionDescriptorToPermissionType(permission_type);
+    if (type != blink::PermissionType::GEOLOCATION &&
+        type != blink::PermissionType::AUDIO_CAPTURE &&
+        type != blink::PermissionType::VIDEO_CAPTURE) {
       return false;
     }
   }
@@ -118,9 +117,10 @@
 
 class PermissionServiceImpl::PendingRequest {
  public:
-  PendingRequest(std::vector<blink::PermissionType> types,
-                 RequestPermissionsCallback callback)
-      : callback_(std::move(callback)), request_size_(types.size()) {}
+  PendingRequest(
+      const std::vector<blink::mojom::PermissionDescriptorPtr>& requests,
+      RequestPermissionsCallback callback)
+      : callback_(std::move(callback)), request_size_(requests.size()) {}
 
   ~PendingRequest() {
     if (callback_.is_null())
@@ -209,18 +209,23 @@
   }
 
   if (auto* browser_context = context_->GetBrowserContext()) {
-    std::vector<blink::PermissionType> permission_types =
-        GetPermissionTypesAndCheckDuplicates(descriptor->permissions);
-    if (permission_types.empty() ||
-        !CheckPageEmbeddedPermissionTypes(permission_types)) {
+    if (HasDuplicatesOrInvalidPermissions(descriptor->permissions) ||
+        !CheckPageEmbeddedPermissionTypes(descriptor->permissions)) {
       ReceivedBadMessage();
       return;
     }
 
+    std::vector<PermissionDescriptorPtr> permission_descriptors;
+    permission_descriptors.reserve(descriptor->permissions.size());
+
+    for (PermissionDescriptorPtr& permission : descriptor->permissions) {
+      permission_descriptors.push_back(permission.Clone());
+    }
+
     RequestPermissionsInternal(
-        browser_context, descriptor->permissions,
+        browser_context,
         PermissionRequestDescription(
-            permission_types, /*user_gesture=*/true,
+            std::move(permission_descriptors), /*user_gesture=*/true,
             /*requesting_origin=*/GURL(),
             /*embedded_permission_element_initiated=*/true,
             /*anchor_element_position=*/descriptor->element_position),
@@ -265,24 +270,22 @@
     return;
   }
 
-  std::vector<blink::PermissionType> permission_types =
-      GetPermissionTypesAndCheckDuplicates(permissions);
-  if (permission_types.empty()) {
+  if (HasDuplicatesOrInvalidPermissions(permissions)) {
     ReceivedBadMessage();
     return;
   }
 
   RequestPermissionsInternal(
-      browser_context, permissions,
-      PermissionRequestDescription(permission_types, user_gesture),
+      browser_context,
+      PermissionRequestDescription(std::move(permissions), user_gesture),
       std::move(callback));
 }
 
 void PermissionServiceImpl::RequestPermissionsInternal(
     BrowserContext* browser_context,
-    const std::vector<PermissionDescriptorPtr>& permissions,
     PermissionRequestDescription request_description,
     RequestPermissionsCallback callback) {
+  const auto& permissions = request_description.permissions;
   std::unique_ptr<PendingRequest> pending_request =
       std::make_unique<PendingRequest>(request_description.permissions,
                                        std::move(callback));
@@ -331,7 +334,7 @@
     PermissionDescriptorPtr permission,
     PermissionStatusCallback callback) {
   auto permission_type =
-      blink::PermissionDescriptorToPermissionType(permission);
+      blink::MaybePermissionDescriptorToPermissionType(permission);
   if (!permission_type) {
     ReceivedBadMessage();
     return;
@@ -354,7 +357,7 @@
     PermissionDescriptorPtr permission,
     PermissionStatus last_known_status,
     mojo::PendingRemote<blink::mojom::PermissionObserver> observer) {
-  auto type = blink::PermissionDescriptorToPermissionType(permission);
+  auto type = blink::MaybePermissionDescriptorToPermissionType(permission);
   if (!type) {
     ReceivedBadMessage();
     return;
@@ -376,7 +379,7 @@
         bad_message::PSI_ADD_PAGE_EMBEDDED_PERMISSION_OBSERVER_WITHOUT_FEATURE);
     return;
   }
-  auto type = blink::PermissionDescriptorToPermissionType(permission);
+  auto type = blink::MaybePermissionDescriptorToPermissionType(permission);
   if (!type) {
     ReceivedBadMessage();
     return;
@@ -391,7 +394,7 @@
     blink::mojom::PermissionDescriptorPtr permission,
     const std::string& event_type,
     bool is_added) {
-  auto type = blink::PermissionDescriptorToPermissionType(permission);
+  auto type = blink::MaybePermissionDescriptorToPermissionType(permission);
   if (!type) {
     ReceivedBadMessage();
     return;
@@ -420,7 +423,7 @@
 
 PermissionStatus PermissionServiceImpl::GetPermissionStatus(
     const PermissionDescriptorPtr& permission) {
-  auto type = blink::PermissionDescriptorToPermissionType(permission);
+  auto type = blink::MaybePermissionDescriptorToPermissionType(permission);
   if (!type) {
     ReceivedBadMessage();
     return PermissionStatus::DENIED;
@@ -428,9 +431,13 @@
   if (PermissionUtil::IsDomainOverride(permission) &&
       context_->render_frame_host()) {
     BrowserContext* browser_context = context_->GetBrowserContext();
-    if (browser_context &&
-        PermissionUtil::ValidateDomainOverride(
-            {type.value()}, context_->render_frame_host(), permission)) {
+
+    std::vector<blink::mojom::PermissionDescriptorPtr>
+        permisison_descriptor_ptr_array;
+    permisison_descriptor_ptr_array.emplace_back(permission->Clone());
+    if (browser_context && PermissionUtil::ValidateDomainOverride(
+                               permisison_descriptor_ptr_array,
+                               context_->render_frame_host(), permission)) {
       return PermissionControllerImpl::FromBrowserContext(browser_context)
           ->GetPermissionStatusForEmbeddedRequester(
               *type, context_->render_frame_host(),
@@ -477,7 +484,7 @@
     return PermissionStatus::DENIED;
   }
 
-  auto type = blink::PermissionDescriptorToPermissionType(permission);
+  auto type = blink::MaybePermissionDescriptorToPermissionType(permission);
   if (!type) {
     ReceivedBadMessage();
     return PermissionStatus::DENIED;
diff --git a/content/browser/permissions/permission_service_impl.h b/content/browser/permissions/permission_service_impl.h
index 030e149..b72994a 100644
--- a/content/browser/permissions/permission_service_impl.h
+++ b/content/browser/permissions/permission_service_impl.h
@@ -81,7 +81,6 @@
 
   void RequestPermissionsInternal(
       BrowserContext* browser_context,
-      const std::vector<blink::mojom::PermissionDescriptorPtr>& permissions,
       PermissionRequestDescription request_description,
       RequestPermissionsCallback callback);
 
diff --git a/content/browser/permissions/permission_util.cc b/content/browser/permissions/permission_util.cc
index c8d0ebd..2ff4b3b 100644
--- a/content/browser/permissions/permission_util.cc
+++ b/content/browser/permissions/permission_util.cc
@@ -71,7 +71,7 @@
 }
 
 bool PermissionUtil::ValidateDomainOverride(
-    const std::vector<blink::PermissionType>& types,
+    const std::vector<blink::mojom::PermissionDescriptorPtr>& types,
     RenderFrameHost* rfh,
     const blink::mojom::PermissionDescriptorPtr& descriptor) {
   if (types.size() > 1) {
diff --git a/content/browser/permissions/permission_util.h b/content/browser/permissions/permission_util.h
index 909aee3..b0cafa85 100644
--- a/content/browser/permissions/permission_util.h
+++ b/content/browser/permissions/permission_util.h
@@ -44,7 +44,7 @@
   // mechanism is currently only used by one permission type, specifically
   // storage access requests on behalf of another domain.
   CONTENT_EXPORT static bool ValidateDomainOverride(
-      const std::vector<blink::PermissionType>& types,
+      const std::vector<blink::mojom::PermissionDescriptorPtr>& types,
       RenderFrameHost* rfh,
       const blink::mojom::PermissionDescriptorPtr& descriptor);
 };
diff --git a/content/browser/permissions/permission_util_unittest.cc b/content/browser/permissions/permission_util_unittest.cc
index 89fc20a..6273cb0 100644
--- a/content/browser/permissions/permission_util_unittest.cc
+++ b/content/browser/permissions/permission_util_unittest.cc
@@ -3,7 +3,9 @@
 // found in the LICENSE file.
 
 #include "content/browser/permissions/permission_util.h"
+
 #include "base/test/scoped_feature_list.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/test/test_browser_context.h"
 #include "content/public/test/test_renderer_host.h"
 #include "content/public/test/web_contents_tester.h"
@@ -58,10 +60,14 @@
       {}, nullptr, blink::mojom::PermissionDescriptor::New()));
 }
 TEST_F(PermissionUtilTest, TestInvalidDomainOverrideMultiRequest) {
+  std::vector<blink::mojom::PermissionDescriptorPtr> descriptors;
+  descriptors.emplace_back(
+      PermissionDescriptorUtil::CreatePermissionDescriptorForPermissionType(
+          blink::PermissionType::STORAGE_ACCESS_GRANT));
+  descriptors.emplace_back(descriptors.front()->Clone());
+
   EXPECT_FALSE(PermissionUtil::ValidateDomainOverride(
-      {blink::PermissionType::STORAGE_ACCESS_GRANT,
-       blink::PermissionType::STORAGE_ACCESS_GRANT},
-      nullptr, blink::mojom::PermissionDescriptor::New()));
+      descriptors, nullptr, blink::mojom::PermissionDescriptor::New()));
 }
 TEST_F(PermissionUtilTest, TestInvalidDomainOverrideNullRfh) {
   content::BrowserTaskEnvironment task_environment;
@@ -76,9 +82,13 @@
       WebContentsTester::For(web_contents.get());
   web_contents_tester->NavigateAndCommit(GURL("https://example.xyz"));
 
+  std::vector<blink::mojom::PermissionDescriptorPtr> descriptors;
+  descriptors.emplace_back(
+      PermissionDescriptorUtil::CreatePermissionDescriptorForPermissionType(
+          blink::PermissionType::STORAGE_ACCESS_GRANT));
+
   EXPECT_FALSE(PermissionUtil::ValidateDomainOverride(
-      {blink::PermissionType::STORAGE_ACCESS_GRANT}, nullptr,
-      blink::mojom::PermissionDescriptor::New()));
+      descriptors, nullptr, blink::mojom::PermissionDescriptor::New()));
 }
 
 TEST_F(PermissionUtilTest, TestValidDomainOverride) {
@@ -105,9 +115,13 @@
       blink::mojom::PermissionDescriptorExtension::NewTopLevelStorageAccess(
           std::move(top_level_storage_access_extension));
 
+  std::vector<blink::mojom::PermissionDescriptorPtr> descriptors;
+  descriptors.emplace_back(
+      PermissionDescriptorUtil::CreatePermissionDescriptorForPermissionType(
+          blink::PermissionType::STORAGE_ACCESS_GRANT));
+
   EXPECT_TRUE(PermissionUtil::ValidateDomainOverride(
-      {blink::PermissionType::STORAGE_ACCESS_GRANT},
-      web_contents->GetPrimaryMainFrame(), descriptor));
+      descriptors, web_contents->GetPrimaryMainFrame(), descriptor));
 }
 
 TEST_F(PermissionUtilTest, TestSameOriginInvalidDomainOverride) {
@@ -133,8 +147,11 @@
       blink::mojom::PermissionDescriptorExtension::NewTopLevelStorageAccess(
           std::move(top_level_storage_access_extension));
 
+  std::vector<blink::mojom::PermissionDescriptorPtr> descriptors;
+  descriptors.emplace_back(
+      PermissionDescriptorUtil::CreatePermissionDescriptorForPermissionType(
+          blink::PermissionType::STORAGE_ACCESS_GRANT));
   EXPECT_FALSE(PermissionUtil::ValidateDomainOverride(
-      {blink::PermissionType::STORAGE_ACCESS_GRANT},
-      web_contents->GetPrimaryMainFrame(), descriptor));
+      descriptors, web_contents->GetPrimaryMainFrame(), descriptor));
 }
 }  // namespace content
diff --git a/content/browser/preloading/prerender/prerender_browsertest.cc b/content/browser/preloading/prerender/prerender_browsertest.cc
index a21775b..444959c 100644
--- a/content/browser/preloading/prerender/prerender_browsertest.cc
+++ b/content/browser/preloading/prerender/prerender_browsertest.cc
@@ -1044,7 +1044,6 @@
   }
 
   void OnWaitingForHeadersFinished(
-      NavigationHandle& navigation_handle,
       PrerenderHost::WaitingForHeadersFinishedReason reason) override {
     ASSERT_FALSE(wait_for_headers_finish_reason_.has_value());
     wait_for_headers_finish_reason_ = reason;
diff --git a/content/browser/preloading/prerender/prerender_host.cc b/content/browser/preloading/prerender/prerender_host.cc
index 59a0662a..7f97294 100644
--- a/content/browser/preloading/prerender/prerender_host.cc
+++ b/content/browser/preloading/prerender/prerender_host.cc
@@ -1480,7 +1480,6 @@
 }
 
 void PrerenderHost::OnWaitingForHeadersFinished(
-    NavigationHandle& navigation_handle,
     WaitingForHeadersFinishedReason reason) {
   // Prerender frame tree is alive. This check is also done by the caller.
   CHECK(frame_tree_);
@@ -1491,7 +1490,7 @@
       reason);
 
   for (auto& observer : observers_) {
-    observer.OnWaitingForHeadersFinished(navigation_handle, reason);
+    observer.OnWaitingForHeadersFinished(reason);
   }
 }
 
diff --git a/content/browser/preloading/prerender/prerender_host.h b/content/browser/preloading/prerender/prerender_host.h
index 426423c1..96fe474a 100644
--- a/content/browser/preloading/prerender/prerender_host.h
+++ b/content/browser/preloading/prerender/prerender_host.h
@@ -143,7 +143,6 @@
     // Called from PrerenderHost::OnWaitingForHeadersFinished when we are
     // done blocking navigation waiting for headers.
     virtual void OnWaitingForHeadersFinished(
-        NavigationHandle& navigation_handle,
         WaitingForHeadersFinishedReason reason) {}
 
     // Called from PrerenderHost::RecordFailedFinalStatusImpl when prerendering
@@ -423,8 +422,7 @@
   void OnWaitingForHeadersStarted(NavigationHandle& navigation_handle,
                                   WaitingForHeadersStartedReason reason);
   // Called when we stop blocking navigation while waiting for headers.
-  void OnWaitingForHeadersFinished(NavigationHandle& navigation_handle,
-                                   WaitingForHeadersFinishedReason reason);
+  void OnWaitingForHeadersFinished(WaitingForHeadersFinishedReason reason);
 
   // Returns true iff prefetch ahead of prerender is not available for this
   // prerender and this prerender should be aborted.
diff --git a/content/browser/preloading/prerender/prerender_no_vary_search_hint_commit_deferring_condition.cc b/content/browser/preloading/prerender/prerender_no_vary_search_hint_commit_deferring_condition.cc
index b9d82e7..65ea69d 100644
--- a/content/browser/preloading/prerender/prerender_no_vary_search_hint_commit_deferring_condition.cc
+++ b/content/browser/preloading/prerender/prerender_no_vary_search_hint_commit_deferring_condition.cc
@@ -96,8 +96,8 @@
   if (waiting_on_headers_) {
     waiting_on_headers_ = false;
     prerender_host.OnWaitingForHeadersFinished(
-        GetNavigationHandle(), PrerenderHost::WaitingForHeadersFinishedReason::
-                                   kMaybeNavigationCancelled);
+        PrerenderHost::WaitingForHeadersFinishedReason::
+            kMaybeNavigationCancelled);
   }
 }
 
@@ -236,7 +236,7 @@
       }
     }
     CHECK(reason.has_value());
-    prerender_host.OnWaitingForHeadersFinished(GetNavigationHandle(), *reason);
+    prerender_host.OnWaitingForHeadersFinished(*reason);
   }
 
   // We don't need the timer anymore.
@@ -268,7 +268,6 @@
       // the associated prerender's headers.
       waiting_on_headers_ = false;
       prerender_host.OnWaitingForHeadersFinished(
-          GetNavigationHandle(),
           PrerenderHost::WaitingForHeadersFinishedReason::kHostDestroyed);
     }
   } else {
@@ -301,7 +300,6 @@
     // Let the `prerender_host` know that this navigation is done waiting on the
     // associated prerender's headers.
     prerender_host.OnWaitingForHeadersFinished(
-        GetNavigationHandle(),
         PrerenderHost::WaitingForHeadersFinishedReason::kTimeoutElapsed);
   }
 
diff --git a/content/browser/push_messaging/push_messaging_manager.cc b/content/browser/push_messaging/push_messaging_manager.cc
index f19bfa7..be3cbc6b 100644
--- a/content/browser/push_messaging/push_messaging_manager.cc
+++ b/content/browser/push_messaging/push_messaging_manager.cc
@@ -27,6 +27,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/child_process_host.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/permission_request_description.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/common/content_switches.h"
@@ -346,7 +347,10 @@
               ->RequestPermissionFromCurrentDocument(
                   render_frame_host_impl,
                   PermissionRequestDescription(
-                      blink::PermissionType::NOTIFICATIONS, user_gesture),
+                      PermissionDescriptorUtil::
+                          CreatePermissionDescriptorForPermissionType(
+                              blink::PermissionType::NOTIFICATIONS),
+                      user_gesture),
                   base::BindOnce(
                       &PushMessagingManager::DidRequestPermissionInIncognito,
                       AsWeakPtr(), std::move(data)));
diff --git a/content/browser/renderer_host/direct_manipulation_helper_win.cc b/content/browser/renderer_host/direct_manipulation_helper_win.cc
index e34b45a..83122c7 100644
--- a/content/browser/renderer_host/direct_manipulation_helper_win.cc
+++ b/content/browser/renderer_host/direct_manipulation_helper_win.cc
@@ -166,7 +166,7 @@
 void DirectManipulationHelper::OnPointerHitTest(WPARAM w_param) {
   // Update the device scale factor.
   event_handler_->SetDeviceScaleFactor(
-      display::win::ScreenWin::GetScaleFactorForHWND(window_));
+      display::win::GetScreenWin()->GetScaleFactorForHWND(window_));
 
   // Only DM_POINTERHITTEST can be the first message of input sequence of
   // touchpad input.
diff --git a/content/browser/renderer_host/input/fling_scheduler.cc b/content/browser/renderer_host/input/fling_scheduler.cc
index f1030a74..477389a 100644
--- a/content/browser/renderer_host/input/fling_scheduler.cc
+++ b/content/browser/renderer_host/input/fling_scheduler.cc
@@ -77,7 +77,7 @@
 gfx::Vector2dF FlingScheduler::GetPixelsPerInch(
     const gfx::PointF& position_in_screen) {
 #if BUILDFLAG(IS_WIN)
-  return display::win::ScreenWin::GetPixelsPerInch(position_in_screen);
+  return display::win::GetScreenWin()->GetPixelsPerInch(position_in_screen);
 #else
   return gfx::Vector2dF(input::kDefaultPixelsPerInch,
                         input::kDefaultPixelsPerInch);
diff --git a/content/browser/renderer_host/input/fling_scheduler_unittest.cc b/content/browser/renderer_host/input/fling_scheduler_unittest.cc
index 82fea07..9ffd1da 100644
--- a/content/browser/renderer_host/input/fling_scheduler_unittest.cc
+++ b/content/browser/renderer_host/input/fling_scheduler_unittest.cc
@@ -15,9 +15,7 @@
 #include "content/test/test_render_widget_host.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#if BUILDFLAG(IS_WIN)
-#include "ui/display/win/test/scoped_screen_win.h"
-#elif BUILDFLAG(IS_CHROMEOS)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "ui/display/test/test_screen.h"
 #endif
 
@@ -149,10 +147,7 @@
   scoped_refptr<SiteInstanceGroup> site_instance_group_;
   std::unique_ptr<TestRenderWidgetHostView> view_;
   std::unique_ptr<MockRenderWidgetHostDelegate> delegate_;
-#if BUILDFLAG(IS_WIN)
-  // This is necessary for static methods of `display::ScreenWin`.
-  display::win::test::ScopedScreenWin scoped_screen_win_;
-#elif BUILDFLAG(IS_CHROMEOS)
+#if BUILDFLAG(IS_CHROMEOS)
   // This is necessary on ChromeOS as it needs to access tablet mode info.
   display::test::TestScreen test_screen_{/*create_dispay=*/true,
                                          /*register_screen=*/true};
diff --git a/content/browser/renderer_host/input/stylus_handwriting_callback_sink_win.cc b/content/browser/renderer_host/input/stylus_handwriting_callback_sink_win.cc
index 360116a..9f71911f 100644
--- a/content/browser/renderer_host/input/stylus_handwriting_callback_sink_win.cc
+++ b/content/browser/renderer_host/input/stylus_handwriting_callback_sink_win.cc
@@ -51,8 +51,8 @@
   }
 
   handwriting_callback_.Run(
-      display::win::ScreenWin::ScreenToDIPRect(window, gfx::Rect(rect)),
-      display::win::ScreenWin::ScreenToDIPSize(
+      display::win::GetScreenWin()->ScreenToDIPRect(window, gfx::Rect(rect)),
+      display::win::GetScreenWin()->ScreenToDIPSize(
           window, gfx::Size(distance_threshold.cx, distance_threshold.cy)));
 
   // Check that we have no pending callback.
diff --git a/content/browser/renderer_host/legacy_render_widget_host_win.cc b/content/browser/renderer_host/legacy_render_widget_host_win.cc
index ffbef89..c6e88cee 100644
--- a/content/browser/renderer_host/legacy_render_widget_host_win.cc
+++ b/content/browser/renderer_host/legacy_render_widget_host_win.cc
@@ -124,7 +124,7 @@
 
 void LegacyRenderWidgetHostHWND::SetBounds(const gfx::Rect& bounds) {
   gfx::Rect bounds_in_pixel =
-      display::win::ScreenWin::DIPToClientRect(hwnd(), bounds);
+      display::win::GetScreenWin()->DIPToClientRect(hwnd(), bounds);
   ::SetWindowPos(hwnd(), nullptr, bounds_in_pixel.x(), bounds_in_pixel.y(),
                  bounds_in_pixel.width(), bounds_in_pixel.height(),
                  SWP_NOREDRAW);
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index d70e03b..00b1dc2a 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -266,13 +266,13 @@
               &prefs->status_font_height);
 
   prefs->vertical_scroll_bar_width_in_dips =
-      display::win::ScreenWin::GetSystemMetricsInDIP(SM_CXVSCROLL);
+      display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CXVSCROLL);
   prefs->horizontal_scroll_bar_height_in_dips =
-      display::win::ScreenWin::GetSystemMetricsInDIP(SM_CYHSCROLL);
+      display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CYHSCROLL);
   prefs->arrow_bitmap_height_vertical_scroll_bar_in_dips =
-      display::win::ScreenWin::GetSystemMetricsInDIP(SM_CYVSCROLL);
+      display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CYVSCROLL);
   prefs->arrow_bitmap_width_horizontal_scroll_bar_in_dips =
-      display::win::ScreenWin::GetSystemMetricsInDIP(SM_CXHSCROLL);
+      display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CXHSCROLL);
 #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
   if (command_line->HasSwitch(switches::kSystemFontFamily)) {
diff --git a/content/browser/resources/attribution_reporting/attribution_internals.ts b/content/browser/resources/attribution_reporting/attribution_internals.ts
index 28a27561..049488b 100644
--- a/content/browser/resources/attribution_reporting/attribution_internals.ts
+++ b/content/browser/resources/attribution_reporting/attribution_internals.ts
@@ -434,6 +434,8 @@
             status.replacedByHigherPriorityReport}`,
         false,
       ];
+    } else if (status.expired !== undefined) {
+      return ['Expired', false];
     } else if (status.prohibitedByBrowserPolicy !== undefined) {
       return ['Prohibited by browser policy', false];
     } else if (status.failedToAssemble !== undefined) {
diff --git a/content/browser/service_worker/service_worker_host.cc b/content/browser/service_worker/service_worker_host.cc
index 6c726c7..f01a3e9 100644
--- a/content/browser/service_worker/service_worker_host.cc
+++ b/content/browser/service_worker/service_worker_host.cc
@@ -230,6 +230,8 @@
   storage_partition_impl->GetBlobUrlRegistry()->AddReceiver(
       version()->key(), version()->key().origin(),
       GetProcessHost()->GetDeprecatedID(), std::move(receiver),
+      // Storage access can only be granted to dedicated workers.
+      base::BindRepeating([]() -> bool { return false; }),
       !(GetContentClient()->browser()->IsBlobUrlPartitioningEnabled(
           GetProcessHost()->GetBrowserContext())));
 }
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index 861d6c3..153b8638 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -116,6 +116,7 @@
 #include "content/public/browser/login_delegate.h"
 #include "content/public/browser/network_service_instance.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/permission_result.h"
 #include "content/public/browser/private_aggregation_data_model.h"
 #include "content/public/browser/private_network_device_delegate.h"
@@ -1962,20 +1963,16 @@
 
 void StoragePartitionImpl::DeleteStaleSessionData() {
   GetDOMStorageContext()->StartScavengingUnusedSessionStorage();
-
-  if (base::FeatureList::IsEnabled(
-          features::kDeleteStaleSessionCookiesOnStartup)) {
-    // We need to delay deleting stale session cookies until after the cookie db
-    // has initialized, otherwise we will bypass lazy loading and block.
-    // See crbug.com/40285083 for more info.
-    CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-    GetUIThreadTaskRunner({})->PostDelayedTask(
-        FROM_HERE,
-        base::BindOnce(
-            &StoragePartitionImpl::DeleteStaleSessionOnlyCookiesAfterDelay,
-            weak_factory_.GetWeakPtr()),
-        delete_stale_session_only_cookies_delay_);
-  }
+  // We need to delay deleting stale session cookies until after the cookie db
+  // has initialized, otherwise we will bypass lazy loading and block.
+  // See crbug.com/40285083 for more info.
+  CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+  GetUIThreadTaskRunner({})->PostDelayedTask(
+      FROM_HERE,
+      base::BindOnce(
+          &StoragePartitionImpl::DeleteStaleSessionOnlyCookiesAfterDelay,
+          weak_factory_.GetWeakPtr()),
+      delete_stale_session_only_cookies_delay_);
 }
 
 void StoragePartitionImpl::DeleteStaleSessionOnlyCookiesAfterDelay() {
@@ -2261,7 +2258,9 @@
     permission_controller->RequestPermissionFromCurrentDocument(
         rfh,
         PermissionRequestDescription(
-            blink::PermissionType::LOCAL_NETWORK_ACCESS),
+            content::PermissionDescriptorUtil::
+                CreatePermissionDescriptorForPermissionType(
+                    blink::PermissionType::LOCAL_NETWORK_ACCESS)),
         base::BindOnce(
             [](OnLocalNetworkAccessPermissionRequiredCallback cb,
                PermissionStatus status) {
diff --git a/content/browser/worker_host/dedicated_worker_host.cc b/content/browser/worker_host/dedicated_worker_host.cc
index e9fe38c..d6ec08c 100644
--- a/content/browser/worker_host/dedicated_worker_host.cc
+++ b/content/browser/worker_host/dedicated_worker_host.cc
@@ -81,7 +81,8 @@
     network::mojom::ClientSecurityStatePtr creator_client_security_state,
     base::WeakPtr<CrossOriginEmbedderPolicyReporter> creator_coep_reporter,
     base::WeakPtr<CrossOriginEmbedderPolicyReporter> ancestor_coep_reporter,
-    mojo::PendingReceiver<blink::mojom::DedicatedWorkerHost> host)
+    mojo::PendingReceiver<blink::mojom::DedicatedWorkerHost> host,
+    net::StorageAccessApiStatus storage_access_api_status)
     : service_(service),
       token_(token),
       worker_process_host_(worker_process_host),
@@ -101,7 +102,8 @@
       ancestor_coep_reporter_(std::move(ancestor_coep_reporter)),
       code_cache_host_receivers_(GetProcessHost()
                                      ->GetStoragePartition()
-                                     ->GetGeneratedCodeCacheContext()) {
+                                     ->GetGeneratedCodeCacheContext()),
+      storage_access_api_status_(storage_access_api_status) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(worker_process_host_);
   DCHECK(worker_process_host_->IsInitializedAndNotDead());
@@ -791,6 +793,15 @@
       std::move(receiver));
 }
 
+bool DedicatedWorkerHost::WasStorageAccessGranted() {
+  switch (storage_access_api_status_) {
+    case net::StorageAccessApiStatus::kAccessViaAPI:
+      return true;
+    case net::StorageAccessApiStatus::kNone:
+      return false;
+  }
+}
+
 void DedicatedWorkerHost::CreateBlobUrlStoreProvider(
     mojo::PendingReceiver<blink::mojom::BlobURLStore> receiver) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -800,6 +811,14 @@
   storage_partition_impl->GetBlobUrlRegistry()->AddReceiver(
       GetStorageKey(), renderer_origin_, GetProcessHost()->GetDeprecatedID(),
       std::move(receiver),
+      base::BindRepeating(
+          [](base::WeakPtr<DedicatedWorkerHost> host) -> bool {
+            if (!host) {
+              return false;
+            }
+            return host->WasStorageAccessGranted();
+          },
+          weak_factory_.GetWeakPtr()),
       !(GetContentClient()->browser()->IsBlobUrlPartitioningEnabled(
           GetProcessHost()->GetBrowserContext())),
       storage::BlobURLValidityCheckBehavior::
diff --git a/content/browser/worker_host/dedicated_worker_host.h b/content/browser/worker_host/dedicated_worker_host.h
index c079ef6..2584f21f 100644
--- a/content/browser/worker_host/dedicated_worker_host.h
+++ b/content/browser/worker_host/dedicated_worker_host.h
@@ -112,7 +112,8 @@
       network::mojom::ClientSecurityStatePtr creator_client_security_state,
       base::WeakPtr<CrossOriginEmbedderPolicyReporter> creator_coep_reporter,
       base::WeakPtr<CrossOriginEmbedderPolicyReporter> ancestor_coep_reporter,
-      mojo::PendingReceiver<blink::mojom::DedicatedWorkerHost> host);
+      mojo::PendingReceiver<blink::mojom::DedicatedWorkerHost> host,
+      net::StorageAccessApiStatus storage_access_api_status);
 
   DedicatedWorkerHost(const DedicatedWorkerHost&) = delete;
   DedicatedWorkerHost& operator=(const DedicatedWorkerHost&) = delete;
@@ -160,6 +161,7 @@
       mojo::PendingReceiver<blink::mojom::CodeCacheHost> receiver);
   void CreateBroadcastChannelProvider(
       mojo::PendingReceiver<blink::mojom::BroadcastChannelProvider> receiver);
+  bool WasStorageAccessGranted();
   void CreateBlobUrlStoreProvider(
       mojo::PendingReceiver<blink::mojom::BlobURLStore> receiver);
   void CreateBucketManagerHost(
@@ -430,6 +432,11 @@
 
   BackForwardCacheBlockingDetails bfcache_blocking_details_;
 
+  // This tracks whether the document that created this dedicated worker had
+  // been granted storage access when the dedicated worker was created, which
+  // also grants storage access to the dedicated worker.
+  net::StorageAccessApiStatus storage_access_api_status_;
+
   base::WeakPtrFactory<DedicatedWorkerHost> weak_factory_{this};
 };
 
diff --git a/content/browser/worker_host/dedicated_worker_host_factory_impl.cc b/content/browser/worker_host/dedicated_worker_host_factory_impl.cc
index 66261dd..ca79586b 100644
--- a/content/browser/worker_host/dedicated_worker_host_factory_impl.cc
+++ b/content/browser/worker_host/dedicated_worker_host_factory_impl.cc
@@ -125,7 +125,8 @@
       ancestor_render_frame_host_id_, creator_storage_key_, renderer_origin,
       isolation_info_, std::move(creator_client_security_state_),
       std::move(creator_coep_reporter_), std::move(ancestor_coep_reporter_),
-      pending_remote_host.InitWithNewPipeAndPassReceiver());
+      pending_remote_host.InitWithNewPipeAndPassReceiver(),
+      storage_access_api_status);
   mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker> broker;
   host->BindBrowserInterfaceBrokerReceiver(
       broker.InitWithNewPipeAndPassReceiver());
diff --git a/content/browser/worker_host/shared_worker_host.cc b/content/browser/worker_host/shared_worker_host.cc
index 9c12e04..fbba925 100644
--- a/content/browser/worker_host/shared_worker_host.cc
+++ b/content/browser/worker_host/shared_worker_host.cc
@@ -604,6 +604,8 @@
   storage_partition_impl->GetBlobUrlRegistry()->AddReceiver(
       GetStorageKey(), instance().renderer_origin(),
       GetProcessHost()->GetDeprecatedID(), std::move(receiver),
+      // Storage access can only be granted to dedicated workers.
+      base::BindRepeating([]() -> bool { return false; }),
       !(GetContentClient()->browser()->IsBlobUrlPartitioningEnabled(
           GetProcessHost()->GetBrowserContext())),
       storage::BlobURLValidityCheckBehavior::
diff --git a/content/browser/xr/service/vr_service_impl.cc b/content/browser/xr/service/vr_service_impl.cc
index d79d9dd..2bb5c061 100644
--- a/content/browser/xr/service/vr_service_impl.cc
+++ b/content/browser/xr/service/vr_service_impl.cc
@@ -28,6 +28,7 @@
 #include "content/browser/xr/webxr_internals/webxr_internals_handler_impl.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/permission_request_description.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
@@ -577,8 +578,10 @@
 
   permission_controller->RequestPermissionsFromCurrentDocument(
       render_frame_host_,
-      PermissionRequestDescription(request_permissions,
-                                   /*user_gesture=*/true),
+      PermissionRequestDescription(
+          PermissionDescriptorUtil::
+              CreatePermissionDescriptorForPermissionTypes(request_permissions),
+          /*user_gesture=*/true),
       std::move(result_callback));
 }
 
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityNodeInfoBuilder.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityNodeInfoBuilder.java
index 9e05d0bb..6518259e 100644
--- a/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityNodeInfoBuilder.java
+++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityNodeInfoBuilder.java
@@ -206,7 +206,6 @@
             AccessibilityNodeInfoCompat node,
             int virtualViewId,
             boolean checkable,
-            boolean checked,
             boolean clickable,
             boolean contentInvalid,
             boolean enabled,
@@ -220,7 +219,6 @@
             boolean hasCharacterLocations,
             boolean isRequired) {
         node.setCheckable(checkable);
-        node.setChecked(checked);
         node.setClickable(clickable);
         node.setEnabled(enabled);
         node.setFocusable(focusable);
@@ -406,7 +404,8 @@
             String display,
             String brailleLabel,
             String brailleRoleDescription,
-            int expandedState) {
+            int expandedState,
+            int checked) {
         node.setUniqueId(String.valueOf(virtualViewId));
         node.setClassName(className);
 
@@ -460,6 +459,8 @@
         if (clickableScore > 0) {
             bundle.putInt(EXTRAS_KEY_CLICKABLE_SCORE, clickableScore);
         }
+
+        node.setChecked(checked);
     }
 
     @SuppressLint("NewApi")
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityNodeInfoUtils.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityNodeInfoUtils.java
index a4e467e..5bf1c46 100644
--- a/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityNodeInfoUtils.java
+++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityNodeInfoUtils.java
@@ -136,9 +136,6 @@
         if (node.isCheckable()) {
             builder.append(" checkable");
         }
-        if (node.isChecked()) {
-            builder.append(" checked");
-        }
         if (node.isClickable()) {
             builder.append(" clickable");
         }
@@ -201,6 +198,11 @@
         if (node.getExpandedState() != AccessibilityNodeInfo.EXPANDED_STATE_UNDEFINED) {
             builder.append(" expandedState:").append(node.getExpandedState());
         }
+        if (node.getChecked() == AccessibilityNodeInfo.CHECKED_STATE_TRUE) {
+            builder.append(" checked");
+        } else if (node.getChecked() == AccessibilityNodeInfo.CHECKED_STATE_PARTIAL) {
+            builder.append(" partiallyChecked");
+        }
 
         // Child objects - print for non-null cases.
         if (node.getCollectionInfo() != null) {
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
index 6bf758a..09c16935 100644
--- a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
@@ -74,6 +74,7 @@
 import android.view.ViewParent;
 import android.view.ViewStructure;
 import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
 import android.view.accessibility.AccessibilityNodeInfo;
 import android.view.accessibility.AccessibilityNodeProvider;
 import android.view.autofill.AutofillManager;
@@ -161,6 +162,7 @@
     private static final int AUTO_DISABLE_SINGLE_INSTANCE_TOGGLE_LIMIT = 3;
 
     private final AccessibilityDelegate mDelegate;
+    protected AccessibilityManager mAccessibilityManager;
     protected Context mContext;
     private final @Nullable String mProductVersion;
     protected long mNativeObj;
@@ -280,6 +282,8 @@
         mView = mDelegate.getContainerView();
         mContext = mView.getContext();
         mProductVersion = mDelegate.getProductVersion();
+        mAccessibilityManager =
+                (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
 
         // Need to be initialized before AXTreeUpdate initialization because updateMaxNodesInCache
         // gets called then. Also needs to be initialized before the WindowEventObserver is added,
@@ -522,6 +526,7 @@
     public boolean isAccessibilityEnabled() {
         return isNativeInitialized()
                 && (mAccessibilityEnabledOverride
+                        || mAccessibilityManager.isEnabled()
                         || AccessibilityState.isAnyAccessibilityServiceEnabled());
     }
 
@@ -1906,6 +1911,16 @@
         if (mAccessibilityFocusId == id) {
             sendAccessibilityEvent(id, AccessibilityEvent.TYPE_VIEW_CLICKED);
         }
+
+        if (isAccessibilityEnabled()) {
+            AccessibilityEvent event =
+                    AccessibilityEvent.obtain(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
+            if (event == null) return;
+
+            event.setContentChangeTypes(AccessibilityEvent.CONTENT_CHANGE_TYPE_CHECKED);
+            event.setSource(mView, id);
+            requestSendAccessibilityEvent(event);
+        }
     }
 
     @CalledByNative
@@ -2153,7 +2168,7 @@
                 mView.getParent().requestSendAccessibilityEvent(mView, event);
             } catch (IllegalStateException ignored) {
                 // During boot-up of some content shell tests, events will erroneously be sent even
-                // though accessibility services are not enabled, resulting in a crash.
+                // though the AccessibilityManager is not enabled, resulting in a crash.
                 // TODO(mschillaci): Address flakiness to remove this try/catch, crbug.com/1186376.
             }
         }
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupDropdown.java b/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupDropdown.java
index 52b347c..fdbd4292 100644
--- a/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupDropdown.java
+++ b/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupDropdown.java
@@ -55,8 +55,7 @@
             initialSelection = selected[0];
         }
         mDropdownPopupWindow.setInitialSelection(initialSelection);
-        mDropdownPopupWindow.setAdapter(
-                new DropdownAdapter(context, items, /* separators= */ null));
+        mDropdownPopupWindow.setAdapter(new DropdownAdapter(context, items));
         mDropdownPopupWindow.setRtl(rightAligned);
         mDropdownPopupWindow.setOnDismissListener(
                 new PopupWindow.OnDismissListener() {
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/SelectionClient.java b/content/public/android/java/src/org/chromium/content_public/browser/SelectionClient.java
index a40e626..8a07d9b 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/SelectionClient.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/SelectionClient.java
@@ -4,8 +4,6 @@
 
 package org.chromium.content_public.browser;
 
-import static org.chromium.build.NullUtil.assumeNonNull;
-
 import android.content.Intent;
 import android.graphics.drawable.Drawable;
 import android.view.View.OnClickListener;
@@ -171,7 +169,6 @@
     public static @Nullable SelectionClient createSmartSelectionClient(WebContents webContents) {
         SelectionPopupController selectionPopupController =
                 SelectionPopupController.fromWebContents(webContents);
-        assumeNonNull(selectionPopupController);
         SelectionClient.ResultCallback callback = selectionPopupController.getResultCallback();
         return SmartSelectionClient.fromWebContents(callback, webContents);
     }
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/SelectionPopupController.java b/content/public/android/java/src/org/chromium/content_public/browser/SelectionPopupController.java
index 6760a7b..18a3e0e 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/SelectionPopupController.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/SelectionPopupController.java
@@ -30,12 +30,13 @@
     static final String UMA_MOBILE_ACTION_MODE_SHARE = "MobileActionMode.Share";
 
     /**
-     * @param webContents {@link WebContents} object.
+     * @param webContents A non-destroyed {@link WebContents} object.
      * @return {@link SelectionPopupController} object used for the give WebContents.
-     *         {@code null} if not available.
      */
-    static @Nullable SelectionPopupController fromWebContents(WebContents webContents) {
-        return SelectionPopupControllerImpl.fromWebContents(webContents);
+    static SelectionPopupController fromWebContents(WebContents webContents) {
+        var ret = SelectionPopupControllerImpl.fromWebContents(webContents);
+        assert ret != null;
+        return ret;
     }
 
     /**
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn
index 03fbaa8b..69bf57431 100644
--- a/content/public/browser/BUILD.gn
+++ b/content/public/browser/BUILD.gn
@@ -317,6 +317,7 @@
     "permission_controller.h",
     "permission_controller_delegate.cc",
     "permission_controller_delegate.h",
+    "permission_descriptor_util.h",
     "permission_overrides.cc",
     "permission_overrides.h",
     "permission_request_description.cc",
diff --git a/content/public/browser/permission_descriptor_util.h b/content/public/browser/permission_descriptor_util.h
new file mode 100644
index 0000000..7d26c83
--- /dev/null
+++ b/content/public/browser/permission_descriptor_util.h
@@ -0,0 +1,37 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_PUBLIC_BROWSER_PERMISSION_DESCRIPTOR_UTIL_H_
+#define CONTENT_PUBLIC_BROWSER_PERMISSION_DESCRIPTOR_UTIL_H_
+
+#include "content/common/content_export.h"
+#include "third_party/blink/public/common/permissions/permission_utils.h"
+#include "third_party/blink/public/mojom/permissions/permission.mojom.h"
+
+namespace content {
+
+class PermissionDescriptorUtil {
+ public:
+  // Utility function that creates a default `PermissionDescriptorPtr` for the a
+  // PermissionType. Used only for
+  // simple ContentSetting types without options while refactorings to support
+  // permission options are performed.
+  // TODO(https://crbug.com/406755622): Remove mapping function
+  CONTENT_EXPORT static blink::mojom::PermissionDescriptorPtr
+  CreatePermissionDescriptorForPermissionType(
+      blink::PermissionType permission_type);
+
+  // Utility function that creates a vector of default
+  // `PermissionDescriptorPtr`s for a vector of `PermissionType. Used only for
+  // simple ContentSetting types without options while refactorings to support
+  // permission options are performed.
+  // TODO(https://crbug.com/406755622): Remove mapping function
+  CONTENT_EXPORT static std::vector<blink::mojom::PermissionDescriptorPtr>
+  CreatePermissionDescriptorForPermissionTypes(
+      const std::vector<blink::PermissionType>& permission_types);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_PUBLIC_BROWSER_PERMISSION_DESCRIPTOR_UTIL_H_
diff --git a/content/public/browser/permission_request_description.cc b/content/public/browser/permission_request_description.cc
index 78dce7a..94661d7 100644
--- a/content/public/browser/permission_request_description.cc
+++ b/content/public/browser/permission_request_description.cc
@@ -7,12 +7,12 @@
 namespace content {
 
 PermissionRequestDescription::PermissionRequestDescription(
-    const std::vector<blink::PermissionType>& permissions,
+    std::vector<blink::mojom::PermissionDescriptorPtr> permissions,
     bool user_gesture,
     const GURL& requesting_origin,
     bool embedded_permission_element_initiated,
     const std::optional<gfx::Rect>& anchor_element_position)
-    : permissions(permissions),
+    : permissions(std::move(permissions)),
       user_gesture(user_gesture),
       requesting_origin(requesting_origin),
       embedded_permission_element_initiated(
@@ -20,20 +20,33 @@
       anchor_element_position(anchor_element_position) {}
 
 PermissionRequestDescription::PermissionRequestDescription(
-    blink::PermissionType permission,
+    blink::mojom::PermissionDescriptorPtr permission,
     bool user_gesture,
     const GURL& requesting_origin,
     bool embedded_permission_element_initiated,
     const std::optional<gfx::Rect>& anchor_element_position)
-    : PermissionRequestDescription(
-          std::vector<blink::PermissionType>{permission},
-          user_gesture,
-          requesting_origin,
-          embedded_permission_element_initiated,
-          anchor_element_position) {}
+    : user_gesture(user_gesture),
+      requesting_origin(requesting_origin),
+      embedded_permission_element_initiated(
+          embedded_permission_element_initiated),
+      anchor_element_position(anchor_element_position) {
+  permissions.push_back(std::move(permission));
+}
 
 PermissionRequestDescription::PermissionRequestDescription(
-    const PermissionRequestDescription&) = default;
+    const PermissionRequestDescription& other) {
+  for (const auto& permission : other.permissions) {
+    permissions.push_back(permission.Clone());
+  }
+  user_gesture = other.user_gesture;
+  requesting_origin = other.requesting_origin;
+  embedded_permission_element_initiated =
+      other.embedded_permission_element_initiated;
+  anchor_element_position = other.anchor_element_position;
+  requested_audio_capture_device_ids = other.requested_audio_capture_device_ids;
+  requested_video_capture_device_ids = other.requested_video_capture_device_ids;
+}
+
 PermissionRequestDescription& PermissionRequestDescription::operator=(
     PermissionRequestDescription&&) = default;
 PermissionRequestDescription::PermissionRequestDescription(
diff --git a/content/public/browser/permission_request_description.h b/content/public/browser/permission_request_description.h
index 13bed1d..3d5ff8da 100644
--- a/content/public/browser/permission_request_description.h
+++ b/content/public/browser/permission_request_description.h
@@ -10,6 +10,7 @@
 
 #include "content/common/content_export.h"
 #include "third_party/blink/public/common/permissions/permission_utils.h"
+#include "third_party/blink/public/mojom/permissions/permission.mojom.h"
 #include "third_party/blink/public/mojom/permissions/permission_status.mojom.h"
 #include "ui/gfx/geometry/rect.h"
 #include "url/gurl.h"
@@ -20,14 +21,14 @@
 // permission from a renderer, including important contextual information.
 struct CONTENT_EXPORT PermissionRequestDescription {
   explicit PermissionRequestDescription(
-      const std::vector<blink::PermissionType>& permissions,
+      std::vector<blink::mojom::PermissionDescriptorPtr> permissions,
       bool user_gesture = false,
       const GURL& requesting_origin = GURL(),
       bool embedded_permission_element_initiated = false,
       const std::optional<gfx::Rect>& anchor_element_position = std::nullopt);
 
   explicit PermissionRequestDescription(
-      blink::PermissionType permission,
+      blink::mojom::PermissionDescriptorPtr permissions,
       bool user_gesture = false,
       const GURL& requesting_origin = GURL(),
       bool embedded_permission_element_initiated = false,
@@ -46,7 +47,7 @@
   bool operator==(const PermissionRequestDescription& other) const;
 
   // Define the list of permissions we will request.
-  std::vector<blink::PermissionType> permissions;
+  std::vector<blink::mojom::PermissionDescriptorPtr> permissions;
 
   // Indicates the request is initiated by a user gesture.
   bool user_gesture;
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index f3fef131a..a10c9e4 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -256,13 +256,6 @@
 const base::FeatureParam<int> kCreateSpeculativeRFHDelayMs{
     &kDeferSpeculativeRFHCreation, "create_speculative_rfh_delay_ms", 0};
 
-// Clears session cookies last accessed/modified more than 7 days ago on startup
-// even when session restore is enabled.
-// See crbug.com/40285083 for more info.
-BASE_FEATURE(kDeleteStaleSessionCookiesOnStartup,
-             "DeleteStaleSessionCookiesOnStartup",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 // When a device bound session
 // (https://github.com/w3c/webappsec-dbsc/blob/main/README.md) is
 // terminated, evict pages with cache-control:no-store from the
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 8361290..66a59fc 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -80,7 +80,6 @@
     kCreateSpeculativeRFHFilterRestore;
 CONTENT_EXPORT extern const base::FeatureParam<int>
     kCreateSpeculativeRFHDelayMs;
-CONTENT_EXPORT BASE_DECLARE_FEATURE(kDeleteStaleSessionCookiesOnStartup);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(
     kDeviceBoundSessionTerminationEvictBackForwardCache);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kDevToolsPrivacyUI);
diff --git a/content/shell/browser/shell_permission_manager.cc b/content/shell/browser/shell_permission_manager.cc
index 86ff5ea..854d84e 100644
--- a/content/shell/browser/shell_permission_manager.cc
+++ b/content/shell/browser/shell_permission_manager.cc
@@ -103,9 +103,11 @@
   }
   std::vector<blink::mojom::PermissionStatus> result;
   for (const auto& permission : request_description.permissions) {
-    result.push_back(IsAllowlistedPermissionType(permission)
-                         ? blink::mojom::PermissionStatus::GRANTED
-                         : blink::mojom::PermissionStatus::DENIED);
+    result.push_back(
+        IsAllowlistedPermissionType(
+            blink::PermissionDescriptorToPermissionType(permission))
+            ? blink::mojom::PermissionStatus::GRANTED
+            : blink::mojom::PermissionStatus::DENIED);
   }
   std::move(callback).Run(result);
 }
@@ -129,9 +131,11 @@
   }
   std::vector<blink::mojom::PermissionStatus> result;
   for (const auto& permission : request_description.permissions) {
-    result.push_back(IsAllowlistedPermissionType(permission)
-                         ? blink::mojom::PermissionStatus::GRANTED
-                         : blink::mojom::PermissionStatus::DENIED);
+    result.push_back(
+        IsAllowlistedPermissionType(
+            blink::PermissionDescriptorToPermissionType(permission))
+            ? blink::mojom::PermissionStatus::GRANTED
+            : blink::mojom::PermissionStatus::DENIED);
   }
   std::move(callback).Run(result);
 }
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 146122f..b9a093b 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -3629,7 +3629,7 @@
   bundle_data("content_test_perfetto_bundle_data") {
     testonly = true
     _relative_path = "third_party/perfetto/protos/perfetto/config/chrome"
-    public_deps = [ "//third_party/perfetto/protos/perfetto/config/chrome:scenario_descriptor" ]
+    public_deps = [ "//third_party/perfetto/protos/perfetto/config/chrome:scenario_descriptor_gen" ]
     sources = [ "$root_gen_dir/$_relative_path/scenario_config.descriptor" ]
     outputs =
         [ "{{bundle_resources_dir}}/gen/$_relative_path/{{source_file_part}}" ]
diff --git a/content/test/content_test_bundle_data.filelist b/content/test/content_test_bundle_data.filelist
index 42519ca..05a747160 100644
--- a/content/test/content_test_bundle_data.filelist
+++ b/content/test/content_test_bundle_data.filelist
@@ -7121,6 +7121,7 @@
 data/gpu/pixel_webgl_read_pixels_tab_switch.html
 data/gpu/pixel_webgl_resized_canvas.html
 data/gpu/pixel_webgl_sad_canvas.html
+data/gpu/pixel_webgl_texture_from_webgl_readback.html
 data/gpu/pixel_webgl_util.js
 data/gpu/pixel_webgl_webcodecs_breakoutbox_displays_frame.html
 data/gpu/pixel_webgpu_cached_swap_buffer_invalidated.html
diff --git a/content/test/data/accessibility/aria/aria-button-expected-android-external.txt b/content/test/data/accessibility/aria/aria-button-expected-android-external.txt
index 371fc67..38bd284b 100644
--- a/content/test/data/accessibility/aria/aria-button-expected-android-external.txt
+++ b/content/test/data/accessibility/aria/aria-button-expected-android-external.txt
@@ -1,11 +1,11 @@
 WebView focusable focused actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
 ++Button text:"Button1" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="button", roleDescription="button"]
-++ToggleButton text:"Button2" stateDescription:"On" checkable checked clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="toggleButton", roleDescription="toggle button"]
+++ToggleButton text:"Button2" stateDescription:"On" checkable clickable focusable checked actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="toggleButton", roleDescription="toggle button"]
 ++ToggleButton text:"Button3" stateDescription:"Off" checkable clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="toggleButton", roleDescription="toggle button"]
 ++Button text:"Button4" canOpenPopUp clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="popUpButton", roleDescription="menu pop up button"]
 ++Button text:"Button5" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="button", roleDescription="button"]
 ++Button text:"Complex button " clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="button", roleDescription="button"]
-++ToggleButton text:"Complex toggle button " stateDescription:"On" checkable checked clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="toggleButton", roleDescription="toggle button"]
+++ToggleButton text:"Complex toggle button " stateDescription:"On" checkable clickable focusable checked actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="toggleButton", roleDescription="toggle button"]
 ++++TextView text:"Complex toggle button " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"]
 ++++EditText clickable editable focusable inputType:1 textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, PASTE, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300"]
 ++Button text:"Complex pop up button " canOpenPopUp clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="popUpButton", roleDescription="menu pop up button"]
diff --git a/content/test/data/accessibility/aria/aria-button-expected-android.txt b/content/test/data/accessibility/aria/aria-button-expected-android.txt
index 76284f5..4902757 100644
--- a/content/test/data/accessibility/aria/aria-button-expected-android.txt
+++ b/content/test/data/accessibility/aria/aria-button-expected-android.txt
@@ -1,11 +1,11 @@
 android.webkit.WebView focusable focused
 ++android.widget.Button role_description='button' clickable focusable interesting name='Button1'
-++android.widget.ToggleButton role_description='toggle button' checkable checked clickable focusable interesting name='Button2' state_description='On'
+++android.widget.ToggleButton role_description='toggle button' checkable clickable focusable interesting name='Button2' state_description='On' checked=1
 ++android.widget.ToggleButton role_description='toggle button' checkable clickable focusable interesting name='Button3' state_description='Off'
 ++android.widget.Button role_description='menu pop up button' clickable focusable interesting name='Button4'
 ++android.widget.Button role_description='button' clickable focusable interesting name='Button5'
 ++android.widget.Button role_description='button' clickable focusable interesting name='Complex button '
-++android.widget.ToggleButton role_description='toggle button' checkable checked clickable focusable interesting name='Complex toggle button ' state_description='On'
+++android.widget.ToggleButton role_description='toggle button' checkable clickable focusable interesting name='Complex toggle button ' state_description='On' checked=1
 ++++android.widget.TextView name='Complex toggle button '
 ++++android.widget.EditText clickable editable_text focusable interesting input_type=1
 ++android.widget.Button role_description='menu pop up button' clickable focusable interesting name='Complex pop up button '
diff --git a/content/test/data/accessibility/aria/aria-checkbox-expected-android-external.txt b/content/test/data/accessibility/aria/aria-checkbox-expected-android-external.txt
index 38e335a4..2bc6890b 100644
--- a/content/test/data/accessibility/aria/aria-checkbox-expected-android-external.txt
+++ b/content/test/data/accessibility/aria/aria-checkbox-expected-android-external.txt
@@ -1,7 +1,7 @@
 WebView focusable focused actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
-++CheckBox text:"CheckBox1" checkable checked clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="checkBox", roleDescription="checkbox"]
+++CheckBox text:"CheckBox1" checkable clickable focusable checked actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="checkBox", roleDescription="checkbox"]
 ++CheckBox text:"CheckBox2" checkable clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="checkBox", roleDescription="checkbox"]
-++CheckBox text:"CheckBox3" stateDescription:"Partially Checked" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="checkBox", roleDescription="checkbox"]
+++CheckBox text:"CheckBox3" checkable clickable focusable partiallyChecked actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="checkBox", roleDescription="checkbox"]
 ++CheckBox text:"CheckBox4" checkable clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="checkBox", roleDescription="checkbox"]
 ++CheckBox text:"Complex checkbox" checkable clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="checkBox", roleDescription="checkbox"]
 ++++TextView text:"Complex " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"]
diff --git a/content/test/data/accessibility/aria/aria-checkbox-expected-android.txt b/content/test/data/accessibility/aria/aria-checkbox-expected-android.txt
index d9e8d2a..28a79eeb 100644
--- a/content/test/data/accessibility/aria/aria-checkbox-expected-android.txt
+++ b/content/test/data/accessibility/aria/aria-checkbox-expected-android.txt
@@ -1,7 +1,7 @@
 android.webkit.WebView focusable focused
-++android.widget.CheckBox role_description='checkbox' checkable checked clickable focusable interesting name='CheckBox1'
+++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting name='CheckBox1' checked=1
 ++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting name='CheckBox2'
-++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting name='CheckBox3' state_description='Partially Checked'
+++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting name='CheckBox3' checked=2
 ++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting name='CheckBox4'
 ++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting name='Complex checkbox'
 ++++android.widget.TextView name='Complex '
diff --git a/content/test/data/accessibility/aria/aria-checked-expected-android-external.txt b/content/test/data/accessibility/aria/aria-checked-expected-android-external.txt
index 41c261e..49652c05c 100644
--- a/content/test/data/accessibility/aria/aria-checked-expected-android-external.txt
+++ b/content/test/data/accessibility/aria/aria-checked-expected-android-external.txt
@@ -1,4 +1,4 @@
 WebView focusable focused actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
-++CheckBox checkable checked clickable focusable actions:[FOCUS, CLICK, AX_FOCUS] bundle:[chromeRole="checkBox", roleDescription="checkbox"]
+++CheckBox checkable clickable focusable checked actions:[FOCUS, CLICK, AX_FOCUS] bundle:[chromeRole="checkBox", roleDescription="checkbox"]
 ++CheckBox checkable clickable focusable actions:[FOCUS, CLICK, AX_FOCUS] bundle:[chromeRole="checkBox", roleDescription="checkbox"]
-++CheckBox stateDescription:"Partially Checked" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS] bundle:[chromeRole="checkBox", roleDescription="checkbox"]
+++CheckBox checkable clickable focusable partiallyChecked actions:[FOCUS, CLICK, AX_FOCUS] bundle:[chromeRole="checkBox", roleDescription="checkbox"]
diff --git a/content/test/data/accessibility/aria/aria-checked-expected-android.txt b/content/test/data/accessibility/aria/aria-checked-expected-android.txt
index 7396643..3e2b1c1 100644
--- a/content/test/data/accessibility/aria/aria-checked-expected-android.txt
+++ b/content/test/data/accessibility/aria/aria-checked-expected-android.txt
@@ -1,4 +1,4 @@
 android.webkit.WebView focusable focused
-++android.widget.CheckBox role_description='checkbox' checkable checked clickable focusable interesting
+++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting checked=1
 ++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting
-++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting state_description='Partially Checked'
+++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting checked=2
diff --git a/content/test/data/accessibility/aria/aria-illegal-val-expected-android-external.txt b/content/test/data/accessibility/aria/aria-illegal-val-expected-android-external.txt
index 2852056..d958915 100644
--- a/content/test/data/accessibility/aria/aria-illegal-val-expected-android-external.txt
+++ b/content/test/data/accessibility/aria/aria-illegal-val-expected-android-external.txt
@@ -2,7 +2,7 @@
 ++View supplementalDescription:"Atomic illegal" liveRegion:1 actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="log", roleDescription="log"]
 ++EditText supplementalDescription:"Autocomplete illegal" clickable editable textSelectionStart:0 textSelectionEnd:0 actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS, PASTE, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField"]
 ++View supplementalDescription:"Busy illegal" liveRegion:1 actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="log", roleDescription="log"]
-++View contentDescription:"Checked illegal" checkable checked clickable CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=0, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="treeItem", roleDescription="tree item"]
+++View contentDescription:"Checked illegal" checkable clickable checked CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=0, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="treeItem", roleDescription="tree item"]
 ++View stateDescription:"current item" supplementalDescription:"Current illegal" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="group"]
 ++View supplementalDescription:"Disabled illegal" disabled actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="group"]
 ++View contentDescription:"Expanded illegal" clickable expandedState:3 CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=0, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS, COLLAPSE] bundle:[chromeRole="treeItem", roleDescription="tree item"]
@@ -13,7 +13,7 @@
 ++EditText supplementalDescription:"Multiline illegal" clickable editable multiLine textSelectionStart:0 textSelectionEnd:0 actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS, PASTE, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField"]
 ++GridView stateDescription:"multiselectable, none selected." supplementalDescription:"Multiselectable illegal" CollectionInfo:[selection_mode_multiple, rows=0, cols=0] actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="grid", roleDescription="table"]
 ++SeekBar text:"50" supplementalDescription:"Orientation illegal" clickable RangeInfo:[current=50.0, min=0.0, max=100.0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS, SET_PROGRESS] bundle:[chromeRole="slider", roleDescription="slider"]
-++ToggleButton stateDescription:"On" supplementalDescription:"Pressed illegal" checkable checked clickable actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="toggleButton", roleDescription="toggle button"]
+++ToggleButton stateDescription:"On" supplementalDescription:"Pressed illegal" checkable clickable checked actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="toggleButton", roleDescription="toggle button"]
 ++EditText supplementalDescription:"Readonly illegal" clickable editable disabled textSelectionStart:0 textSelectionEnd:0 actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="textField"]
 ++View supplementalDescription:"Relevant illegal" liveRegion:1 actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="log", roleDescription="log"]
 ++EditText supplementalDescription:"Required illegal" clickable editable required textSelectionStart:0 textSelectionEnd:0 actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS, PASTE, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField"]
diff --git a/content/test/data/accessibility/aria/aria-illegal-val-expected-android.txt b/content/test/data/accessibility/aria/aria-illegal-val-expected-android.txt
index b18b3308..5b9fb24 100644
--- a/content/test/data/accessibility/aria/aria-illegal-val-expected-android.txt
+++ b/content/test/data/accessibility/aria/aria-illegal-val-expected-android.txt
@@ -2,7 +2,7 @@
 ++android.view.View role_description='log' interesting supplemental_description='Atomic illegal' live_region_type=1
 ++android.widget.EditText clickable editable_text interesting supplemental_description='Autocomplete illegal'
 ++android.view.View role_description='log' interesting supplemental_description='Busy illegal' live_region_type=1
-++android.view.View role_description='tree item' checkable checked clickable collection_item interesting content_description='Checked illegal'
+++android.view.View role_description='tree item' checkable clickable collection_item interesting content_description='Checked illegal' checked=1
 ++android.view.View interesting state_description='current item' supplemental_description='Current illegal'
 ++android.view.View disabled interesting supplemental_description='Disabled illegal'
 ++android.view.View role_description='tree item' clickable collection_item expanded interesting content_description='Expanded illegal' expanded_state=3
@@ -13,7 +13,7 @@
 ++android.widget.EditText clickable editable_text multiline interesting supplemental_description='Multiline illegal'
 ++android.widget.GridView role_description='table' collection multiselectable interesting state_description='multiselectable, none selected.' supplemental_description='Multiselectable illegal' selection_mode=2
 ++android.widget.SeekBar role_description='slider' clickable range interesting name='50' supplemental_description='Orientation illegal' item_index=50 item_count=100 range_max=100 range_current_value=50
-++android.widget.ToggleButton role_description='toggle button' checkable checked clickable interesting state_description='On' supplemental_description='Pressed illegal'
+++android.widget.ToggleButton role_description='toggle button' checkable clickable interesting state_description='On' supplemental_description='Pressed illegal' checked=1
 ++android.widget.EditText clickable disabled editable_text interesting supplemental_description='Readonly illegal'
 ++android.view.View role_description='log' interesting supplemental_description='Relevant illegal' live_region_type=1
 ++android.widget.EditText clickable editable_text required interesting supplemental_description='Required illegal'
diff --git a/content/test/data/accessibility/aria/aria-menuitemcheckbox-expected-android-external.txt b/content/test/data/accessibility/aria/aria-menuitemcheckbox-expected-android-external.txt
index 5fa566c6..77c9f728 100644
--- a/content/test/data/accessibility/aria/aria-menuitemcheckbox-expected-android-external.txt
+++ b/content/test/data/accessibility/aria/aria-menuitemcheckbox-expected-android-external.txt
@@ -1,5 +1,5 @@
 WebView focusable focused actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
 ++View CollectionInfo:[rows=3, cols=1] actions:[AX_FOCUS] bundle:[chromeRole="menu", roleDescription="menu"]
 ++++MenuItem text:"Menu item 1" checkable clickable CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=0, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="menuItemCheckBox", roleDescription="checkbox"]
-++++MenuItem text:"Menu item 2" checkable checked clickable CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=1, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="menuItemCheckBox", roleDescription="checkbox"]
-++++MenuItem text:"Menu item 3" stateDescription:"Partially Checked" clickable CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=2, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="menuItemCheckBox", roleDescription="checkbox"]
+++++MenuItem text:"Menu item 2" checkable clickable checked CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=1, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="menuItemCheckBox", roleDescription="checkbox"]
+++++MenuItem text:"Menu item 3" checkable clickable partiallyChecked CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=2, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="menuItemCheckBox", roleDescription="checkbox"]
diff --git a/content/test/data/accessibility/aria/aria-menuitemcheckbox-expected-android.txt b/content/test/data/accessibility/aria/aria-menuitemcheckbox-expected-android.txt
index eb73070..d8d7078 100644
--- a/content/test/data/accessibility/aria/aria-menuitemcheckbox-expected-android.txt
+++ b/content/test/data/accessibility/aria/aria-menuitemcheckbox-expected-android.txt
@@ -1,5 +1,5 @@
 android.webkit.WebView focusable focused
 ++android.view.View role_description='menu' collection item_count=3 row_count=3 column_count=1
 ++++android.view.MenuItem role_description='checkbox' checkable clickable collection_item interesting name='Menu item 1'
-++++android.view.MenuItem role_description='checkbox' checkable checked clickable collection_item interesting name='Menu item 2' item_index=1 row_index=1
-++++android.view.MenuItem role_description='checkbox' checkable clickable collection_item interesting name='Menu item 3' state_description='Partially Checked' item_index=2 row_index=2
+++++android.view.MenuItem role_description='checkbox' checkable clickable collection_item interesting name='Menu item 2' item_index=1 row_index=1 checked=1
+++++android.view.MenuItem role_description='checkbox' checkable clickable collection_item interesting name='Menu item 3' item_index=2 row_index=2 checked=2
diff --git a/content/test/data/accessibility/aria/aria-menuitemradio-expected-android-external.txt b/content/test/data/accessibility/aria/aria-menuitemradio-expected-android-external.txt
index 01bc8da..181846a 100644
--- a/content/test/data/accessibility/aria/aria-menuitemradio-expected-android-external.txt
+++ b/content/test/data/accessibility/aria/aria-menuitemradio-expected-android-external.txt
@@ -1,5 +1,5 @@
 WebView focusable focused actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
 ++View CollectionInfo:[rows=3, cols=1] actions:[AX_FOCUS] bundle:[chromeRole="menu", roleDescription="menu"]
 ++++MenuItem text:"Menu item 1" checkable clickable CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=0, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="menuItemRadio", roleDescription="radio button"]
-++++MenuItem text:"Menu item 2" checkable checked clickable CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=1, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="menuItemRadio", roleDescription="radio button"]
+++++MenuItem text:"Menu item 2" checkable clickable checked CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=1, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="menuItemRadio", roleDescription="radio button"]
 ++++MenuItem text:"Menu item 3" checkable clickable CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=2, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="menuItemRadio", roleDescription="radio button"]
diff --git a/content/test/data/accessibility/aria/aria-menuitemradio-expected-android.txt b/content/test/data/accessibility/aria/aria-menuitemradio-expected-android.txt
index 2d79b349..f0ecca459 100644
--- a/content/test/data/accessibility/aria/aria-menuitemradio-expected-android.txt
+++ b/content/test/data/accessibility/aria/aria-menuitemradio-expected-android.txt
@@ -1,5 +1,5 @@
 android.webkit.WebView focusable focused
 ++android.view.View role_description='menu' collection item_count=3 row_count=3 column_count=1
 ++++android.view.MenuItem role_description='radio button' checkable clickable collection_item interesting name='Menu item 1'
-++++android.view.MenuItem role_description='radio button' checkable checked clickable collection_item interesting name='Menu item 2' item_index=1 row_index=1
+++++android.view.MenuItem role_description='radio button' checkable clickable collection_item interesting name='Menu item 2' item_index=1 row_index=1 checked=1
 ++++android.view.MenuItem role_description='radio button' checkable clickable collection_item interesting name='Menu item 3' item_index=2 row_index=2
diff --git a/content/test/data/accessibility/aria/aria-posinset-expected-android-external.txt b/content/test/data/accessibility/aria/aria-posinset-expected-android-external.txt
index f5cd9b6..afcbba4 100644
--- a/content/test/data/accessibility/aria/aria-posinset-expected-android-external.txt
+++ b/content/test/data/accessibility/aria/aria-posinset-expected-android-external.txt
@@ -20,7 +20,7 @@
 ++TextView text:"Banana" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"]
 ++View text:"Cake" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="group"]
 ++++View text:"Cake" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="legend"]
-++++RadioButton text:"Chiffon cakes" stateDescription:"Checked. In group, option 1 of 2" checkable checked clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="radioButton", clickableScore="300", roleDescription="radio button"]
+++++RadioButton text:"Chiffon cakes" stateDescription:"Checked. In group, option 1 of 2" checkable clickable focusable checked actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="radioButton", clickableScore="300", roleDescription="radio button"]
 ++++View text:"\n" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="lineBreak"]
 ++++RadioButton text:"Chocolate cakes" stateDescription:"Not checked. In group, option 2 of 2" checkable clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="radioButton", clickableScore="300", roleDescription="radio button"]
 ++View actions:[AX_FOCUS] bundle:[chromeRole="sectionWithoutName"]
diff --git a/content/test/data/accessibility/aria/aria-posinset-expected-android.txt b/content/test/data/accessibility/aria/aria-posinset-expected-android.txt
index 6b2eff8..769421d 100644
--- a/content/test/data/accessibility/aria/aria-posinset-expected-android.txt
+++ b/content/test/data/accessibility/aria/aria-posinset-expected-android.txt
@@ -20,7 +20,7 @@
 ++android.widget.TextView interesting name='Banana'
 ++android.view.View name='Cake'
 ++++android.view.View interesting name='Cake'
-++++android.widget.RadioButton role_description='radio button' checkable checked clickable focusable interesting name='Chiffon cakes' state_description='Checked. In group, option 1 of 2'
+++++android.widget.RadioButton role_description='radio button' checkable clickable focusable interesting name='Chiffon cakes' state_description='Checked. In group, option 1 of 2' checked=1
 ++++android.view.View name='<newline>'
 ++++android.widget.RadioButton role_description='radio button' checkable clickable focusable interesting name='Chocolate cakes' state_description='Not checked. In group, option 2 of 2' item_index=1 row_index=1
 ++android.view.View
diff --git a/content/test/data/accessibility/aria/aria-pressed-expected-android-external.txt b/content/test/data/accessibility/aria/aria-pressed-expected-android-external.txt
index 317e02a..17c7753 100644
--- a/content/test/data/accessibility/aria/aria-pressed-expected-android-external.txt
+++ b/content/test/data/accessibility/aria/aria-pressed-expected-android-external.txt
@@ -1,5 +1,5 @@
 WebView focusable focused actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
 ++Button text:"Regular button" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="button", roleDescription="button"]
 ++ToggleButton text:"Toggle button unpressed" stateDescription:"Off" checkable clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="toggleButton", roleDescription="toggle button"]
-++ToggleButton text:"Toggle button pressed" stateDescription:"On" checkable checked clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="toggleButton", roleDescription="toggle button"]
-++ToggleButton text:"Toggle button mixed" stateDescription:"Partially Checked" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="toggleButton", roleDescription="toggle button"]
+++ToggleButton text:"Toggle button pressed" stateDescription:"On" checkable clickable focusable checked actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="toggleButton", roleDescription="toggle button"]
+++ToggleButton text:"Toggle button mixed" stateDescription:"Off" checkable clickable focusable partiallyChecked actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="toggleButton", roleDescription="toggle button"]
diff --git a/content/test/data/accessibility/aria/aria-pressed-expected-android.txt b/content/test/data/accessibility/aria/aria-pressed-expected-android.txt
index 40344ce..cf6b566 100644
--- a/content/test/data/accessibility/aria/aria-pressed-expected-android.txt
+++ b/content/test/data/accessibility/aria/aria-pressed-expected-android.txt
@@ -1,5 +1,5 @@
 android.webkit.WebView focusable focused
 ++android.widget.Button role_description='button' clickable focusable interesting name='Regular button'
 ++android.widget.ToggleButton role_description='toggle button' checkable clickable focusable interesting name='Toggle button unpressed' state_description='Off'
-++android.widget.ToggleButton role_description='toggle button' checkable checked clickable focusable interesting name='Toggle button pressed' state_description='On'
-++android.widget.ToggleButton role_description='toggle button' checkable clickable focusable interesting name='Toggle button mixed' state_description='Partially Checked'
+++android.widget.ToggleButton role_description='toggle button' checkable clickable focusable interesting name='Toggle button pressed' state_description='On' checked=1
+++android.widget.ToggleButton role_description='toggle button' checkable clickable focusable interesting name='Toggle button mixed' state_description='Off' checked=2
diff --git a/content/test/data/accessibility/aria/aria-switch-expected-android-external.txt b/content/test/data/accessibility/aria/aria-switch-expected-android-external.txt
index c6c10eb..1503d185 100644
--- a/content/test/data/accessibility/aria/aria-switch-expected-android-external.txt
+++ b/content/test/data/accessibility/aria/aria-switch-expected-android-external.txt
@@ -1,5 +1,5 @@
 WebView focusable focused actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
 ++ToggleButton text:"Switch1" stateDescription:"Off" checkable clickable actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="switch", roleDescription="switch"]
 ++ToggleButton text:"Switch2" stateDescription:"Off" checkable clickable actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="switch", roleDescription="switch"]
-++ToggleButton text:"Switch3" stateDescription:"On" checkable checked clickable actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="switch", roleDescription="switch"]
+++ToggleButton text:"Switch3" stateDescription:"On" checkable clickable checked actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="switch", roleDescription="switch"]
 ++ToggleButton text:"Switch4" stateDescription:"Off" checkable clickable actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="switch", roleDescription="switch"]
diff --git a/content/test/data/accessibility/aria/aria-switch-expected-android.txt b/content/test/data/accessibility/aria/aria-switch-expected-android.txt
index 9406236..ed33e17 100644
--- a/content/test/data/accessibility/aria/aria-switch-expected-android.txt
+++ b/content/test/data/accessibility/aria/aria-switch-expected-android.txt
@@ -1,5 +1,5 @@
 android.webkit.WebView focusable focused
 ++android.widget.ToggleButton role_description='switch' checkable clickable interesting name='Switch1' state_description='Off'
 ++android.widget.ToggleButton role_description='switch' checkable clickable interesting name='Switch2' state_description='Off'
-++android.widget.ToggleButton role_description='switch' checkable checked clickable interesting name='Switch3' state_description='On'
+++android.widget.ToggleButton role_description='switch' checkable clickable interesting name='Switch3' state_description='On' checked=1
 ++android.widget.ToggleButton role_description='switch' checkable clickable interesting name='Switch4' state_description='Off'
diff --git a/content/test/data/accessibility/aria/aria-togglebutton-expected-android-external.txt b/content/test/data/accessibility/aria/aria-togglebutton-expected-android-external.txt
index c798c4bb..12d8613 100644
--- a/content/test/data/accessibility/aria/aria-togglebutton-expected-android-external.txt
+++ b/content/test/data/accessibility/aria/aria-togglebutton-expected-android-external.txt
@@ -1,5 +1,5 @@
 WebView focusable focused actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
 ++Button text:"Regular button" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="button", roleDescription="button"]
 ++ToggleButton text:"Toggle button" stateDescription:"Off" checkable clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="toggleButton", roleDescription="toggle button"]
-++ToggleButton text:"Toggle button" stateDescription:"On" checkable checked clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="toggleButton", roleDescription="toggle button"]
-++ToggleButton text:"Toggle button" stateDescription:"Partially Checked" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="toggleButton", roleDescription="toggle button"]
+++ToggleButton text:"Toggle button" stateDescription:"On" checkable clickable focusable checked actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="toggleButton", roleDescription="toggle button"]
+++ToggleButton text:"Toggle button" stateDescription:"Off" checkable clickable focusable partiallyChecked actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="toggleButton", roleDescription="toggle button"]
diff --git a/content/test/data/accessibility/aria/aria-togglebutton-expected-android.txt b/content/test/data/accessibility/aria/aria-togglebutton-expected-android.txt
index a82c6b1..b5e109a 100644
--- a/content/test/data/accessibility/aria/aria-togglebutton-expected-android.txt
+++ b/content/test/data/accessibility/aria/aria-togglebutton-expected-android.txt
@@ -1,5 +1,5 @@
 android.webkit.WebView focusable focused
 ++android.widget.Button role_description='button' clickable focusable interesting name='Regular button'
 ++android.widget.ToggleButton role_description='toggle button' checkable clickable focusable interesting name='Toggle button' state_description='Off'
-++android.widget.ToggleButton role_description='toggle button' checkable checked clickable focusable interesting name='Toggle button' state_description='On'
-++android.widget.ToggleButton role_description='toggle button' checkable clickable focusable interesting name='Toggle button' state_description='Partially Checked'
+++android.widget.ToggleButton role_description='toggle button' checkable clickable focusable interesting name='Toggle button' state_description='On' checked=1
+++android.widget.ToggleButton role_description='toggle button' checkable clickable focusable interesting name='Toggle button' state_description='Off' checked=2
diff --git a/content/test/data/accessibility/aria/aria-tree-expected-android-external.txt b/content/test/data/accessibility/aria/aria-tree-expected-android-external.txt
index dfc056c..168f08a 100644
--- a/content/test/data/accessibility/aria/aria-tree-expected-android-external.txt
+++ b/content/test/data/accessibility/aria/aria-tree-expected-android-external.txt
@@ -1,6 +1,6 @@
 WebView focusable focused actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
 ++View CollectionInfo:[hierarchical, rows=2, cols=0] actions:[AX_FOCUS] bundle:[chromeRole="tree", roleDescription="tree"]
-++++View text:"Animals" stateDescription:"Partially Checked" clickable CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=0, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="treeItem", roleDescription="tree item"]
+++++View text:"Animals" checkable clickable partiallyChecked CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=0, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="treeItem", roleDescription="tree item"]
 ++++++View text:"null" contentDescription:"Animals" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="link", clickableScore="300", roleDescription="link", targetUrl="file:///storage/emulated/0/chromium_tests_root/content/test/data/accessibility/aria/aria-tree.html#animals"]
 ++++++++TextView text:"Animals" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText", clickableScore="100"]
 ++++++View actions:[AX_FOCUS] bundle:[chromeRole="group"]
@@ -8,7 +8,7 @@
 ++++++++++View text:"null" contentDescription:"Domesticated" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="link", clickableScore="300", roleDescription="link", targetUrl="file:///storage/emulated/0/chromium_tests_root/content/test/data/accessibility/aria/aria-tree.html#domesticated"]
 ++++++++++++TextView text:"Domesticated" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText", clickableScore="100"]
 ++++++++++View actions:[AX_FOCUS] bundle:[chromeRole="group"]
-++++++++++++View text:"Dog" checkable checked clickable CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=0, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="treeItem", roleDescription="tree item"]
+++++++++++++View text:"Dog" checkable clickable checked CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=0, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="treeItem", roleDescription="tree item"]
 ++++++++++++++View text:"null" contentDescription:"Dog" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="link", clickableScore="300", roleDescription="link", targetUrl="file:///storage/emulated/0/chromium_tests_root/content/test/data/accessibility/aria/aria-tree.html#dog"]
 ++++++++++++++++TextView text:"Dog" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText", clickableScore="100"]
 ++++++++++++View text:"Cat" checkable clickable CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=1, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="treeItem", roleDescription="tree item"]
diff --git a/content/test/data/accessibility/aria/aria-tree-expected-android.txt b/content/test/data/accessibility/aria/aria-tree-expected-android.txt
index b3dddbb5..a5ed64b 100644
--- a/content/test/data/accessibility/aria/aria-tree-expected-android.txt
+++ b/content/test/data/accessibility/aria/aria-tree-expected-android.txt
@@ -1,6 +1,6 @@
 android.webkit.WebView focusable focused
 ++android.view.View role_description='tree' collection hierarchical interesting item_count=2 row_count=2
-++++android.view.View role_description='tree item' checkable clickable collection_item name='Animals' state_description='Partially Checked'
+++++android.view.View role_description='tree item' checkable clickable collection_item name='Animals' checked=2
 ++++++android.view.View role_description='link' clickable focusable link interesting name='Animals'
 ++++++++android.widget.TextView name='Animals'
 ++++++android.view.View
@@ -8,7 +8,7 @@
 ++++++++++android.view.View role_description='link' clickable focusable link interesting name='Domesticated'
 ++++++++++++android.widget.TextView name='Domesticated'
 ++++++++++android.view.View
-++++++++++++android.view.View role_description='tree item' checkable checked clickable collection_item name='Dog'
+++++++++++++android.view.View role_description='tree item' checkable clickable collection_item name='Dog' checked=1
 ++++++++++++++android.view.View role_description='link' clickable focusable link interesting name='Dog'
 ++++++++++++++++android.widget.TextView name='Dog'
 ++++++++++++android.view.View role_description='tree item' checkable clickable collection_item name='Cat' item_index=1 row_index=1
diff --git a/content/test/data/accessibility/aria/toggle-button-expand-collapse-expected-android-external.txt b/content/test/data/accessibility/aria/toggle-button-expand-collapse-expected-android-external.txt
index 9bb04e6..5db41d4 100644
--- a/content/test/data/accessibility/aria/toggle-button-expand-collapse-expected-android-external.txt
+++ b/content/test/data/accessibility/aria/toggle-button-expand-collapse-expected-android-external.txt
@@ -1,5 +1,5 @@
 WebView focusable focused actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
-++ToggleButton text:"Toggle button, pressed, collapsed" stateDescription:"On" canOpenPopUp checkable checked clickable expandedState:1 actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS, EXPAND] bundle:[chromeRole="toggleButton", roleDescription="menu pop up button"]
+++ToggleButton text:"Toggle button, pressed, collapsed" stateDescription:"On" canOpenPopUp checkable clickable expandedState:1 checked actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS, EXPAND] bundle:[chromeRole="toggleButton", roleDescription="menu pop up button"]
 ++ToggleButton text:"Toggle button, not pressed, collapsed" stateDescription:"Off" canOpenPopUp checkable clickable expandedState:1 actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS, EXPAND] bundle:[chromeRole="toggleButton", roleDescription="menu pop up button"]
-++ToggleButton text:"Toggle button, pressed, expanded" stateDescription:"On" canOpenPopUp checkable checked clickable expandedState:3 actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS, COLLAPSE] bundle:[chromeRole="toggleButton", roleDescription="menu pop up button"]
+++ToggleButton text:"Toggle button, pressed, expanded" stateDescription:"On" canOpenPopUp checkable clickable expandedState:3 checked actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS, COLLAPSE] bundle:[chromeRole="toggleButton", roleDescription="menu pop up button"]
 ++ToggleButton text:"Toggle button, not pressed, collapsed"" stateDescription:"Off" canOpenPopUp checkable clickable expandedState:3 actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS, COLLAPSE] bundle:[chromeRole="toggleButton", roleDescription="menu pop up button"]
diff --git a/content/test/data/accessibility/aria/toggle-button-expand-collapse-expected-android.txt b/content/test/data/accessibility/aria/toggle-button-expand-collapse-expected-android.txt
index 00e1a2b..b12e1ee 100644
--- a/content/test/data/accessibility/aria/toggle-button-expand-collapse-expected-android.txt
+++ b/content/test/data/accessibility/aria/toggle-button-expand-collapse-expected-android.txt
@@ -1,5 +1,5 @@
 android.webkit.WebView focusable focused
-++android.widget.ToggleButton role_description='menu pop up button' checkable checked clickable collapsed interesting name='Toggle button, pressed, collapsed' state_description='On' expanded_state=1
+++android.widget.ToggleButton role_description='menu pop up button' checkable clickable collapsed interesting name='Toggle button, pressed, collapsed' state_description='On' expanded_state=1 checked=1
 ++android.widget.ToggleButton role_description='menu pop up button' checkable clickable collapsed interesting name='Toggle button, not pressed, collapsed' state_description='Off' expanded_state=1
-++android.widget.ToggleButton role_description='menu pop up button' checkable checked clickable expanded interesting name='Toggle button, pressed, expanded' state_description='On' expanded_state=3
+++android.widget.ToggleButton role_description='menu pop up button' checkable clickable expanded interesting name='Toggle button, pressed, expanded' state_description='On' expanded_state=3 checked=1
 ++android.widget.ToggleButton role_description='menu pop up button' checkable clickable expanded interesting name='Toggle button, not pressed, collapsed"' state_description='Off' expanded_state=3
diff --git a/content/test/data/accessibility/html/action-verbs-expected-android-external.txt b/content/test/data/accessibility/html/action-verbs-expected-android-external.txt
index c056fab..19cc9bf 100644
--- a/content/test/data/accessibility/html/action-verbs-expected-android-external.txt
+++ b/content/test/data/accessibility/html/action-verbs-expected-android-external.txt
@@ -9,7 +9,7 @@
 ++EditText clickable editable focusable multiLine textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, PASTE, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300"]
 ++EditText clickable editable focusable multiLine textSelectionStart:0 textSelectionEnd:0 actions:[FOCUS, CLICK, AX_FOCUS, PASTE, SET_TEXT, IME_ENTER] bundle:[chromeRole="textField", clickableScore="300"]
 ++CheckBox checkable clickable focusable actions:[FOCUS, CLICK, AX_FOCUS] bundle:[chromeRole="checkBox", clickableScore="300", roleDescription="checkbox"]
-++CheckBox checkable checked clickable focusable actions:[FOCUS, CLICK, AX_FOCUS] bundle:[chromeRole="checkBox", clickableScore="300", roleDescription="checkbox"]
+++CheckBox checkable clickable focusable checked actions:[FOCUS, CLICK, AX_FOCUS] bundle:[chromeRole="checkBox", clickableScore="300", roleDescription="checkbox"]
 ++RadioButton checkable clickable focusable actions:[FOCUS, CLICK, AX_FOCUS] bundle:[chromeRole="radioButton", clickableScore="300", roleDescription="radio button"]
 ++ToggleButton text:"ARIA Switch" stateDescription:"Off" checkable clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="switch", clickableScore="300", roleDescription="switch"]
 ++View actions:[AX_FOCUS] bundle:[chromeRole="details"]
@@ -20,7 +20,7 @@
 ++++TextView text:"Paragraph with click handler on parent" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="paragraph", clickableScore="100"]
 ++View CollectionInfo:[selection_mode_single, rows=3, cols=1] actions:[AX_FOCUS] bundle:[chromeRole="menu", roleDescription="menu"]
 ++++MenuItem text:"Menu item 1" clickable CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=0, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="menuItem", clickableScore="300", roleDescription="menu item"]
-++++MenuItem text:"Menu item 2" checkable checked clickable CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=1, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="menuItemCheckBox", clickableScore="300", roleDescription="checkbox"]
+++++MenuItem text:"Menu item 2" checkable clickable checked CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=1, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="menuItemCheckBox", clickableScore="300", roleDescription="checkbox"]
 ++++MenuItem text:"Menu item 3" checkable clickable CollectionItemInfo:[rowSpan=0, colSpan=0, rowIndex=2, colIndex=0] actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="menuItemRadio", clickableScore="300", roleDescription="radio button"]
 ++Button text:"ARIA Button" clickable actions:[CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="button", clickableScore="300", roleDescription="button"]
 ++Button text:"ARIA button with tab index" clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="button", clickableScore="300", roleDescription="button"]
diff --git a/content/test/data/accessibility/html/action-verbs-expected-android.txt b/content/test/data/accessibility/html/action-verbs-expected-android.txt
index cf0bf34..1ad8895 100644
--- a/content/test/data/accessibility/html/action-verbs-expected-android.txt
+++ b/content/test/data/accessibility/html/action-verbs-expected-android.txt
@@ -9,7 +9,7 @@
 ++android.widget.EditText clickable editable_text focusable multiline interesting
 ++android.widget.EditText clickable editable_text focusable multiline interesting
 ++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting
-++android.widget.CheckBox role_description='checkbox' checkable checked clickable focusable interesting
+++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting checked=1
 ++android.widget.RadioButton role_description='radio button' checkable clickable focusable interesting
 ++android.widget.ToggleButton role_description='switch' checkable clickable focusable interesting name='ARIA Switch' state_description='Off'
 ++android.view.View
@@ -20,7 +20,7 @@
 ++++android.widget.TextView interesting name='Paragraph with click handler on parent'
 ++android.view.View role_description='menu' collection item_count=3 row_count=3 column_count=1 selection_mode=1
 ++++android.view.MenuItem role_description='menu item' clickable collection_item interesting name='Menu item 1'
-++++android.view.MenuItem role_description='checkbox' checkable checked clickable collection_item interesting name='Menu item 2' item_index=1 row_index=1
+++++android.view.MenuItem role_description='checkbox' checkable clickable collection_item interesting name='Menu item 2' item_index=1 row_index=1 checked=1
 ++++android.view.MenuItem role_description='radio button' checkable clickable collection_item interesting name='Menu item 3' item_index=2 row_index=2
 ++android.widget.Button role_description='button' clickable interesting name='ARIA Button'
 ++android.widget.Button role_description='button' clickable focusable interesting name='ARIA button with tab index'
diff --git a/content/test/data/accessibility/html/input-checkbox-expected-android.txt b/content/test/data/accessibility/html/input-checkbox-expected-android.txt
index 3210506..ec91ec1 100644
--- a/content/test/data/accessibility/html/input-checkbox-expected-android.txt
+++ b/content/test/data/accessibility/html/input-checkbox-expected-android.txt
@@ -1,7 +1,7 @@
 android.webkit.WebView focusable focused
 ++android.view.View
 ++++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting name='Checkbox0'
-++++android.widget.CheckBox role_description='checkbox' checkable checked clickable focusable interesting name='Checkbox1'
+++++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting name='Checkbox1' checked=1
 ++++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting name='Checkbox2'
 ++++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting name='Checkbox3'
-++++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting name='Checkbox4' state_description='Partially Checked'
+++++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting name='Checkbox4' checked=2
diff --git a/content/test/data/accessibility/html/input-checkbox-in-menu-expected-android.txt b/content/test/data/accessibility/html/input-checkbox-in-menu-expected-android.txt
index 8b386de..8a9f142b 100644
--- a/content/test/data/accessibility/html/input-checkbox-in-menu-expected-android.txt
+++ b/content/test/data/accessibility/html/input-checkbox-in-menu-expected-android.txt
@@ -1,7 +1,7 @@
 android.webkit.WebView focusable focused
 ++android.view.View role_description='menu' collection column_count=1
 ++++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting name='Checkbox1'
-++++android.widget.CheckBox role_description='checkbox' checkable checked clickable focusable interesting name='Checkbox2'
+++++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting name='Checkbox2' checked=1
 ++android.view.View role_description='menu' collection column_count=1
-++++android.widget.CheckBox role_description='checkbox' checkable checked clickable focusable interesting name='Checkbox3'
-++++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting name='Checkbox4' state_description='Partially Checked'
+++++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting name='Checkbox3' checked=1
+++++android.widget.CheckBox role_description='checkbox' checkable clickable focusable interesting name='Checkbox4' checked=2
diff --git a/content/test/data/accessibility/html/input-radio-expected-android-external.txt b/content/test/data/accessibility/html/input-radio-expected-android-external.txt
index 31c3b579..ed6cf8e 100644
--- a/content/test/data/accessibility/html/input-radio-expected-android-external.txt
+++ b/content/test/data/accessibility/html/input-radio-expected-android-external.txt
@@ -7,7 +7,7 @@
 ++++TextView text:"Radio2" actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"]
 ++View actions:[AX_FOCUS] bundle:[chromeRole="sectionWithoutName"]
 ++++RadioButton text:"Radio3" stateDescription:"Not checked. In group, option 1 of 2" checkable clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="radioButton", clickableScore="300", roleDescription="radio button"]
-++++RadioButton text:"Radio4" stateDescription:"Checked. In group, option 2 of 2" checkable checked clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="radioButton", clickableScore="300", roleDescription="radio button"]
+++++RadioButton text:"Radio4" stateDescription:"Checked. In group, option 2 of 2" checkable clickable focusable checked actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="radioButton", clickableScore="300", roleDescription="radio button"]
 ++View actions:[AX_FOCUS] bundle:[chromeRole="sectionWithoutName"]
 ++++RadioButton text:"Radio5" checkable clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="radioButton", clickableScore="300", roleDescription="radio button"]
-++++RadioButton text:"Radio6" checkable checked clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="radioButton", clickableScore="300", roleDescription="radio button"]
+++++RadioButton text:"Radio6" checkable clickable focusable checked actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="radioButton", clickableScore="300", roleDescription="radio button"]
diff --git a/content/test/data/accessibility/html/input-radio-expected-android.txt b/content/test/data/accessibility/html/input-radio-expected-android.txt
index 803ddba..992631b 100644
--- a/content/test/data/accessibility/html/input-radio-expected-android.txt
+++ b/content/test/data/accessibility/html/input-radio-expected-android.txt
@@ -7,7 +7,7 @@
 ++++android.widget.TextView interesting name='Radio2'
 ++android.view.View
 ++++android.widget.RadioButton role_description='radio button' checkable clickable focusable interesting name='Radio3' state_description='Not checked. In group, option 1 of 2'
-++++android.widget.RadioButton role_description='radio button' checkable checked clickable focusable interesting name='Radio4' state_description='Checked. In group, option 2 of 2' item_index=1 row_index=1
+++++android.widget.RadioButton role_description='radio button' checkable clickable focusable interesting name='Radio4' state_description='Checked. In group, option 2 of 2' item_index=1 row_index=1 checked=1
 ++android.view.View
 ++++android.widget.RadioButton role_description='radio button' checkable clickable focusable interesting name='Radio5'
-++++android.widget.RadioButton role_description='radio button' checkable checked clickable focusable interesting name='Radio6' item_index=1 row_index=1
+++++android.widget.RadioButton role_description='radio button' checkable clickable focusable interesting name='Radio6' item_index=1 row_index=1 checked=1
diff --git a/content/test/data/accessibility/html/input-radio-in-menu-expected-android-external.txt b/content/test/data/accessibility/html/input-radio-in-menu-expected-android-external.txt
index ec956c7..4813230 100644
--- a/content/test/data/accessibility/html/input-radio-in-menu-expected-android-external.txt
+++ b/content/test/data/accessibility/html/input-radio-in-menu-expected-android-external.txt
@@ -1,6 +1,6 @@
 WebView focusable focused actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
 ++View CollectionInfo:[rows=0, cols=1] actions:[AX_FOCUS] bundle:[chromeRole="menu", roleDescription="menu"]
-++++RadioButton stateDescription:"Checked. In group, option 1 of 3" checkable checked clickable focusable actions:[FOCUS, CLICK, AX_FOCUS] bundle:[chromeRole="radioButton", clickableScore="300", roleDescription="radio button"]
+++++RadioButton stateDescription:"Checked. In group, option 1 of 3" checkable clickable focusable checked actions:[FOCUS, CLICK, AX_FOCUS] bundle:[chromeRole="radioButton", clickableScore="300", roleDescription="radio button"]
 ++++TextView text:"Radio0 " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"]
 ++++RadioButton stateDescription:"Not checked. In group, option 2 of 3" checkable clickable focusable actions:[FOCUS, CLICK, AX_FOCUS] bundle:[chromeRole="radioButton", clickableScore="300", roleDescription="radio button"]
 ++++TextView text:"Radio1 " actions:[AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="staticText"]
@@ -8,4 +8,4 @@
 ++View CollectionInfo:[rows=0, cols=1] actions:[AX_FOCUS] bundle:[chromeRole="menu", roleDescription="menu"]
 ++++RadioButton text:"Radio3" stateDescription:"Not checked. In group, option 1 of 3" checkable clickable focusable actions:[FOCUS, CLICK, AX_FOCUS, NEXT, PREVIOUS] bundle:[chromeRole="radioButton", clickableScore="300", roleDescription="radio button"]
 ++++RadioButton stateDescription:"Not checked. In group, option 2 of 3" checkable clickable focusable actions:[FOCUS, CLICK, AX_FOCUS] bundle:[chromeRole="radioButton", clickableScore="300", roleDescription="radio button"]
-++++RadioButton stateDescription:"Checked. In group, option 3 of 3" checkable checked clickable focusable actions:[FOCUS, CLICK, AX_FOCUS] bundle:[chromeRole="radioButton", clickableScore="300", roleDescription="radio button"]
+++++RadioButton stateDescription:"Checked. In group, option 3 of 3" checkable clickable focusable checked actions:[FOCUS, CLICK, AX_FOCUS] bundle:[chromeRole="radioButton", clickableScore="300", roleDescription="radio button"]
diff --git a/content/test/data/accessibility/html/input-radio-in-menu-expected-android.txt b/content/test/data/accessibility/html/input-radio-in-menu-expected-android.txt
index a218bf7..96e399a 100644
--- a/content/test/data/accessibility/html/input-radio-in-menu-expected-android.txt
+++ b/content/test/data/accessibility/html/input-radio-in-menu-expected-android.txt
@@ -1,6 +1,6 @@
 android.webkit.WebView focusable focused
 ++android.view.View role_description='menu' collection column_count=1
-++++android.widget.RadioButton role_description='radio button' checkable checked clickable focusable interesting state_description='Checked. In group, option 1 of 3'
+++++android.widget.RadioButton role_description='radio button' checkable clickable focusable interesting state_description='Checked. In group, option 1 of 3' checked=1
 ++++android.widget.TextView interesting name='Radio0 '
 ++++android.widget.RadioButton role_description='radio button' checkable clickable focusable interesting state_description='Not checked. In group, option 2 of 3' item_index=1 row_index=1
 ++++android.widget.TextView interesting name='Radio1 '
@@ -8,4 +8,4 @@
 ++android.view.View role_description='menu' collection column_count=1
 ++++android.widget.RadioButton role_description='radio button' checkable clickable focusable interesting name='Radio3' state_description='Not checked. In group, option 1 of 3'
 ++++android.widget.RadioButton role_description='radio button' checkable clickable focusable interesting state_description='Not checked. In group, option 2 of 3' item_index=1 row_index=1
-++++android.widget.RadioButton role_description='radio button' checkable checked clickable focusable interesting state_description='Checked. In group, option 3 of 3' item_index=2 row_index=2
+++++android.widget.RadioButton role_description='radio button' checkable clickable focusable interesting state_description='Checked. In group, option 3 of 3' item_index=2 row_index=2 checked=1
diff --git a/content/test/data/gpu/pixel_webgl_fullscreen_quad.js b/content/test/data/gpu/pixel_webgl_fullscreen_quad.js
index 95fbed1..32137d25 100644
--- a/content/test/data/gpu/pixel_webgl_fullscreen_quad.js
+++ b/content/test/data/gpu/pixel_webgl_fullscreen_quad.js
@@ -2,21 +2,21 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-const vertexShader = [
-  "attribute vec3 pos;",
-  "void main(void)",
-  "{",
-  "  gl_Position = vec4(pos, 1.0);",
-  "}"
-].join("\n");
+const defaultVertexShader = [
+  'attribute vec3 pos;',
+  'void main(void)',
+  '{',
+  '  gl_Position = vec4(pos, 1.0);',
+  '}',
+].join('\n');
 
-const fragmentShader = [
-  "precision mediump float;",
-  "void main(void)",
-  "{",
-  "  gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);",
-  "}"
-].join("\n");
+const defaultFragmentShader = [
+  'precision mediump float;',
+  'void main(void)',
+  '{',
+  '  gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);',
+  '}',
+].join('\n');
 
 let gl;
 
@@ -37,9 +37,11 @@
 function initGL(canvas, opt_attribs)
 {
   try {
-    let attribs = Object.assign({ powerPreference: "low-power" },
-                                opt_attribs || {});
-    gl = canvas.getContext("webgl", attribs);
+    opt_attribs = opt_attribs || {};
+    let contextType = opt_attribs.contextType || 'webgl';
+    delete opt_attribs.contextType;
+    let attribs = Object.assign({powerPreference: 'low-power'}, opt_attribs);
+    gl = canvas.getContext(contextType, attribs);
   } catch (e) {}
   return gl;
 }
@@ -48,12 +50,18 @@
   var shader = gl.createShader(type);
   gl.shaderSource(shader, source);
   gl.compileShader(shader);
-  if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS))
+  if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
+    console.log(gl.getShaderInfoLog(shader));
     return null;
+  }
   return shader;
 }
 
 function setupProgram(vs_id, fs_id) {
+  let vertexShader =
+      document.getElementById(vs_id)?.innerHTML.trim() || defaultVertexShader;
+  let fragmentShader =
+      document.getElementById(fs_id)?.innerHTML.trim() || defaultFragmentShader;
   var vs = setupShader(vertexShader, gl.VERTEX_SHADER);
   var fs = setupShader(fragmentShader, gl.FRAGMENT_SHADER);
   if (!vs || !fs)
@@ -85,7 +93,7 @@
   gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertexData), gl.STATIC_DRAW);
 }
 
-function setupGL() {
+function setupGL(gl) {
   var program = setupProgram("shader-vs", "shader-fs");
   if (!program)
     return false;
@@ -95,7 +103,6 @@
   var stride = 3 * Float32Array.BYTES_PER_ELEMENT;
   gl.vertexAttribPointer(posAttr, 3, gl.FLOAT, false, stride, 0);
   gl.clearColor(0.0, 0.0, 0.0, 0.0);
-  gl.viewport(0, 0, 300, 300);
   gl.disable(gl.DEPTH_TEST);
   if (gl.getError() != gl.NO_ERROR)
     return false;
diff --git a/content/test/data/gpu/pixel_webgl_texture_from_webgl_readback.html b/content/test/data/gpu/pixel_webgl_texture_from_webgl_readback.html
new file mode 100644
index 0000000..9f7f2bd0
--- /dev/null
+++ b/content/test/data/gpu/pixel_webgl_texture_from_webgl_readback.html
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<title>WebGL Test: Upload WebGL canvas as texture3D of another WebGL canvas</title>
+
+<script src="pixel_webgl_fullscreen_quad.js"></script>
+<script type="x-shader/x-vertex" id="shader-vs">
+  #version 300 es
+  in vec4 pos;
+  out vec2 texCoord;
+  void main() {
+    gl_Position = pos;
+    texCoord = pos.xy * 0.5 + vec2(0.5, 0.5);
+    // WebGL has bottom left origin, so we flip texture coordinates to match
+    // top-left of the texture with top-left of the canvas.
+    texCoord.y = 1.0 - texCoord.y;
+  }
+</script>
+<script type="x-shader/x-fragment" id="shader-fs">
+  #version 300 es
+  precision mediump float;
+  uniform mediump sampler3D tex;
+  in vec2 texCoord;
+  out vec4 fragColor;
+  void main() {
+      fragColor = texture(tex, vec3(texCoord, 1.0));
+  }
+</script>
+
+<script>
+let g_swapsBeforeAck = 15;
+
+function sendResult(status) {
+  if (domAutomationController) {
+    domAutomationController.send(status);
+  } else {
+    console.log(status);
+  }
+}
+
+function waitForFinish() {
+  if (g_swapsBeforeAck == 0) {
+    sendResult("SUCCESS");
+  } else {
+    g_swapsBeforeAck--;
+    window.requestAnimationFrame(waitForFinish);
+  }
+}
+var main = () => {
+  setup({'contextType' : 'webgl2'});
+
+  let gl = document.getElementById('c').getContext("webgl2");
+
+  const texture = gl.createTexture();
+  gl.bindTexture(gl.TEXTURE_3D, texture);
+  gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
+  gl.texParameteri(gl.TEXTURE_3D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
+
+  // Setup source as blue webgl canvas with top left red square.
+  {
+    let canvas = document.getElementById('source');
+    let ctx = canvas.getContext('webgl');
+    ctx.clearColor(0, 0, 1, 1);
+    ctx.clear(ctx.COLOR_BUFFER_BIT);
+    ctx.scissor(0, 50, 50, 50);
+    ctx.enable(ctx.SCISSOR_TEST);
+    ctx.clearColor(1, 0, 0, 1);
+    ctx.clear(ctx.COLOR_BUFFER_BIT);
+  }
+
+  // Upload source canvas as texture3D to destination. We use 3D version,
+  // because it forces readback and upload path.
+  gl.texImage3D(
+    gl.TEXTURE_3D, 0, gl.RGBA, 100, 100, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE,
+    document.getElementById('source'));
+  gl.drawArrays(gl.TRIANGLES, 0, 6);
+
+  waitForFinish();
+}
+</script>
+</head>
+<body onload="main()">
+<canvas id="source" width="100" height="100"></canvas>
+<canvas id="c" width="100" height="100"></canvas>
+</body>
+</html>
diff --git a/content/test/gpu/gpu_tests/pixel_test_pages.py b/content/test/gpu/gpu_tests/pixel_test_pages.py
index 478af0d..46d2984 100644
--- a/content/test/gpu/gpu_tests/pixel_test_pages.py
+++ b/content/test/gpu/gpu_tests/pixel_test_pages.py
@@ -549,6 +549,9 @@
         PixelTestPage('pixel_webgl_copy_image.html',
                       base_name + '_WebGLCopyImage',
                       crop_action=standard_crop),
+        PixelTestPage('pixel_webgl_texture_from_webgl_readback.html',
+                      base_name + '_WebGLTextureFromWebGLReadback',
+                      crop_action=standard_crop),
         PixelTestPage('pixel_webgl_read_pixels_tab_switch.html',
                       base_name + '_WebGLReadPixelsTabSwitch',
                       crop_action=standard_crop,
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
index ce00769..4faf7a7 100644
--- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -482,6 +482,9 @@
 crbug.com/370694819 [ mac asan ] Pixel_WebGPUDestroyed_OffscreenCanvas* [ Failure ]
 crbug.com/370694819 [ mac asan ] Pixel_WebGPUDestroyed_OnscreenCanvas* [ Failure ]
 
+# ChromeOS produces flipped results
+crbug.com/378688985 [ chromeos ] Pixel_WebGLTextureFromWebGLReadback [ Failure ]
+
 #######################################################################
 # Automated Entries After This Point - Do Not Manually Add Below Here #
 #######################################################################
diff --git a/content/web_test/browser/web_test_permission_manager.cc b/content/web_test/browser/web_test_permission_manager.cc
index eecabd1..0a65394 100644
--- a/content/web_test/browser/web_test_permission_manager.cc
+++ b/content/web_test/browser/web_test_permission_manager.cc
@@ -164,7 +164,8 @@
       render_frame_host->GetMainFrame());
   for (const auto& permission : request_description.permissions) {
     result.push_back(GetPermissionStatusForRequestPermission(
-        permission, request_description.requesting_origin, embedding_origin));
+        blink::PermissionDescriptorToPermissionType(permission),
+        request_description.requesting_origin, embedding_origin));
   }
 
   std::move(callback).Run(result);
@@ -204,7 +205,8 @@
       render_frame_host->GetMainFrame());
   for (const auto& permission : request_description.permissions) {
     result.push_back(GetPermissionStatusForRequestPermission(
-        permission, request_description.requesting_origin, embedding_origin));
+        blink::PermissionDescriptorToPermissionType(permission),
+        request_description.requesting_origin, embedding_origin));
   }
 
   std::move(callback).Run(result);
@@ -386,7 +388,7 @@
     const GURL& url,
     const GURL& embedding_url,
     blink::test::mojom::PermissionAutomation::SetPermissionCallback callback) {
-  auto type = blink::PermissionDescriptorToPermissionType(descriptor);
+  auto type = blink::MaybePermissionDescriptorToPermissionType(descriptor);
   if (!type) {
     std::move(callback).Run(false);
     return;
diff --git a/docs/ui/display/display_conversion.md b/docs/ui/display/display_conversion.md
index 0aa80059b..2a891a25 100644
--- a/docs/ui/display/display_conversion.md
+++ b/docs/ui/display/display_conversion.md
@@ -43,7 +43,7 @@
   account the monitor tree, connected components, and overlap handling when
   converting coordinates.
   - Example:
-  `display::win::ScreenWin::DIPToScreenRect(GetParentHWND(), dip_bounds)` will
+  `display::win::GetScreenWin()->DIPToScreenRect(GetParentHWND(), dip_bounds)` will
   convert a screen DIP rect to a screen physical one.
 
 - **Other Platforms:**
diff --git a/docs/updating_clang.md b/docs/updating_clang.md
index 3d0ef35..1d5eefd 100644
--- a/docs/updating_clang.md
+++ b/docs/updating_clang.md
@@ -98,3 +98,27 @@
 
 [an example of adding a new package](https://chromium-review.googlesource.com/c/chromium/src/+/5463029)
 [example bug]: https://crbug.com/335730441
+
+# On local patches and cherry-picks
+
+Except for the addition of Clang plugins, which do not affect the compiler
+output, Chromium's LLVM binaries are vanilla builds of the upstream source code
+at a specific revision, with no alterations.
+
+We believe this helps when working with upstream: our compiler should behave
+exactly the same as if someone else built LLVM at the same revision, making
+collaboration easier.
+
+It also creates an incentive for stabilizing the HEAD revision of LLVM: since
+we ship a vanilla build of an upstream revision, we have to ensure that a
+revision can be found which is stable enough to build Chromium and pass all its
+tests. While allowing local cherry-picks, reverts, or other patches, would
+probably allow more regular toolchain releases, we believe we can perform
+toolchain testing and fix issues fast enough that finding a stable revision is
+possible, and that this is the right trade-off for us and for the LLVM
+community.
+
+For Rust, since the interface between tip-of-tree rustc and LLVM is less
+stable, and since landing fixes in Rust is much slower (even after approval, a
+patch can take more than 24 hours to land), we allow cherry-picks of such fixes
+in our Rust toolchain build.
diff --git a/docs/website b/docs/website
index cac8fbe..911ac9b 160000
--- a/docs/website
+++ b/docs/website
@@ -1 +1 @@
-Subproject commit cac8fbef00b6695ad2f41d65d92ce8af443728be
+Subproject commit 911ac9ba06c70163c0feff9dfe9d5829dda94b83
diff --git a/extensions/common/extension_l10n_util.cc b/extensions/common/extension_l10n_util.cc
index e08a3ed..2600a49 100644
--- a/extensions/common/extension_l10n_util.cc
+++ b/extensions/common/extension_l10n_util.cc
@@ -6,6 +6,7 @@
 
 #include <stddef.h>
 
+#include <optional>
 #include <set>
 #include <string>
 #include <string_view>
@@ -16,7 +17,7 @@
 #include "base/files/file_enumerator.h"
 #include "base/files/file_util.h"
 #include "base/json/json_file_value_serializer.h"
-#include "base/json/json_string_value_serializer.h"
+#include "base/json/json_reader.h"
 #include "base/logging.h"
 #include "base/no_destructor.h"
 #include "base/strings/strcat.h"
@@ -48,7 +49,7 @@
 // or there was parsing error we return null and set |error|. If
 // |gzip_permission| is kAllowForTrustedSource, this will also look for a .gz
 // version of the file and if found will decompresses it into a string first.
-std::unique_ptr<base::Value::Dict> LoadMessageFile(
+std::optional<base::Value::Dict> LoadMessageFile(
     const base::FilePath& locale_path,
     const std::string& locale,
     std::string* error,
@@ -56,14 +57,13 @@
   base::FilePath file_path =
       locale_path.AppendASCII(locale).Append(extensions::kMessagesFilename);
 
-  std::unique_ptr<base::Value::Dict> dictionary;
+  std::optional<base::Value::Dict> dictionary;
   if (base::PathExists(file_path)) {
     JSONFileValueDeserializer messages_deserializer(file_path);
     std::unique_ptr<base::Value> value =
         messages_deserializer.Deserialize(nullptr, error);
     if (value) {
-      dictionary =
-          std::make_unique<base::Value::Dict>(std::move(*value).TakeDict());
+      dictionary = std::move(*value).TakeDict();
     }
   } else if (gzip_permission == extension_l10n_util::GzippedMessagesPermission::
                                     kAllowForTrustedSource ||
@@ -84,12 +84,12 @@
                                     locale.c_str());
         return dictionary;
       }
-      JSONStringValueDeserializer messages_deserializer(data);
-      std::unique_ptr<base::Value> value =
-          messages_deserializer.Deserialize(nullptr, error);
-      if (value) {
-        dictionary =
-            std::make_unique<base::Value::Dict>(std::move(*value).TakeDict());
+      base::JSONReader::Result value =
+          base::JSONReader::ReadAndReturnValueWithError(data);
+      if (value.has_value()) {
+        dictionary = std::move(*value).TakeDict();
+      } else {
+        *error = value.error().message;
       }
     }
   } else {
@@ -489,9 +489,9 @@
     base::FilePath this_locale_path = locale_path.AppendASCII(fallback_locale);
     if (!base::PathExists(this_locale_path))
       continue;
-    std::unique_ptr<base::Value::Dict> catalog =
+    std::optional<base::Value::Dict> catalog =
         LoadMessageFile(locale_path, fallback_locale, error, gzip_permission);
-    if (!catalog.get()) {
+    if (!catalog.has_value()) {
       // If locale is valid, but messages.json is corrupted or missing, return
       // an error.
       return nullptr;
diff --git a/fuchsia_web/webengine/browser/frame_impl.cc b/fuchsia_web/webengine/browser/frame_impl.cc
index 635050e..16c40268 100644
--- a/fuchsia_web/webengine/browser/frame_impl.cc
+++ b/fuchsia_web/webengine/browser/frame_impl.cc
@@ -44,6 +44,7 @@
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/permission_controller.h"
+#include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_widget_host.h"
@@ -1469,11 +1470,13 @@
     content::MediaResponseCallback callback) {
   DCHECK_EQ(web_contents_.get(), web_contents);
 
-  std::vector<blink::PermissionType> permissions;
+  std::vector<blink::mojom::PermissionDescriptorPtr> permissions;
 
   if (request.audio_type ==
       blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE) {
-    permissions.push_back(blink::PermissionType::AUDIO_CAPTURE);
+    permissions.push_back(content::PermissionDescriptorUtil::
+                              CreatePermissionDescriptorForPermissionType(
+                                  blink::PermissionType::AUDIO_CAPTURE));
   } else if (request.audio_type != blink::mojom::MediaStreamType::NO_SERVICE) {
     std::move(callback).Run(
         blink::mojom::StreamDevicesSet(),
@@ -1483,7 +1486,9 @@
 
   if (request.video_type ==
       blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE) {
-    permissions.push_back(blink::PermissionType::VIDEO_CAPTURE);
+    permissions.push_back(content::PermissionDescriptorUtil::
+                              CreatePermissionDescriptorForPermissionType(
+                                  blink::PermissionType::VIDEO_CAPTURE));
   } else if (request.video_type != blink::mojom::MediaStreamType::NO_SERVICE) {
     std::move(callback).Run(
         blink::mojom::StreamDevicesSet(),
@@ -1512,10 +1517,10 @@
   content::PermissionController* permission_controller =
       web_contents_->GetBrowserContext()->GetPermissionController();
   DCHECK(permission_controller);
-
   permission_controller->RequestPermissionsFromCurrentDocument(
       render_frame_host,
-      content::PermissionRequestDescription(permissions, request.user_gesture),
+      content::PermissionRequestDescription(std::move(permissions),
+                                            request.user_gesture),
       base::BindOnce(&HandleMediaPermissionsRequestResult, request,
                      std::move(callback)));
 }
diff --git a/fuchsia_web/webengine/browser/web_engine_permission_delegate.cc b/fuchsia_web/webengine/browser/web_engine_permission_delegate.cc
index 4aa6b957..2f537c6 100644
--- a/fuchsia_web/webengine/browser/web_engine_permission_delegate.cc
+++ b/fuchsia_web/webengine/browser/web_engine_permission_delegate.cc
@@ -26,7 +26,8 @@
   FrameImpl* frame = FrameImpl::FromRenderFrameHost(render_frame_host);
   DCHECK(frame);
   frame->permission_controller()->RequestPermissions(
-      request_description.permissions,
+      blink::PermissionDescriptorToPermissionTypes(
+          request_description.permissions),
       url::Origin::Create(request_description.requesting_origin),
       std::move(callback));
 }
@@ -48,9 +49,9 @@
   FrameImpl* frame = FrameImpl::FromRenderFrameHost(render_frame_host);
   DCHECK(frame);
   frame->permission_controller()->RequestPermissions(
-      request_description.permissions,
-      render_frame_host->GetLastCommittedOrigin(),
-      std::move(callback));
+      blink::PermissionDescriptorToPermissionTypes(
+          request_description.permissions),
+      render_frame_host->GetLastCommittedOrigin(), std::move(callback));
 }
 
 blink::mojom::PermissionStatus WebEnginePermissionDelegate::GetPermissionStatus(
diff --git a/google_apis/gaia/google_service_auth_error.cc b/google_apis/gaia/google_service_auth_error.cc
index bef1f0f..93d55b21 100644
--- a/google_apis/gaia/google_service_auth_error.cc
+++ b/google_apis/gaia/google_service_auth_error.cc
@@ -50,6 +50,8 @@
       return "admin policy enforced";
     case kRemoteConsentResolutionRequired:
       return "remote consent resolution required";
+    case kAccessDenied:
+      return "access denied";
   }
   NOTREACHED();
 }
diff --git a/google_apis/gaia/google_service_auth_error.h b/google_apis/gaia/google_service_auth_error.h
index 5d6525d..da4b0a5b 100644
--- a/google_apis/gaia/google_service_auth_error.h
+++ b/google_apis/gaia/google_service_auth_error.h
@@ -128,7 +128,9 @@
     // Scope restricted by admin policy.
     kAdminPolicyEnforced,
     // The user doesn't have consent for this scope.
-    kRemoteConsentResolutionRequired
+    kRemoteConsentResolutionRequired,
+    // The user doesn't have access to this scope.
+    kAccessDenied
   };
 
   bool operator==(const GoogleServiceAuthError &b) const;
diff --git a/google_apis/gaia/oauth2_access_token_fetcher_impl.cc b/google_apis/gaia/oauth2_access_token_fetcher_impl.cc
index 2ea0e31a3..11d4984 100644
--- a/google_apis/gaia/oauth2_access_token_fetcher_impl.cc
+++ b/google_apis/gaia/oauth2_access_token_fetcher_impl.cc
@@ -274,7 +274,6 @@
 
     case kRateLimitExceeded:
     case kInternalFailure:
-    case kAccessDenied:
       // Transient error.
       error = GoogleServiceAuthError::FromServiceUnavailable(response_str);
       break;
@@ -302,6 +301,12 @@
               kAdminPolicyEnforced);
       break;
 
+    case kAccessDenied:
+      error = GoogleServiceAuthError::FromScopeLimitedUnrecoverableErrorReason(
+          GoogleServiceAuthError::ScopeLimitedUnrecoverableErrorReason::
+              kAccessDenied);
+      break;
+
     case kInvalidRequest:
     case kInvalidClient:
     case kUnauthorizedClient:
diff --git a/google_apis/gaia/oauth2_access_token_fetcher_impl_unittest.cc b/google_apis/gaia/oauth2_access_token_fetcher_impl_unittest.cc
index 5e51450..81def016 100644
--- a/google_apis/gaia/oauth2_access_token_fetcher_impl_unittest.cc
+++ b/google_apis/gaia/oauth2_access_token_fetcher_impl_unittest.cc
@@ -405,6 +405,10 @@
       return GoogleServiceAuthError::ScopeLimitedUnrecoverableErrorReason::
           kAdminPolicyEnforced;
     }
+    if (error_code == "access_denied") {
+      return GoogleServiceAuthError::ScopeLimitedUnrecoverableErrorReason::
+          kAccessDenied;
+    }
     NOTREACHED();
   }
 };
@@ -437,7 +441,7 @@
      OAuth2Response::kAdminPolicyEnforced,
      GoogleServiceAuthError::SCOPE_LIMITED_UNRECOVERABLE_ERROR},
     {"access_denied", net::HTTP_FORBIDDEN, OAuth2Response::kAccessDenied,
-     GoogleServiceAuthError::SERVICE_UNAVAILABLE},
+     GoogleServiceAuthError::SCOPE_LIMITED_UNRECOVERABLE_ERROR},
     {"", net::HTTP_BAD_REQUEST, OAuth2Response::kErrorUnexpectedFormat,
      GoogleServiceAuthError::SERVICE_ERROR},
     {"", net::HTTP_OK, OAuth2Response::kOkUnexpectedFormat,
diff --git a/gpu/command_buffer/service/shared_context_state.cc b/gpu/command_buffer/service/shared_context_state.cc
index 4590b5e..91780d8 100644
--- a/gpu/command_buffer/service/shared_context_state.cc
+++ b/gpu/command_buffer/service/shared_context_state.cc
@@ -105,9 +105,16 @@
 #endif
 }
 
+void ReportPipelineCacheStats(
+    skgpu::graphite::PrecompileContext* precompileContext) {
+  precompileContext->reportPipelineStats(
+      skgpu::graphite::PrecompileContext::StatOptions::kPipelineCache);
+}
+
 void ReportPrecompilationStats(
     std::unique_ptr<skgpu::graphite::PrecompileContext> precompileContext) {
-  precompileContext->reportPipelineStats();
+  precompileContext->reportPipelineStats(
+      skgpu::graphite::PrecompileContext::StatOptions::kPrecompile);
 }
 
 void InitiatePrecompilation(skgpu::graphite::Context* context) {
@@ -650,6 +657,15 @@
   if (features::IsSkiaGraphitePrecompilationEnabled(
           base::CommandLine::ForCurrentProcess())) {
     InitiatePrecompilation(graphite_context_);
+
+    precompile_context_ = graphite_context_->makePrecompileContext();
+
+    // Every 5 minutes report how many new pipelines have been encountered
+    // since the last call
+    pipeline_cache_stats_timer_.Start(
+        FROM_HERE, base::Minutes(5),
+        base::BindRepeating(&ReportPipelineCacheStats,
+                            precompile_context_.get()));
   }
 
   // We need image providers for both the OOP-R (gpu_main) recorder and the
diff --git a/gpu/command_buffer/service/shared_context_state.h b/gpu/command_buffer/service/shared_context_state.h
index f6c19a2c..e5fe57e 100644
--- a/gpu/command_buffer/service/shared_context_state.h
+++ b/gpu/command_buffer/service/shared_context_state.h
@@ -18,6 +18,7 @@
 #include "base/observer_list.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/time.h"
+#include "base/timer/timer.h"
 #include "base/trace_event/memory_dump_provider.h"
 #include "build/build_config.h"
 #include "gpu/command_buffer/common/constants.h"
@@ -57,6 +58,7 @@
 
 namespace skgpu::graphite {
 class Context;
+class PrecompileContext;
 class Recorder;
 }  // namespace skgpu::graphite
 
@@ -411,6 +413,10 @@
   std::unique_ptr<skgpu::graphite::Recorder> gpu_main_graphite_recorder_;
   std::unique_ptr<skgpu::graphite::Recorder> viz_compositor_graphite_recorder_;
 
+  // These two are only used if Precompilation is enabled
+  std::unique_ptr<skgpu::graphite::PrecompileContext> precompile_context_;
+  base::RepeatingTimer pipeline_cache_stats_timer_;
+
   scoped_refptr<gl::GLShareGroup> share_group_;
   scoped_refptr<gl::GLContext> context_;
   scoped_refptr<gl::GLContext> real_context_;
diff --git a/gpu/config/gpu_util.cc b/gpu/config/gpu_util.cc
index 4bb70fe7..00e9fde 100644
--- a/gpu/config/gpu_util.cc
+++ b/gpu/config/gpu_util.cc
@@ -513,7 +513,7 @@
       std::string use_angle =
           command_line->GetSwitchValueASCII(switches::kUseANGLE);
       if (use_angle == gl::kANGLEImplementationSwiftShaderForWebGLName ||
-          use_angle == gl::kANGLEImplementationD3D11WarpName) {
+          use_angle == gl::kANGLEImplementationD3D11WarpForWebGLName) {
         return ComputeGpuFeatureInfoForSoftwareGL();
       }
     }
diff --git a/gpu/ipc/service/gpu_init.cc b/gpu/ipc/service/gpu_init.cc
index 05023d9..c1ae63e 100644
--- a/gpu/ipc/service/gpu_init.cc
+++ b/gpu/ipc/service/gpu_init.cc
@@ -551,13 +551,9 @@
   gpu_info_.passthrough_cmd_decoder =
       gpu_preferences_.use_passthrough_cmd_decoder;
 #else
-  // If gl is disabled passthrough/validating command decoder doesn't matter. If
-  // it's not ensure that passthrough command decoder is supported as it's our
-  // only option.
-  if (!gl_disabled) {
-    gpu_info_.passthrough_cmd_decoder = true;
-    gpu_preferences_.use_passthrough_cmd_decoder = true;
-  }
+  // Use passthrough command decoder if validating was not compiled.
+  gpu_info_.passthrough_cmd_decoder = true;
+  gpu_preferences_.use_passthrough_cmd_decoder = true;
 #endif  // BUILDFLAG(ENABLE_VALIDATING_COMMAND_DECODER)
 
 #if BUILDFLAG(IS_CHROMEOS)
diff --git a/infra/config/generated/builder-owners/cronet-team@google.com.txt b/infra/config/generated/builder-owners/cronet-team@google.com.txt
index 79ea8dba..ff62aff 100644
--- a/infra/config/generated/builder-owners/cronet-team@google.com.txt
+++ b/infra/config/generated/builder-owners/cronet-team@google.com.txt
@@ -1,16 +1,9 @@
 ci/android-cronet-arm-dbg
 ci/android-cronet-arm-rel
 ci/android-cronet-arm64-dbg
-ci/android-cronet-arm64-gn2bp-dbg
 ci/android-cronet-arm64-rel
 ci/android-cronet-asan-arm-rel
 ci/android-cronet-asan-x86-rel
-ci/android-cronet-mainline-clang-arm64-dbg
-ci/android-cronet-mainline-clang-arm64-rel
-ci/android-cronet-mainline-clang-riscv64-dbg
-ci/android-cronet-mainline-clang-riscv64-rel
-ci/android-cronet-mainline-clang-x86-dbg
-ci/android-cronet-mainline-clang-x86-rel
 ci/android-cronet-x64-dbg
 ci/android-cronet-x64-dbg-12-tests
 ci/android-cronet-x64-dbg-13-tests
@@ -29,15 +22,8 @@
 try/android-cronet-arm-dbg
 try/android-cronet-arm-rel
 try/android-cronet-arm64-dbg
-try/android-cronet-arm64-gn2bp-dbg
 try/android-cronet-arm64-rel
 try/android-cronet-asan-arm-rel
-try/android-cronet-mainline-clang-arm64-dbg
-try/android-cronet-mainline-clang-arm64-rel
-try/android-cronet-mainline-clang-riscv64-dbg
-try/android-cronet-mainline-clang-riscv64-rel
-try/android-cronet-mainline-clang-x86-dbg
-try/android-cronet-mainline-clang-x86-rel
 try/android-cronet-riscv64-dbg
 try/android-cronet-riscv64-rel
 try/android-cronet-x64-dbg
diff --git a/infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/gn-args.json b/infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/gn-args.json
deleted file mode 100644
index 4030b0f..0000000
--- a/infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/gn-args.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "gn_args": {
-    "android_static_analysis": "on",
-    "clang_use_default_sample_profile": false,
-    "debuggable_apks": false,
-    "default_min_sdk_version": 23,
-    "disable_file_support": true,
-    "enable_resource_allowlist_generation": false,
-    "enable_websockets": false,
-    "include_transport_security_state_preload_list": false,
-    "is_component_build": false,
-    "is_cronet_build": true,
-    "is_debug": true,
-    "symbol_level": 1,
-    "target_cpu": "arm64",
-    "target_os": "android",
-    "use_hashed_jni_names": true,
-    "use_partition_alloc": false,
-    "use_platform_icu_alternatives": true,
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "use_thin_lto": false
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/properties.json b/infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/properties.json
deleted file mode 100644
index 841aa1a..0000000
--- a/infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/properties.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "additional_exclusions": [
-        "infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/gn-args.json"
-      ],
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "android-cronet-arm64-gn2bp-dbg",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-android-archive",
-              "builder_group": "chromium.android",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_android_config": {
-                "config": "base_config"
-              },
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "cronet_builder",
-                  "mb"
-                ],
-                "build_config": "Debug",
-                "config": "main_builder",
-                "target_arch": "arm",
-                "target_bits": 64,
-                "target_platform": "android"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "android",
-                  "checkout_copybara"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "android-cronet-arm64-gn2bp-dbg",
-          "project": "chromium"
-        }
-      ],
-      "mirroring_builder_group_and_names": [
-        {
-          "builder": "android-cronet-arm64-gn2bp-dbg",
-          "group": "tryserver.chromium.android"
-        }
-      ],
-      "targets_spec_directory": "src/infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/targets"
-    }
-  },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.android",
-  "gardener_rotations": [
-    "cronet"
-  ],
-  "recipe": "chromium",
-  "sheriff_rotations": [
-    "cronet"
-  ]
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/shadow-properties.json
deleted file mode 100644
index dc0a10e9..0000000
--- a/infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/shadow-properties.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/targets/chromium.android.json b/infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/targets/chromium.android.json
deleted file mode 100644
index f825114..0000000
--- a/infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/targets/chromium.android.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "android-cronet-arm64-gn2bp-dbg": {
-    "additional_compile_targets": [
-      "cronet_gn2bp_aosp_feedback_loop",
-      "cronet_package",
-      "cronet_package_ci"
-    ]
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-dbg/gn-args.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-dbg/gn-args.json
deleted file mode 100644
index af88555..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-dbg/gn-args.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "gn_args": {
-    "android_static_analysis": "on",
-    "clang_base_path": "//third_party/cronet_android_mainline_clang/linux-amd64",
-    "clang_use_chrome_plugins": false,
-    "clang_use_default_sample_profile": false,
-    "debuggable_apks": false,
-    "default_min_sdk_version": 29,
-    "disable_file_support": true,
-    "enable_resource_allowlist_generation": false,
-    "enable_websockets": false,
-    "include_transport_security_state_preload_list": false,
-    "is_component_build": false,
-    "is_cronet_build": true,
-    "is_debug": true,
-    "llvm_android_mainline": true,
-    "symbol_level": 1,
-    "target_cpu": "arm64",
-    "target_os": "android",
-    "use_hashed_jni_names": true,
-    "use_partition_alloc": false,
-    "use_platform_icu_alternatives": true,
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "use_thin_lto": false
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-dbg/properties.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-dbg/properties.json
deleted file mode 100644
index de97358..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-dbg/properties.json
+++ /dev/null
@@ -1,86 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "additional_exclusions": [
-        "infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-dbg/gn-args.json"
-      ],
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "android-cronet-mainline-clang-arm64-dbg",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-android-archive",
-              "builder_group": "chromium.android",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_android_config": {
-                "config": "base_config"
-              },
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "cronet_builder",
-                  "mb"
-                ],
-                "build_config": "Debug",
-                "config": "main_builder",
-                "target_arch": "arm",
-                "target_bits": 64,
-                "target_platform": "android"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "android"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "android-cronet-mainline-clang-arm64-dbg",
-          "project": "chromium"
-        }
-      ],
-      "mirroring_builder_group_and_names": [
-        {
-          "builder": "android-cronet-mainline-clang-arm64-dbg",
-          "group": "tryserver.chromium.android"
-        }
-      ],
-      "targets_spec_directory": "src/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-dbg/targets"
-    }
-  },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.android",
-  "gardener_rotations": [
-    "cronet"
-  ],
-  "recipe": "chromium",
-  "sheriff_rotations": [
-    "cronet"
-  ]
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-dbg/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-dbg/shadow-properties.json
deleted file mode 100644
index dc0a10e9..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-dbg/shadow-properties.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-dbg/targets/chromium.android.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-dbg/targets/chromium.android.json
deleted file mode 100644
index 18e1c90..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-dbg/targets/chromium.android.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "android-cronet-mainline-clang-arm64-dbg": {
-    "additional_compile_targets": [
-      "cronet_package",
-      "cronet_perf_test_apk",
-      "cronet_sample_test_apk",
-      "cronet_smoketests_missing_native_library_instrumentation_apk",
-      "cronet_smoketests_platform_only_instrumentation_apk",
-      "cronet_test_instrumentation_apk",
-      "cronet_tests_android",
-      "cronet_unittests_android",
-      "net_unittests"
-    ]
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-rel/gn-args.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-rel/gn-args.json
deleted file mode 100644
index 0a9d95ff..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-rel/gn-args.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "gn_args": {
-    "clang_base_path": "//third_party/cronet_android_mainline_clang/linux-amd64",
-    "clang_use_chrome_plugins": false,
-    "clang_use_default_sample_profile": false,
-    "dcheck_always_on": false,
-    "debuggable_apks": false,
-    "default_min_sdk_version": 29,
-    "disable_file_support": true,
-    "enable_resource_allowlist_generation": false,
-    "enable_websockets": false,
-    "include_transport_security_state_preload_list": false,
-    "is_component_build": false,
-    "is_cronet_build": true,
-    "is_debug": false,
-    "is_official_build": true,
-    "llvm_android_mainline": true,
-    "strip_debug_info": true,
-    "symbol_level": 1,
-    "target_cpu": "arm64",
-    "target_os": "android",
-    "use_clang_coverage": true,
-    "use_hashed_jni_names": true,
-    "use_partition_alloc": false,
-    "use_platform_icu_alternatives": true,
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "use_thin_lto": false
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-rel/properties.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-rel/properties.json
deleted file mode 100644
index e400dd5..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-rel/properties.json
+++ /dev/null
@@ -1,86 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "additional_exclusions": [
-        "infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-rel/gn-args.json"
-      ],
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "android-cronet-mainline-clang-arm64-rel",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-android-archive",
-              "builder_group": "chromium.android",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_android_config": {
-                "config": "base_config"
-              },
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "cronet_builder",
-                  "mb"
-                ],
-                "build_config": "Release",
-                "config": "main_builder",
-                "target_arch": "arm",
-                "target_bits": 64,
-                "target_platform": "android"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "android"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "android-cronet-mainline-clang-arm64-rel",
-          "project": "chromium"
-        }
-      ],
-      "mirroring_builder_group_and_names": [
-        {
-          "builder": "android-cronet-mainline-clang-arm64-rel",
-          "group": "tryserver.chromium.android"
-        }
-      ],
-      "targets_spec_directory": "src/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-rel/targets"
-    }
-  },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.android",
-  "gardener_rotations": [
-    "cronet"
-  ],
-  "recipe": "chromium",
-  "sheriff_rotations": [
-    "cronet"
-  ]
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-rel/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-rel/shadow-properties.json
deleted file mode 100644
index dc0a10e9..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-rel/shadow-properties.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-rel/targets/chromium.android.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-rel/targets/chromium.android.json
deleted file mode 100644
index 1a06aa5..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-rel/targets/chromium.android.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "android-cronet-mainline-clang-arm64-rel": {
-    "additional_compile_targets": [
-      "cronet_package",
-      "cronet_perf_test_apk",
-      "cronet_sample_test_apk",
-      "cronet_smoketests_missing_native_library_instrumentation_apk",
-      "cronet_smoketests_platform_only_instrumentation_apk",
-      "cronet_test_instrumentation_apk",
-      "cronet_tests_android",
-      "cronet_unittests_android",
-      "net_unittests"
-    ]
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-dbg/gn-args.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-dbg/gn-args.json
deleted file mode 100644
index 92bc45c6..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-dbg/gn-args.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "gn_args": {
-    "android_static_analysis": "on",
-    "clang_base_path": "//third_party/cronet_android_mainline_clang/linux-amd64",
-    "clang_use_chrome_plugins": false,
-    "clang_use_default_sample_profile": false,
-    "debuggable_apks": false,
-    "default_min_sdk_version": 29,
-    "disable_file_support": true,
-    "enable_resource_allowlist_generation": false,
-    "enable_websockets": false,
-    "include_transport_security_state_preload_list": false,
-    "is_component_build": false,
-    "is_cronet_build": true,
-    "is_debug": true,
-    "llvm_android_mainline": true,
-    "symbol_level": 1,
-    "target_cpu": "riscv64",
-    "target_os": "android",
-    "use_hashed_jni_names": true,
-    "use_partition_alloc": false,
-    "use_platform_icu_alternatives": true,
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "use_thin_lto": false
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-dbg/properties.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-dbg/properties.json
deleted file mode 100644
index 09b6608..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-dbg/properties.json
+++ /dev/null
@@ -1,86 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "additional_exclusions": [
-        "infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-dbg/gn-args.json"
-      ],
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "android-cronet-mainline-clang-riscv64-dbg",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-android-archive",
-              "builder_group": "chromium.android",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_android_config": {
-                "config": "base_config"
-              },
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "cronet_builder",
-                  "mb"
-                ],
-                "build_config": "Debug",
-                "config": "main_builder",
-                "target_arch": "arm",
-                "target_bits": 64,
-                "target_platform": "android"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "android"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "android-cronet-mainline-clang-riscv64-dbg",
-          "project": "chromium"
-        }
-      ],
-      "mirroring_builder_group_and_names": [
-        {
-          "builder": "android-cronet-mainline-clang-riscv64-dbg",
-          "group": "tryserver.chromium.android"
-        }
-      ],
-      "targets_spec_directory": "src/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-dbg/targets"
-    }
-  },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.android",
-  "gardener_rotations": [
-    "cronet"
-  ],
-  "recipe": "chromium",
-  "sheriff_rotations": [
-    "cronet"
-  ]
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-dbg/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-dbg/shadow-properties.json
deleted file mode 100644
index dc0a10e9..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-dbg/shadow-properties.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-dbg/targets/chromium.android.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-dbg/targets/chromium.android.json
deleted file mode 100644
index 3a6eec8..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-dbg/targets/chromium.android.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "android-cronet-mainline-clang-riscv64-dbg": {
-    "additional_compile_targets": [
-      "cronet_package",
-      "cronet_perf_test_apk",
-      "cronet_sample_test_apk",
-      "cronet_smoketests_missing_native_library_instrumentation_apk",
-      "cronet_smoketests_platform_only_instrumentation_apk",
-      "cronet_test_instrumentation_apk",
-      "cronet_tests_android",
-      "cronet_unittests_android",
-      "net_unittests"
-    ]
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-rel/gn-args.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-rel/gn-args.json
deleted file mode 100644
index 76a891a..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-rel/gn-args.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "gn_args": {
-    "clang_base_path": "//third_party/cronet_android_mainline_clang/linux-amd64",
-    "clang_use_chrome_plugins": false,
-    "clang_use_default_sample_profile": false,
-    "dcheck_always_on": false,
-    "debuggable_apks": false,
-    "default_min_sdk_version": 29,
-    "disable_file_support": true,
-    "enable_resource_allowlist_generation": false,
-    "enable_websockets": false,
-    "include_transport_security_state_preload_list": false,
-    "is_component_build": false,
-    "is_cronet_build": true,
-    "is_debug": false,
-    "is_official_build": true,
-    "llvm_android_mainline": true,
-    "strip_debug_info": true,
-    "symbol_level": 1,
-    "target_cpu": "riscv64",
-    "target_os": "android",
-    "use_hashed_jni_names": true,
-    "use_partition_alloc": false,
-    "use_platform_icu_alternatives": true,
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "use_thin_lto": false
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-rel/properties.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-rel/properties.json
deleted file mode 100644
index 6fe33c1..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-rel/properties.json
+++ /dev/null
@@ -1,86 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "additional_exclusions": [
-        "infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-rel/gn-args.json"
-      ],
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "android-cronet-mainline-clang-riscv64-rel",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-android-archive",
-              "builder_group": "chromium.android",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_android_config": {
-                "config": "base_config"
-              },
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "cronet_builder",
-                  "mb"
-                ],
-                "build_config": "Release",
-                "config": "main_builder",
-                "target_arch": "arm",
-                "target_bits": 64,
-                "target_platform": "android"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "android"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "android-cronet-mainline-clang-riscv64-rel",
-          "project": "chromium"
-        }
-      ],
-      "mirroring_builder_group_and_names": [
-        {
-          "builder": "android-cronet-mainline-clang-riscv64-rel",
-          "group": "tryserver.chromium.android"
-        }
-      ],
-      "targets_spec_directory": "src/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-rel/targets"
-    }
-  },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.android",
-  "gardener_rotations": [
-    "cronet"
-  ],
-  "recipe": "chromium",
-  "sheriff_rotations": [
-    "cronet"
-  ]
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-rel/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-rel/shadow-properties.json
deleted file mode 100644
index dc0a10e9..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-rel/shadow-properties.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-rel/targets/chromium.android.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-rel/targets/chromium.android.json
deleted file mode 100644
index 0f05b9d8..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-rel/targets/chromium.android.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "android-cronet-mainline-clang-riscv64-rel": {
-    "additional_compile_targets": [
-      "cronet_package",
-      "cronet_perf_test_apk",
-      "cronet_sample_test_apk",
-      "cronet_smoketests_missing_native_library_instrumentation_apk",
-      "cronet_smoketests_platform_only_instrumentation_apk",
-      "cronet_test_instrumentation_apk",
-      "cronet_tests_android",
-      "cronet_unittests_android",
-      "net_unittests"
-    ]
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-dbg/gn-args.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-dbg/gn-args.json
deleted file mode 100644
index 359a988d..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-dbg/gn-args.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "gn_args": {
-    "android_static_analysis": "on",
-    "clang_base_path": "//third_party/cronet_android_mainline_clang/linux-amd64",
-    "clang_use_chrome_plugins": false,
-    "clang_use_default_sample_profile": false,
-    "debuggable_apks": false,
-    "default_min_sdk_version": 29,
-    "disable_file_support": true,
-    "enable_resource_allowlist_generation": false,
-    "enable_websockets": false,
-    "include_transport_security_state_preload_list": false,
-    "is_component_build": false,
-    "is_cronet_build": true,
-    "is_debug": true,
-    "llvm_android_mainline": true,
-    "symbol_level": 1,
-    "target_cpu": "x86",
-    "target_os": "android",
-    "use_hashed_jni_names": true,
-    "use_partition_alloc": false,
-    "use_platform_icu_alternatives": true,
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "use_thin_lto": false
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-dbg/properties.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-dbg/properties.json
deleted file mode 100644
index 80346913..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-dbg/properties.json
+++ /dev/null
@@ -1,86 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "additional_exclusions": [
-        "infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-dbg/gn-args.json"
-      ],
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "android-cronet-mainline-clang-x86-dbg",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-android-archive",
-              "builder_group": "chromium.android",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_android_config": {
-                "config": "base_config"
-              },
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "cronet_builder",
-                  "mb"
-                ],
-                "build_config": "Debug",
-                "config": "main_builder",
-                "target_arch": "intel",
-                "target_bits": 32,
-                "target_platform": "android"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "android"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "android-cronet-mainline-clang-x86-dbg",
-          "project": "chromium"
-        }
-      ],
-      "mirroring_builder_group_and_names": [
-        {
-          "builder": "android-cronet-mainline-clang-x86-dbg",
-          "group": "tryserver.chromium.android"
-        }
-      ],
-      "targets_spec_directory": "src/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-dbg/targets"
-    }
-  },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.android",
-  "gardener_rotations": [
-    "cronet"
-  ],
-  "recipe": "chromium",
-  "sheriff_rotations": [
-    "cronet"
-  ]
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-dbg/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-dbg/shadow-properties.json
deleted file mode 100644
index dc0a10e9..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-dbg/shadow-properties.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-dbg/targets/chromium.android.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-dbg/targets/chromium.android.json
deleted file mode 100644
index 964bf8c..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-dbg/targets/chromium.android.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "android-cronet-mainline-clang-x86-dbg": {
-    "additional_compile_targets": [
-      "cronet_package",
-      "cronet_perf_test_apk",
-      "cronet_sample_test_apk",
-      "cronet_smoketests_missing_native_library_instrumentation_apk",
-      "cronet_smoketests_platform_only_instrumentation_apk",
-      "cronet_test_instrumentation_apk",
-      "cronet_tests_android",
-      "cronet_unittests_android",
-      "net_unittests"
-    ]
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-rel/gn-args.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-rel/gn-args.json
deleted file mode 100644
index e73fed2..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-rel/gn-args.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "gn_args": {
-    "clang_base_path": "//third_party/cronet_android_mainline_clang/linux-amd64",
-    "clang_use_chrome_plugins": false,
-    "clang_use_default_sample_profile": false,
-    "dcheck_always_on": false,
-    "debuggable_apks": false,
-    "default_min_sdk_version": 29,
-    "disable_file_support": true,
-    "enable_resource_allowlist_generation": false,
-    "enable_websockets": false,
-    "include_transport_security_state_preload_list": false,
-    "is_component_build": false,
-    "is_cronet_build": true,
-    "is_debug": false,
-    "is_official_build": true,
-    "llvm_android_mainline": true,
-    "strip_debug_info": true,
-    "symbol_level": 1,
-    "target_cpu": "x86",
-    "target_os": "android",
-    "use_clang_coverage": true,
-    "use_hashed_jni_names": true,
-    "use_partition_alloc": false,
-    "use_platform_icu_alternatives": true,
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "use_thin_lto": false
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-rel/properties.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-rel/properties.json
deleted file mode 100644
index 564bc47..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-rel/properties.json
+++ /dev/null
@@ -1,86 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "additional_exclusions": [
-        "infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-rel/gn-args.json"
-      ],
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "android-cronet-mainline-clang-x86-rel",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-android-archive",
-              "builder_group": "chromium.android",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_android_config": {
-                "config": "base_config"
-              },
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "cronet_builder",
-                  "mb"
-                ],
-                "build_config": "Release",
-                "config": "main_builder",
-                "target_arch": "intel",
-                "target_bits": 32,
-                "target_platform": "android"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "android"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "android-cronet-mainline-clang-x86-rel",
-          "project": "chromium"
-        }
-      ],
-      "mirroring_builder_group_and_names": [
-        {
-          "builder": "android-cronet-mainline-clang-x86-rel",
-          "group": "tryserver.chromium.android"
-        }
-      ],
-      "targets_spec_directory": "src/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-rel/targets"
-    }
-  },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-trusted",
-    "remote_jobs": 500
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.android",
-  "gardener_rotations": [
-    "cronet"
-  ],
-  "recipe": "chromium",
-  "sheriff_rotations": [
-    "cronet"
-  ]
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-rel/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-rel/shadow-properties.json
deleted file mode 100644
index dc0a10e9..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-rel/shadow-properties.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 500
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-rel/targets/chromium.android.json b/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-rel/targets/chromium.android.json
deleted file mode 100644
index 766b289..0000000
--- a/infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-rel/targets/chromium.android.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "android-cronet-mainline-clang-x86-rel": {
-    "additional_compile_targets": [
-      "cronet_package",
-      "cronet_perf_test_apk",
-      "cronet_sample_test_apk",
-      "cronet_smoketests_missing_native_library_instrumentation_apk",
-      "cronet_smoketests_platform_only_instrumentation_apk",
-      "cronet_test_instrumentation_apk",
-      "cronet_tests_android",
-      "cronet_unittests_android",
-      "net_unittests"
-    ]
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/gn_args_locations.json b/infra/config/generated/builders/gn_args_locations.json
index d5d5d9e..4e6f3b8 100644
--- a/infra/config/generated/builders/gn_args_locations.json
+++ b/infra/config/generated/builders/gn_args_locations.json
@@ -52,15 +52,8 @@
     "android-cronet-arm-dbg": "ci/android-cronet-arm-dbg/gn-args.json",
     "android-cronet-arm-rel": "ci/android-cronet-arm-rel/gn-args.json",
     "android-cronet-arm64-dbg": "ci/android-cronet-arm64-dbg/gn-args.json",
-    "android-cronet-arm64-gn2bp-dbg": "ci/android-cronet-arm64-gn2bp-dbg/gn-args.json",
     "android-cronet-arm64-rel": "ci/android-cronet-arm64-rel/gn-args.json",
     "android-cronet-asan-arm-rel": "ci/android-cronet-asan-arm-rel/gn-args.json",
-    "android-cronet-mainline-clang-arm64-dbg": "ci/android-cronet-mainline-clang-arm64-dbg/gn-args.json",
-    "android-cronet-mainline-clang-arm64-rel": "ci/android-cronet-mainline-clang-arm64-rel/gn-args.json",
-    "android-cronet-mainline-clang-riscv64-dbg": "ci/android-cronet-mainline-clang-riscv64-dbg/gn-args.json",
-    "android-cronet-mainline-clang-riscv64-rel": "ci/android-cronet-mainline-clang-riscv64-rel/gn-args.json",
-    "android-cronet-mainline-clang-x86-dbg": "ci/android-cronet-mainline-clang-x86-dbg/gn-args.json",
-    "android-cronet-mainline-clang-x86-rel": "ci/android-cronet-mainline-clang-x86-rel/gn-args.json",
     "android-cronet-riscv64-dbg": "ci/android-cronet-riscv64-dbg/gn-args.json",
     "android-cronet-riscv64-rel": "ci/android-cronet-riscv64-rel/gn-args.json",
     "android-cronet-x64-dbg": "ci/android-cronet-x64-dbg/gn-args.json",
@@ -605,15 +598,8 @@
     "android-cronet-arm-dbg": "try/android-cronet-arm-dbg/gn-args.json",
     "android-cronet-arm-rel": "try/android-cronet-arm-rel/gn-args.json",
     "android-cronet-arm64-dbg": "try/android-cronet-arm64-dbg/gn-args.json",
-    "android-cronet-arm64-gn2bp-dbg": "try/android-cronet-arm64-gn2bp-dbg/gn-args.json",
     "android-cronet-arm64-rel": "try/android-cronet-arm64-rel/gn-args.json",
     "android-cronet-asan-arm-rel": "try/android-cronet-asan-arm-rel/gn-args.json",
-    "android-cronet-mainline-clang-arm64-dbg": "try/android-cronet-mainline-clang-arm64-dbg/gn-args.json",
-    "android-cronet-mainline-clang-arm64-rel": "try/android-cronet-mainline-clang-arm64-rel/gn-args.json",
-    "android-cronet-mainline-clang-riscv64-dbg": "try/android-cronet-mainline-clang-riscv64-dbg/gn-args.json",
-    "android-cronet-mainline-clang-riscv64-rel": "try/android-cronet-mainline-clang-riscv64-rel/gn-args.json",
-    "android-cronet-mainline-clang-x86-dbg": "try/android-cronet-mainline-clang-x86-dbg/gn-args.json",
-    "android-cronet-mainline-clang-x86-rel": "try/android-cronet-mainline-clang-x86-rel/gn-args.json",
     "android-cronet-riscv64-dbg": "try/android-cronet-riscv64-dbg/gn-args.json",
     "android-cronet-riscv64-rel": "try/android-cronet-riscv64-rel/gn-args.json",
     "android-cronet-x64-dbg": "try/android-cronet-x64-dbg/gn-args.json",
diff --git a/infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/gn-args.json b/infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/gn-args.json
deleted file mode 100644
index 4030b0f..0000000
--- a/infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/gn-args.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "gn_args": {
-    "android_static_analysis": "on",
-    "clang_use_default_sample_profile": false,
-    "debuggable_apks": false,
-    "default_min_sdk_version": 23,
-    "disable_file_support": true,
-    "enable_resource_allowlist_generation": false,
-    "enable_websockets": false,
-    "include_transport_security_state_preload_list": false,
-    "is_component_build": false,
-    "is_cronet_build": true,
-    "is_debug": true,
-    "symbol_level": 1,
-    "target_cpu": "arm64",
-    "target_os": "android",
-    "use_hashed_jni_names": true,
-    "use_partition_alloc": false,
-    "use_platform_icu_alternatives": true,
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "use_thin_lto": false
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/properties.json b/infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/properties.json
deleted file mode 100644
index 47c3623..0000000
--- a/infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/properties.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "additional_exclusions": [
-        "infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/gn-args.json"
-      ],
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "android-cronet-arm64-gn2bp-dbg",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-android-archive",
-              "builder_group": "chromium.android",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_android_config": {
-                "config": "base_config"
-              },
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "cronet_builder",
-                  "mb"
-                ],
-                "build_config": "Debug",
-                "config": "main_builder",
-                "target_arch": "arm",
-                "target_bits": 64,
-                "target_platform": "android"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "android",
-                  "checkout_copybara"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "android-cronet-arm64-gn2bp-dbg",
-          "project": "chromium"
-        }
-      ],
-      "targets_spec_directory": "src/infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/targets"
-    }
-  },
-  "$build/flakiness": {
-    "check_for_flakiness": true,
-    "check_for_flakiness_with_resultdb": true
-  },
-  "$build/siso": {
-    "configs": [
-      "builder",
-      "remote-link"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "output_local_strategy": "greedy",
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 150
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "tryserver.chromium.android",
-  "cq": "path-based",
-  "recipe": "chromium_trybot"
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/targets/chromium.android.json b/infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/targets/chromium.android.json
deleted file mode 100644
index f825114..0000000
--- a/infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/targets/chromium.android.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "android-cronet-arm64-gn2bp-dbg": {
-    "additional_compile_targets": [
-      "cronet_gn2bp_aosp_feedback_loop",
-      "cronet_package",
-      "cronet_package_ci"
-    ]
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-dbg/gn-args.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-dbg/gn-args.json
deleted file mode 100644
index af88555..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-dbg/gn-args.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "gn_args": {
-    "android_static_analysis": "on",
-    "clang_base_path": "//third_party/cronet_android_mainline_clang/linux-amd64",
-    "clang_use_chrome_plugins": false,
-    "clang_use_default_sample_profile": false,
-    "debuggable_apks": false,
-    "default_min_sdk_version": 29,
-    "disable_file_support": true,
-    "enable_resource_allowlist_generation": false,
-    "enable_websockets": false,
-    "include_transport_security_state_preload_list": false,
-    "is_component_build": false,
-    "is_cronet_build": true,
-    "is_debug": true,
-    "llvm_android_mainline": true,
-    "symbol_level": 1,
-    "target_cpu": "arm64",
-    "target_os": "android",
-    "use_hashed_jni_names": true,
-    "use_partition_alloc": false,
-    "use_platform_icu_alternatives": true,
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "use_thin_lto": false
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-dbg/properties.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-dbg/properties.json
deleted file mode 100644
index 5ea54cd..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-dbg/properties.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "additional_exclusions": [
-        "infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-dbg/gn-args.json"
-      ],
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "android-cronet-mainline-clang-arm64-dbg",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-android-archive",
-              "builder_group": "chromium.android",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_android_config": {
-                "config": "base_config"
-              },
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "cronet_builder",
-                  "mb"
-                ],
-                "build_config": "Debug",
-                "config": "main_builder",
-                "target_arch": "arm",
-                "target_bits": 64,
-                "target_platform": "android"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "android"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "android-cronet-mainline-clang-arm64-dbg",
-          "project": "chromium"
-        }
-      ],
-      "targets_spec_directory": "src/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-dbg/targets"
-    }
-  },
-  "$build/siso": {
-    "configs": [
-      "builder",
-      "remote-link"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "output_local_strategy": "greedy",
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 150
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "tryserver.chromium.android",
-  "recipe": "chromium_trybot"
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-dbg/targets/chromium.android.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-dbg/targets/chromium.android.json
deleted file mode 100644
index 18e1c90..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-dbg/targets/chromium.android.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "android-cronet-mainline-clang-arm64-dbg": {
-    "additional_compile_targets": [
-      "cronet_package",
-      "cronet_perf_test_apk",
-      "cronet_sample_test_apk",
-      "cronet_smoketests_missing_native_library_instrumentation_apk",
-      "cronet_smoketests_platform_only_instrumentation_apk",
-      "cronet_test_instrumentation_apk",
-      "cronet_tests_android",
-      "cronet_unittests_android",
-      "net_unittests"
-    ]
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-rel/gn-args.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-rel/gn-args.json
deleted file mode 100644
index 0a9d95ff..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-rel/gn-args.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "gn_args": {
-    "clang_base_path": "//third_party/cronet_android_mainline_clang/linux-amd64",
-    "clang_use_chrome_plugins": false,
-    "clang_use_default_sample_profile": false,
-    "dcheck_always_on": false,
-    "debuggable_apks": false,
-    "default_min_sdk_version": 29,
-    "disable_file_support": true,
-    "enable_resource_allowlist_generation": false,
-    "enable_websockets": false,
-    "include_transport_security_state_preload_list": false,
-    "is_component_build": false,
-    "is_cronet_build": true,
-    "is_debug": false,
-    "is_official_build": true,
-    "llvm_android_mainline": true,
-    "strip_debug_info": true,
-    "symbol_level": 1,
-    "target_cpu": "arm64",
-    "target_os": "android",
-    "use_clang_coverage": true,
-    "use_hashed_jni_names": true,
-    "use_partition_alloc": false,
-    "use_platform_icu_alternatives": true,
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "use_thin_lto": false
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-rel/properties.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-rel/properties.json
deleted file mode 100644
index 32950a9..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-rel/properties.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "additional_exclusions": [
-        "infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-rel/gn-args.json"
-      ],
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "android-cronet-mainline-clang-arm64-rel",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-android-archive",
-              "builder_group": "chromium.android",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_android_config": {
-                "config": "base_config"
-              },
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "cronet_builder",
-                  "mb"
-                ],
-                "build_config": "Release",
-                "config": "main_builder",
-                "target_arch": "arm",
-                "target_bits": 64,
-                "target_platform": "android"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "android"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "android-cronet-mainline-clang-arm64-rel",
-          "project": "chromium"
-        }
-      ],
-      "targets_spec_directory": "src/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-rel/targets"
-    }
-  },
-  "$build/siso": {
-    "configs": [
-      "builder",
-      "remote-link"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "output_local_strategy": "greedy",
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 150
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "tryserver.chromium.android",
-  "recipe": "chromium_trybot"
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-rel/targets/chromium.android.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-rel/targets/chromium.android.json
deleted file mode 100644
index 1a06aa5..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-rel/targets/chromium.android.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "android-cronet-mainline-clang-arm64-rel": {
-    "additional_compile_targets": [
-      "cronet_package",
-      "cronet_perf_test_apk",
-      "cronet_sample_test_apk",
-      "cronet_smoketests_missing_native_library_instrumentation_apk",
-      "cronet_smoketests_platform_only_instrumentation_apk",
-      "cronet_test_instrumentation_apk",
-      "cronet_tests_android",
-      "cronet_unittests_android",
-      "net_unittests"
-    ]
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-dbg/gn-args.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-dbg/gn-args.json
deleted file mode 100644
index 92bc45c6..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-dbg/gn-args.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "gn_args": {
-    "android_static_analysis": "on",
-    "clang_base_path": "//third_party/cronet_android_mainline_clang/linux-amd64",
-    "clang_use_chrome_plugins": false,
-    "clang_use_default_sample_profile": false,
-    "debuggable_apks": false,
-    "default_min_sdk_version": 29,
-    "disable_file_support": true,
-    "enable_resource_allowlist_generation": false,
-    "enable_websockets": false,
-    "include_transport_security_state_preload_list": false,
-    "is_component_build": false,
-    "is_cronet_build": true,
-    "is_debug": true,
-    "llvm_android_mainline": true,
-    "symbol_level": 1,
-    "target_cpu": "riscv64",
-    "target_os": "android",
-    "use_hashed_jni_names": true,
-    "use_partition_alloc": false,
-    "use_platform_icu_alternatives": true,
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "use_thin_lto": false
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-dbg/properties.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-dbg/properties.json
deleted file mode 100644
index 21f3130..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-dbg/properties.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "additional_exclusions": [
-        "infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-dbg/gn-args.json"
-      ],
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "android-cronet-mainline-clang-riscv64-dbg",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-android-archive",
-              "builder_group": "chromium.android",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_android_config": {
-                "config": "base_config"
-              },
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "cronet_builder",
-                  "mb"
-                ],
-                "build_config": "Debug",
-                "config": "main_builder",
-                "target_arch": "arm",
-                "target_bits": 64,
-                "target_platform": "android"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "android"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "android-cronet-mainline-clang-riscv64-dbg",
-          "project": "chromium"
-        }
-      ],
-      "targets_spec_directory": "src/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-dbg/targets"
-    }
-  },
-  "$build/siso": {
-    "configs": [
-      "builder",
-      "remote-link"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "output_local_strategy": "greedy",
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 150
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "tryserver.chromium.android",
-  "recipe": "chromium_trybot"
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-dbg/targets/chromium.android.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-dbg/targets/chromium.android.json
deleted file mode 100644
index 3a6eec8..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-dbg/targets/chromium.android.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "android-cronet-mainline-clang-riscv64-dbg": {
-    "additional_compile_targets": [
-      "cronet_package",
-      "cronet_perf_test_apk",
-      "cronet_sample_test_apk",
-      "cronet_smoketests_missing_native_library_instrumentation_apk",
-      "cronet_smoketests_platform_only_instrumentation_apk",
-      "cronet_test_instrumentation_apk",
-      "cronet_tests_android",
-      "cronet_unittests_android",
-      "net_unittests"
-    ]
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-rel/gn-args.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-rel/gn-args.json
deleted file mode 100644
index 76a891a..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-rel/gn-args.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "gn_args": {
-    "clang_base_path": "//third_party/cronet_android_mainline_clang/linux-amd64",
-    "clang_use_chrome_plugins": false,
-    "clang_use_default_sample_profile": false,
-    "dcheck_always_on": false,
-    "debuggable_apks": false,
-    "default_min_sdk_version": 29,
-    "disable_file_support": true,
-    "enable_resource_allowlist_generation": false,
-    "enable_websockets": false,
-    "include_transport_security_state_preload_list": false,
-    "is_component_build": false,
-    "is_cronet_build": true,
-    "is_debug": false,
-    "is_official_build": true,
-    "llvm_android_mainline": true,
-    "strip_debug_info": true,
-    "symbol_level": 1,
-    "target_cpu": "riscv64",
-    "target_os": "android",
-    "use_hashed_jni_names": true,
-    "use_partition_alloc": false,
-    "use_platform_icu_alternatives": true,
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "use_thin_lto": false
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-rel/properties.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-rel/properties.json
deleted file mode 100644
index 13b991a..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-rel/properties.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "additional_exclusions": [
-        "infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-rel/gn-args.json"
-      ],
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "android-cronet-mainline-clang-riscv64-rel",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-android-archive",
-              "builder_group": "chromium.android",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_android_config": {
-                "config": "base_config"
-              },
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "cronet_builder",
-                  "mb"
-                ],
-                "build_config": "Release",
-                "config": "main_builder",
-                "target_arch": "arm",
-                "target_bits": 64,
-                "target_platform": "android"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "android"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "android-cronet-mainline-clang-riscv64-rel",
-          "project": "chromium"
-        }
-      ],
-      "targets_spec_directory": "src/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-rel/targets"
-    }
-  },
-  "$build/siso": {
-    "configs": [
-      "builder",
-      "remote-link"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "output_local_strategy": "greedy",
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 150
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "tryserver.chromium.android",
-  "recipe": "chromium_trybot"
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-rel/targets/chromium.android.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-rel/targets/chromium.android.json
deleted file mode 100644
index 0f05b9d8..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-rel/targets/chromium.android.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "android-cronet-mainline-clang-riscv64-rel": {
-    "additional_compile_targets": [
-      "cronet_package",
-      "cronet_perf_test_apk",
-      "cronet_sample_test_apk",
-      "cronet_smoketests_missing_native_library_instrumentation_apk",
-      "cronet_smoketests_platform_only_instrumentation_apk",
-      "cronet_test_instrumentation_apk",
-      "cronet_tests_android",
-      "cronet_unittests_android",
-      "net_unittests"
-    ]
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-dbg/gn-args.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-dbg/gn-args.json
deleted file mode 100644
index 359a988d..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-dbg/gn-args.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "gn_args": {
-    "android_static_analysis": "on",
-    "clang_base_path": "//third_party/cronet_android_mainline_clang/linux-amd64",
-    "clang_use_chrome_plugins": false,
-    "clang_use_default_sample_profile": false,
-    "debuggable_apks": false,
-    "default_min_sdk_version": 29,
-    "disable_file_support": true,
-    "enable_resource_allowlist_generation": false,
-    "enable_websockets": false,
-    "include_transport_security_state_preload_list": false,
-    "is_component_build": false,
-    "is_cronet_build": true,
-    "is_debug": true,
-    "llvm_android_mainline": true,
-    "symbol_level": 1,
-    "target_cpu": "x86",
-    "target_os": "android",
-    "use_hashed_jni_names": true,
-    "use_partition_alloc": false,
-    "use_platform_icu_alternatives": true,
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "use_thin_lto": false
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-dbg/properties.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-dbg/properties.json
deleted file mode 100644
index dad1e4f..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-dbg/properties.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "additional_exclusions": [
-        "infra/config/generated/builders/try/android-cronet-mainline-clang-x86-dbg/gn-args.json"
-      ],
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "android-cronet-mainline-clang-x86-dbg",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-android-archive",
-              "builder_group": "chromium.android",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_android_config": {
-                "config": "base_config"
-              },
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "cronet_builder",
-                  "mb"
-                ],
-                "build_config": "Debug",
-                "config": "main_builder",
-                "target_arch": "intel",
-                "target_bits": 32,
-                "target_platform": "android"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "android"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "android-cronet-mainline-clang-x86-dbg",
-          "project": "chromium"
-        }
-      ],
-      "targets_spec_directory": "src/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-dbg/targets"
-    }
-  },
-  "$build/siso": {
-    "configs": [
-      "builder",
-      "remote-link"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "output_local_strategy": "greedy",
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 150
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "tryserver.chromium.android",
-  "recipe": "chromium_trybot"
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-dbg/targets/chromium.android.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-dbg/targets/chromium.android.json
deleted file mode 100644
index 964bf8c..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-dbg/targets/chromium.android.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "android-cronet-mainline-clang-x86-dbg": {
-    "additional_compile_targets": [
-      "cronet_package",
-      "cronet_perf_test_apk",
-      "cronet_sample_test_apk",
-      "cronet_smoketests_missing_native_library_instrumentation_apk",
-      "cronet_smoketests_platform_only_instrumentation_apk",
-      "cronet_test_instrumentation_apk",
-      "cronet_tests_android",
-      "cronet_unittests_android",
-      "net_unittests"
-    ]
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-rel/gn-args.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-rel/gn-args.json
deleted file mode 100644
index e73fed2..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-rel/gn-args.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "gn_args": {
-    "clang_base_path": "//third_party/cronet_android_mainline_clang/linux-amd64",
-    "clang_use_chrome_plugins": false,
-    "clang_use_default_sample_profile": false,
-    "dcheck_always_on": false,
-    "debuggable_apks": false,
-    "default_min_sdk_version": 29,
-    "disable_file_support": true,
-    "enable_resource_allowlist_generation": false,
-    "enable_websockets": false,
-    "include_transport_security_state_preload_list": false,
-    "is_component_build": false,
-    "is_cronet_build": true,
-    "is_debug": false,
-    "is_official_build": true,
-    "llvm_android_mainline": true,
-    "strip_debug_info": true,
-    "symbol_level": 1,
-    "target_cpu": "x86",
-    "target_os": "android",
-    "use_clang_coverage": true,
-    "use_hashed_jni_names": true,
-    "use_partition_alloc": false,
-    "use_platform_icu_alternatives": true,
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "use_thin_lto": false
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-rel/properties.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-rel/properties.json
deleted file mode 100644
index 4a2093c..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-rel/properties.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "additional_exclusions": [
-        "infra/config/generated/builders/try/android-cronet-mainline-clang-x86-rel/gn-args.json"
-      ],
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "android-cronet-mainline-clang-x86-rel",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-android-archive",
-              "builder_group": "chromium.android",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_android_config": {
-                "config": "base_config"
-              },
-              "legacy_chromium_config": {
-                "apply_configs": [
-                  "cronet_builder",
-                  "mb"
-                ],
-                "build_config": "Release",
-                "config": "main_builder",
-                "target_arch": "intel",
-                "target_bits": 32,
-                "target_platform": "android"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "android"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "android-cronet-mainline-clang-x86-rel",
-          "project": "chromium"
-        }
-      ],
-      "targets_spec_directory": "src/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-rel/targets"
-    }
-  },
-  "$build/siso": {
-    "configs": [
-      "builder",
-      "remote-link"
-    ],
-    "enable_cloud_monitoring": true,
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "metrics_project": "chromium-reclient-metrics",
-    "output_local_strategy": "greedy",
-    "project": "rbe-chromium-untrusted",
-    "remote_jobs": 150
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "tryserver.chromium.android",
-  "recipe": "chromium_trybot"
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-rel/targets/chromium.android.json b/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-rel/targets/chromium.android.json
deleted file mode 100644
index 766b289..0000000
--- a/infra/config/generated/builders/try/android-cronet-mainline-clang-x86-rel/targets/chromium.android.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "android-cronet-mainline-clang-x86-rel": {
-    "additional_compile_targets": [
-      "cronet_package",
-      "cronet_perf_test_apk",
-      "cronet_sample_test_apk",
-      "cronet_smoketests_missing_native_library_instrumentation_apk",
-      "cronet_smoketests_platform_only_instrumentation_apk",
-      "cronet_test_instrumentation_apk",
-      "cronet_tests_android",
-      "cronet_unittests_android",
-      "net_unittests"
-    ]
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/cq-builders.md b/infra/config/generated/cq-builders.md
index e18af0c1..4c4ee2f7 100644
--- a/infra/config/generated/cq-builders.md
+++ b/infra/config/generated/cq-builders.md
@@ -186,11 +186,6 @@
   * [`//build/android/.+`](https://cs.chromium.org/chromium/src/build/android/)
   * [`//build/config/android/.+`](https://cs.chromium.org/chromium/src/build/config/android/)
 
-* [android-cronet-arm64-gn2bp-dbg](https://ci.chromium.org/p/chromium/builders/try/android-cronet-arm64-gn2bp-dbg) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""android-cronet-arm64-gn2bp-dbg""))
-
-  Location filters:
-  * [`//components/cronet/gn2bp/.+`](https://cs.chromium.org/chromium/src/components/cronet/gn2bp/)
-
 * [android-cronet-x64-dbg-15-tests](https://ci.chromium.org/p/chromium/builders/try/android-cronet-x64-dbg-15-tests) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""android-cronet-x64-dbg-15-tests""))
 
   Location filters:
diff --git a/infra/config/generated/cq-usage/full.cfg b/infra/config/generated/cq-usage/full.cfg
index 9a9129c..4be5853 100644
--- a/infra/config/generated/cq-usage/full.cfg
+++ b/infra/config/generated/cq-usage/full.cfg
@@ -632,35 +632,6 @@
         }
       }
       builders {
-        name: "chromium/try/android-cronet-arm64-gn2bp-dbg"
-        location_filters {
-          gerrit_host_regexp: ".*"
-          gerrit_project_regexp: ".*"
-          gerrit_ref_regexp: ".*"
-          path_regexp: "components/cronet/gn2bp/.+"
-        }
-        location_filters {
-          gerrit_host_regexp: ".*"
-          gerrit_project_regexp: ".*"
-          gerrit_ref_regexp: ".*"
-          path_regexp: "infra/config/.+"
-          exclude: true
-        }
-        location_filters {
-          gerrit_host_regexp: ".*"
-          gerrit_project_regexp: ".*"
-          gerrit_ref_regexp: ".*"
-          path_regexp: "docs/.+"
-          exclude: true
-        }
-        location_filters {
-          gerrit_host_regexp: ".*"
-          gerrit_project_regexp: ".*"
-          gerrit_ref_regexp: ".*"
-          path_regexp: "infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/.+"
-        }
-      }
-      builders {
         name: "chromium/try/android-cronet-x64-dbg-15-tests"
         location_filters {
           gerrit_host_regexp: ".*"
diff --git a/infra/config/generated/cq-usage/mega_cq_bots.txt b/infra/config/generated/cq-usage/mega_cq_bots.txt
index a61e1127..a08d46f 100644
--- a/infra/config/generated/cq-usage/mega_cq_bots.txt
+++ b/infra/config/generated/cq-usage/mega_cq_bots.txt
@@ -21,15 +21,8 @@
 chromium/try/android-cronet-arm-dbg
 chromium/try/android-cronet-arm-rel
 chromium/try/android-cronet-arm64-dbg
-chromium/try/android-cronet-arm64-gn2bp-dbg
 chromium/try/android-cronet-arm64-rel
 chromium/try/android-cronet-asan-arm-rel
-chromium/try/android-cronet-mainline-clang-arm64-dbg
-chromium/try/android-cronet-mainline-clang-arm64-rel
-chromium/try/android-cronet-mainline-clang-riscv64-dbg
-chromium/try/android-cronet-mainline-clang-riscv64-rel
-chromium/try/android-cronet-mainline-clang-x86-dbg
-chromium/try/android-cronet-mainline-clang-x86-rel
 chromium/try/android-cronet-riscv64-dbg
 chromium/try/android-cronet-riscv64-rel
 chromium/try/android-cronet-x64-dbg
diff --git a/infra/config/generated/health-specs/health-specs.json b/infra/config/generated/health-specs/health-specs.json
index 6324989..e2200e4 100644
--- a/infra/config/generated/health-specs/health-specs.json
+++ b/infra/config/generated/health-specs/health-specs.json
@@ -7271,27 +7271,6 @@
           }
         ]
       },
-      "android-cronet-arm64-gn2bp-dbg": {
-        "contact_team_email": "cronet-team@google.com",
-        "problem_specs": [
-          {
-            "name": "Unhealthy",
-            "period_days": 7,
-            "score": 5,
-            "thresholds": {
-              "_default": "_default"
-            }
-          },
-          {
-            "name": "Low Value",
-            "period_days": 90,
-            "score": 1,
-            "thresholds": {
-              "_default": "_default"
-            }
-          }
-        ]
-      },
       "android-cronet-arm64-rel": {
         "contact_team_email": "cronet-team@google.com",
         "problem_specs": [
@@ -7397,132 +7376,6 @@
           }
         ]
       },
-      "android-cronet-mainline-clang-arm64-dbg": {
-        "contact_team_email": "cronet-team@google.com",
-        "problem_specs": [
-          {
-            "name": "Unhealthy",
-            "period_days": 7,
-            "score": 5,
-            "thresholds": {
-              "_default": "_default"
-            }
-          },
-          {
-            "name": "Low Value",
-            "period_days": 90,
-            "score": 1,
-            "thresholds": {
-              "_default": "_default"
-            }
-          }
-        ]
-      },
-      "android-cronet-mainline-clang-arm64-rel": {
-        "contact_team_email": "cronet-team@google.com",
-        "problem_specs": [
-          {
-            "name": "Unhealthy",
-            "period_days": 7,
-            "score": 5,
-            "thresholds": {
-              "_default": "_default"
-            }
-          },
-          {
-            "name": "Low Value",
-            "period_days": 90,
-            "score": 1,
-            "thresholds": {
-              "_default": "_default"
-            }
-          }
-        ]
-      },
-      "android-cronet-mainline-clang-riscv64-dbg": {
-        "contact_team_email": "cronet-team@google.com",
-        "problem_specs": [
-          {
-            "name": "Unhealthy",
-            "period_days": 7,
-            "score": 5,
-            "thresholds": {
-              "_default": "_default"
-            }
-          },
-          {
-            "name": "Low Value",
-            "period_days": 90,
-            "score": 1,
-            "thresholds": {
-              "_default": "_default"
-            }
-          }
-        ]
-      },
-      "android-cronet-mainline-clang-riscv64-rel": {
-        "contact_team_email": "cronet-team@google.com",
-        "problem_specs": [
-          {
-            "name": "Unhealthy",
-            "period_days": 7,
-            "score": 5,
-            "thresholds": {
-              "_default": "_default"
-            }
-          },
-          {
-            "name": "Low Value",
-            "period_days": 90,
-            "score": 1,
-            "thresholds": {
-              "_default": "_default"
-            }
-          }
-        ]
-      },
-      "android-cronet-mainline-clang-x86-dbg": {
-        "contact_team_email": "cronet-team@google.com",
-        "problem_specs": [
-          {
-            "name": "Unhealthy",
-            "period_days": 7,
-            "score": 5,
-            "thresholds": {
-              "_default": "_default"
-            }
-          },
-          {
-            "name": "Low Value",
-            "period_days": 90,
-            "score": 1,
-            "thresholds": {
-              "_default": "_default"
-            }
-          }
-        ]
-      },
-      "android-cronet-mainline-clang-x86-rel": {
-        "contact_team_email": "cronet-team@google.com",
-        "problem_specs": [
-          {
-            "name": "Unhealthy",
-            "period_days": 7,
-            "score": 5,
-            "thresholds": {
-              "_default": "_default"
-            }
-          },
-          {
-            "name": "Low Value",
-            "period_days": 90,
-            "score": 1,
-            "thresholds": {
-              "_default": "_default"
-            }
-          }
-        ]
-      },
       "android-cronet-riscv64-dbg": {
         "contact_team_email": "cronet-sheriff@google.com",
         "problem_specs": [
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg
index 8631582c..6ed18c7 100644
--- a/infra/config/generated/luci/commit-queue.cfg
+++ b/infra/config/generated/luci/commit-queue.cfg
@@ -1441,38 +1441,6 @@
         disable_reuse_footers: "Include-Ci-Only-Tests"
       }
       builders {
-        name: "chromium/try/android-cronet-arm64-gn2bp-dbg"
-        disable_reuse_footers: "Include-Ci-Only-Tests"
-        location_filters {
-          gerrit_host_regexp: ".*"
-          gerrit_project_regexp: ".*"
-          gerrit_ref_regexp: ".*"
-          path_regexp: "components/cronet/gn2bp/.+"
-        }
-        location_filters {
-          gerrit_host_regexp: ".*"
-          gerrit_project_regexp: ".*"
-          gerrit_ref_regexp: ".*"
-          path_regexp: "infra/config/.+"
-          exclude: true
-        }
-        location_filters {
-          gerrit_host_regexp: ".*"
-          gerrit_project_regexp: ".*"
-          gerrit_ref_regexp: ".*"
-          path_regexp: "docs/.+"
-          exclude: true
-        }
-        location_filters {
-          gerrit_host_regexp: ".*"
-          gerrit_project_regexp: ".*"
-          gerrit_ref_regexp: ".*"
-          path_regexp: "infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/.+"
-        }
-        mode_allowlist: "DRY_RUN"
-        mode_allowlist: "FULL_RUN"
-      }
-      builders {
         name: "chromium/try/android-cronet-arm64-rel"
         includable_only: true
         disable_reuse_footers: "Include-Ci-Only-Tests"
@@ -1483,36 +1451,6 @@
         disable_reuse_footers: "Include-Ci-Only-Tests"
       }
       builders {
-        name: "chromium/try/android-cronet-mainline-clang-arm64-dbg"
-        includable_only: true
-        disable_reuse_footers: "Include-Ci-Only-Tests"
-      }
-      builders {
-        name: "chromium/try/android-cronet-mainline-clang-arm64-rel"
-        includable_only: true
-        disable_reuse_footers: "Include-Ci-Only-Tests"
-      }
-      builders {
-        name: "chromium/try/android-cronet-mainline-clang-riscv64-dbg"
-        includable_only: true
-        disable_reuse_footers: "Include-Ci-Only-Tests"
-      }
-      builders {
-        name: "chromium/try/android-cronet-mainline-clang-riscv64-rel"
-        includable_only: true
-        disable_reuse_footers: "Include-Ci-Only-Tests"
-      }
-      builders {
-        name: "chromium/try/android-cronet-mainline-clang-x86-dbg"
-        includable_only: true
-        disable_reuse_footers: "Include-Ci-Only-Tests"
-      }
-      builders {
-        name: "chromium/try/android-cronet-mainline-clang-x86-rel"
-        includable_only: true
-        disable_reuse_footers: "Include-Ci-Only-Tests"
-      }
-      builders {
         name: "chromium/try/android-cronet-riscv64-dbg"
         includable_only: true
         disable_reuse_footers: "Include-Ci-Only-Tests"
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 188dcda..30b76ca 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -41393,123 +41393,6 @@
       }
     }
     builders {
-      name: "android-cronet-arm64-gn2bp-dbg"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-arm64-gn2bp-dbg/shadow-properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.android",'
-        '  "gardener_rotations": ['
-        '    "cronet"'
-        '  ],'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium",'
-        '  "sheriff_rotations": ['
-        '    "cronet"'
-        '  ]'
-        '}'
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "Builds the gn2bp verification workflow.<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-arm64-gn2bp-dbg\">android-cronet-arm64-gn2bp-dbg</a></li></ul><br/>Builder owner: <a href=mailto:cronet-team@google.com>cronet-team@google.com</a>"
-      shadow_builder_adjustments {
-        service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-        pool: "luci.chromium.try"
-        dimensions: "free_space:"
-        dimensions: "pool:luci.chromium.try"
-      }
-      contact_team_email: "cronet-team@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
       name: "android-cronet-arm64-rel"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
@@ -42080,708 +41963,6 @@
       }
     }
     builders {
-      name: "android-cronet-mainline-clang-arm64-dbg"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-dbg/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-dbg/shadow-properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.android",'
-        '  "gardener_rotations": ['
-        '    "cronet"'
-        '  ],'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium",'
-        '  "sheriff_rotations": ['
-        '    "cronet"'
-        '  ]'
-        '}'
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-mainline-clang-arm64-dbg\">android-cronet-mainline-clang-arm64-dbg</a></li></ul><br/>Builder owner: <a href=mailto:cronet-team@google.com>cronet-team@google.com</a>"
-      shadow_builder_adjustments {
-        service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-        pool: "luci.chromium.try"
-        dimensions: "free_space:"
-        dimensions: "pool:luci.chromium.try"
-      }
-      contact_team_email: "cronet-team@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
-      name: "android-cronet-mainline-clang-arm64-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-rel/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-mainline-clang-arm64-rel/shadow-properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.android",'
-        '  "gardener_rotations": ['
-        '    "cronet"'
-        '  ],'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium",'
-        '  "sheriff_rotations": ['
-        '    "cronet"'
-        '  ]'
-        '}'
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-mainline-clang-arm64-rel\">android-cronet-mainline-clang-arm64-rel</a></li></ul><br/>Builder owner: <a href=mailto:cronet-team@google.com>cronet-team@google.com</a>"
-      shadow_builder_adjustments {
-        service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-        pool: "luci.chromium.try"
-        dimensions: "free_space:"
-        dimensions: "pool:luci.chromium.try"
-      }
-      contact_team_email: "cronet-team@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
-      name: "android-cronet-mainline-clang-riscv64-dbg"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-dbg/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-dbg/shadow-properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.android",'
-        '  "gardener_rotations": ['
-        '    "cronet"'
-        '  ],'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium",'
-        '  "sheriff_rotations": ['
-        '    "cronet"'
-        '  ]'
-        '}'
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-mainline-clang-riscv64-dbg\">android-cronet-mainline-clang-riscv64-dbg</a></li></ul><br/>Builder owner: <a href=mailto:cronet-team@google.com>cronet-team@google.com</a>"
-      shadow_builder_adjustments {
-        service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-        pool: "luci.chromium.try"
-        dimensions: "free_space:"
-        dimensions: "pool:luci.chromium.try"
-      }
-      contact_team_email: "cronet-team@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
-      name: "android-cronet-mainline-clang-riscv64-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-rel/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-mainline-clang-riscv64-rel/shadow-properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.android",'
-        '  "gardener_rotations": ['
-        '    "cronet"'
-        '  ],'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium",'
-        '  "sheriff_rotations": ['
-        '    "cronet"'
-        '  ]'
-        '}'
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-mainline-clang-riscv64-rel\">android-cronet-mainline-clang-riscv64-rel</a></li></ul><br/>Builder owner: <a href=mailto:cronet-team@google.com>cronet-team@google.com</a>"
-      shadow_builder_adjustments {
-        service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-        pool: "luci.chromium.try"
-        dimensions: "free_space:"
-        dimensions: "pool:luci.chromium.try"
-      }
-      contact_team_email: "cronet-team@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
-      name: "android-cronet-mainline-clang-x86-dbg"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-dbg/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-dbg/shadow-properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.android",'
-        '  "gardener_rotations": ['
-        '    "cronet"'
-        '  ],'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium",'
-        '  "sheriff_rotations": ['
-        '    "cronet"'
-        '  ]'
-        '}'
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-mainline-clang-x86-dbg\">android-cronet-mainline-clang-x86-dbg</a></li></ul><br/>Builder owner: <a href=mailto:cronet-team@google.com>cronet-team@google.com</a>"
-      shadow_builder_adjustments {
-        service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-        pool: "luci.chromium.try"
-        dimensions: "free_space:"
-        dimensions: "pool:luci.chromium.try"
-      }
-      contact_team_email: "cronet-team@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
-      name: "android-cronet-mainline-clang-x86-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-rel/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-mainline-clang-x86-rel/shadow-properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.android",'
-        '  "gardener_rotations": ['
-        '    "cronet"'
-        '  ],'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium",'
-        '  "sheriff_rotations": ['
-        '    "cronet"'
-        '  ]'
-        '}'
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-mainline-clang-x86-rel\">android-cronet-mainline-clang-x86-rel</a></li></ul><br/>Builder owner: <a href=mailto:cronet-team@google.com>cronet-team@google.com</a>"
-      shadow_builder_adjustments {
-        service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-        pool: "luci.chromium.try"
-        dimensions: "free_space:"
-        dimensions: "pool:luci.chromium.try"
-      }
-      contact_team_email: "cronet-team@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
       name: "android-cronet-riscv64-dbg"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
@@ -76474,6 +75655,11 @@
       resultdb {
         enable: true
       }
+      shadow_builder_adjustments {
+        service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+        pool: "luci.chromium.try"
+        dimensions: "pool:luci.chromium.try"
+      }
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -76494,6 +75680,15 @@
       }
     }
   }
+  shadow: "infra.shadow"
+}
+buckets {
+  name: "infra.shadow"
+  constraints {
+    pools: "luci.chromium.try"
+    service_accounts: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+  }
+  dynamic_builder_template {}
 }
 buckets {
   name: "reclient"
@@ -85525,119 +84720,6 @@
       }
     }
     builders {
-      name: "android-cronet-arm64-gn2bp-dbg"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/try/android-cronet-arm64-gn2bp-dbg/properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "tryserver.chromium.android",'
-        '  "cq": "path-based",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium_trybot"'
-        '}'
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      grace_period {
-        seconds: 120
-      }
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      experiments {
-        key: "luci.buildbucket.canary_software"
-        value: 5
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "<br>Builds the gn2bp verification workflow.<br/><br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-arm64-gn2bp-dbg\">android-cronet-arm64-gn2bp-dbg</a></li></ul><br/>Builder owner: <a href=mailto:cronet-team@google.com>cronet-team@google.com</a>"
-      contact_team_email: "cronet-team@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
       name: "android-cronet-arm64-rel"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
@@ -85862,678 +84944,6 @@
       }
     }
     builders {
-      name: "android-cronet-mainline-clang-arm64-dbg"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-dbg/properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "tryserver.chromium.android",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium_trybot"'
-        '}'
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      grace_period {
-        seconds: 120
-      }
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      experiments {
-        key: "luci.buildbucket.canary_software"
-        value: 5
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-mainline-clang-arm64-dbg\">android-cronet-mainline-clang-arm64-dbg</a></li></ul><br/>Builder owner: <a href=mailto:cronet-team@google.com>cronet-team@google.com</a>"
-      contact_team_email: "cronet-team@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
-      name: "android-cronet-mainline-clang-arm64-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/try/android-cronet-mainline-clang-arm64-rel/properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "tryserver.chromium.android",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium_trybot"'
-        '}'
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      grace_period {
-        seconds: 120
-      }
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      experiments {
-        key: "luci.buildbucket.canary_software"
-        value: 5
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-mainline-clang-arm64-rel\">android-cronet-mainline-clang-arm64-rel</a></li></ul><br/>Builder owner: <a href=mailto:cronet-team@google.com>cronet-team@google.com</a>"
-      contact_team_email: "cronet-team@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
-      name: "android-cronet-mainline-clang-riscv64-dbg"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-dbg/properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "tryserver.chromium.android",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium_trybot"'
-        '}'
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      grace_period {
-        seconds: 120
-      }
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      experiments {
-        key: "luci.buildbucket.canary_software"
-        value: 5
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-mainline-clang-riscv64-dbg\">android-cronet-mainline-clang-riscv64-dbg</a></li></ul><br/>Builder owner: <a href=mailto:cronet-team@google.com>cronet-team@google.com</a>"
-      contact_team_email: "cronet-team@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
-      name: "android-cronet-mainline-clang-riscv64-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/try/android-cronet-mainline-clang-riscv64-rel/properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "tryserver.chromium.android",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium_trybot"'
-        '}'
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      grace_period {
-        seconds: 120
-      }
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      experiments {
-        key: "luci.buildbucket.canary_software"
-        value: 5
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-mainline-clang-riscv64-rel\">android-cronet-mainline-clang-riscv64-rel</a></li></ul><br/>Builder owner: <a href=mailto:cronet-team@google.com>cronet-team@google.com</a>"
-      contact_team_email: "cronet-team@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
-      name: "android-cronet-mainline-clang-x86-dbg"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/try/android-cronet-mainline-clang-x86-dbg/properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "tryserver.chromium.android",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium_trybot"'
-        '}'
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      grace_period {
-        seconds: 120
-      }
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      experiments {
-        key: "luci.buildbucket.canary_software"
-        value: 5
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-mainline-clang-x86-dbg\">android-cronet-mainline-clang-x86-dbg</a></li></ul><br/>Builder owner: <a href=mailto:cronet-team@google.com>cronet-team@google.com</a>"
-      contact_team_email: "cronet-team@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
-      name: "android-cronet-mainline-clang-x86-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/try/android-cronet-mainline-clang-x86-rel/properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "tryserver.chromium.android",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium_trybot"'
-        '}'
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      grace_period {
-        seconds: 120
-      }
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      experiments {
-        key: "luci.buildbucket.canary_software"
-        value: 5
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-mainline-clang-x86-rel\">android-cronet-mainline-clang-x86-rel</a></li></ul><br/>Builder owner: <a href=mailto:cronet-team@google.com>cronet-team@google.com</a>"
-      contact_team_email: "cronet-team@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
       name: "android-cronet-riscv64-dbg"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg
index 7883685..9260468 100644
--- a/infra/config/generated/luci/luci-milo.cfg
+++ b/infra/config/generated/luci/luci-milo.cfg
@@ -3105,9 +3105,6 @@
     name: "buildbucket/luci.chromium.try/android-cronet-arm-rel"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/android-cronet-arm64-gn2bp-dbg"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/android-cronet-x64-dbg-15-tests"
   }
   builders {
@@ -8576,41 +8573,6 @@
     category: "cronet|asan"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/android-cronet-arm64-gn2bp-dbg"
-    category: "cronet|gn2bp"
-    short_name: "gn2bp"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/android-cronet-mainline-clang-arm64-dbg"
-    category: "cronet|mainline_clang|arm64"
-    short_name: "dbg"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/android-cronet-mainline-clang-riscv64-dbg"
-    category: "cronet|mainline_clang|riscv64"
-    short_name: "dbg"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/android-cronet-mainline-clang-riscv64-rel"
-    category: "cronet|mainline_clang|riscv64"
-    short_name: "rel"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/android-cronet-mainline-clang-x86-dbg"
-    category: "cronet|mainline_clang|x86"
-    short_name: "dbg"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/android-cronet-mainline-clang-arm64-rel"
-    category: "cronet|mainline_clang_coverage|arm64"
-    short_name: "rel"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/android-cronet-mainline-clang-x86-rel"
-    category: "cronet|mainline_clang_coverage|x86"
-    short_name: "rel"
-  }
-  builders {
     name: "buildbucket/luci.chromium.ci/android-cronet-riscv64-dbg"
     category: "cronet|riscv64"
     short_name: "dbg"
@@ -23928,41 +23890,6 @@
     category: "chromium.android|cronet|asan"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/android-cronet-arm64-gn2bp-dbg"
-    category: "chromium.android|cronet|gn2bp"
-    short_name: "gn2bp"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/android-cronet-mainline-clang-arm64-dbg"
-    category: "chromium.android|cronet|mainline_clang|arm64"
-    short_name: "dbg"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/android-cronet-mainline-clang-riscv64-dbg"
-    category: "chromium.android|cronet|mainline_clang|riscv64"
-    short_name: "dbg"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/android-cronet-mainline-clang-riscv64-rel"
-    category: "chromium.android|cronet|mainline_clang|riscv64"
-    short_name: "rel"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/android-cronet-mainline-clang-x86-dbg"
-    category: "chromium.android|cronet|mainline_clang|x86"
-    short_name: "dbg"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/android-cronet-mainline-clang-arm64-rel"
-    category: "chromium.android|cronet|mainline_clang_coverage|arm64"
-    short_name: "rel"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/android-cronet-mainline-clang-x86-rel"
-    category: "chromium.android|cronet|mainline_clang_coverage|x86"
-    short_name: "rel"
-  }
-  builders {
     name: "buildbucket/luci.chromium.ci/android-cronet-riscv64-dbg"
     category: "chromium.android|cronet|riscv64"
     short_name: "dbg"
@@ -26304,33 +26231,12 @@
     name: "buildbucket/luci.chromium.try/android-cronet-arm64-dbg"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/android-cronet-arm64-gn2bp-dbg"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/android-cronet-arm64-rel"
   }
   builders {
     name: "buildbucket/luci.chromium.try/android-cronet-asan-arm-rel"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/android-cronet-mainline-clang-arm64-dbg"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.try/android-cronet-mainline-clang-arm64-rel"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.try/android-cronet-mainline-clang-riscv64-dbg"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.try/android-cronet-mainline-clang-riscv64-rel"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.try/android-cronet-mainline-clang-x86-dbg"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.try/android-cronet-mainline-clang-x86-rel"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/android-cronet-riscv64-dbg"
   }
   builders {
@@ -27854,33 +27760,12 @@
     name: "buildbucket/luci.chromium.try/android-cronet-arm64-dbg"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/android-cronet-arm64-gn2bp-dbg"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/android-cronet-arm64-rel"
   }
   builders {
     name: "buildbucket/luci.chromium.try/android-cronet-asan-arm-rel"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/android-cronet-mainline-clang-arm64-dbg"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.try/android-cronet-mainline-clang-arm64-rel"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.try/android-cronet-mainline-clang-riscv64-dbg"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.try/android-cronet-mainline-clang-riscv64-rel"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.try/android-cronet-mainline-clang-x86-dbg"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.try/android-cronet-mainline-clang-x86-rel"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/android-cronet-riscv64-dbg"
   }
   builders {
diff --git a/infra/config/generated/luci/luci-notify.cfg b/infra/config/generated/luci/luci-notify.cfg
index 3144112..14d1af7 100644
--- a/infra/config/generated/luci/luci-notify.cfg
+++ b/infra/config/generated/luci/luci-notify.cfg
@@ -2257,20 +2257,6 @@
   }
   builders {
     bucket: "ci"
-    name: "android-cronet-arm64-gn2bp-dbg"
-  }
-}
-notifiers {
-  notifications {
-    on_new_status: FAILURE
-    on_new_status: INFRA_FAILURE
-    on_new_status: SUCCESS
-    email {
-      recipients: "cronet-sheriff@grotations.appspotmail.com"
-    }
-  }
-  builders {
-    bucket: "ci"
     name: "android-cronet-arm64-rel"
     repository: "https://chromium.googlesource.com/chromium/src"
   }
@@ -2301,96 +2287,6 @@
   }
   builders {
     bucket: "ci"
-    name: "android-cronet-mainline-clang-arm64-dbg"
-    repository: "https://chromium.googlesource.com/chromium/src"
-  }
-}
-notifiers {
-  notifications {
-    on_new_status: FAILURE
-    on_new_status: INFRA_FAILURE
-    on_new_status: SUCCESS
-    email {
-      recipients: "cronet-sheriff@grotations.appspotmail.com"
-    }
-  }
-  builders {
-    bucket: "ci"
-    name: "android-cronet-mainline-clang-arm64-rel"
-    repository: "https://chromium.googlesource.com/chromium/src"
-  }
-}
-notifiers {
-  notifications {
-    on_new_status: FAILURE
-    on_new_status: INFRA_FAILURE
-    on_new_status: SUCCESS
-    email {
-      recipients: "cronet-sheriff@grotations.appspotmail.com"
-    }
-  }
-  builders {
-    bucket: "ci"
-    name: "android-cronet-mainline-clang-riscv64-dbg"
-    repository: "https://chromium.googlesource.com/chromium/src"
-  }
-}
-notifiers {
-  notifications {
-    on_new_status: FAILURE
-    on_new_status: INFRA_FAILURE
-    on_new_status: SUCCESS
-    email {
-      recipients: "cronet-sheriff@grotations.appspotmail.com"
-    }
-  }
-  builders {
-    bucket: "ci"
-    name: "android-cronet-mainline-clang-riscv64-rel"
-    repository: "https://chromium.googlesource.com/chromium/src"
-  }
-}
-notifiers {
-  notifications {
-    on_new_status: FAILURE
-    on_new_status: INFRA_FAILURE
-    on_new_status: SUCCESS
-    email {
-      recipients: "cronet-sheriff@grotations.appspotmail.com"
-    }
-  }
-  builders {
-    bucket: "ci"
-    name: "android-cronet-mainline-clang-x86-dbg"
-    repository: "https://chromium.googlesource.com/chromium/src"
-  }
-}
-notifiers {
-  notifications {
-    on_new_status: FAILURE
-    on_new_status: INFRA_FAILURE
-    on_new_status: SUCCESS
-    email {
-      recipients: "cronet-sheriff@grotations.appspotmail.com"
-    }
-  }
-  builders {
-    bucket: "ci"
-    name: "android-cronet-mainline-clang-x86-rel"
-    repository: "https://chromium.googlesource.com/chromium/src"
-  }
-}
-notifiers {
-  notifications {
-    on_new_status: FAILURE
-    on_new_status: INFRA_FAILURE
-    on_new_status: SUCCESS
-    email {
-      recipients: "cronet-sheriff@grotations.appspotmail.com"
-    }
-  }
-  builders {
-    bucket: "ci"
     name: "android-cronet-riscv64-dbg"
     repository: "https://chromium.googlesource.com/chromium/src"
   }
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg
index 1ab742e..c72d322 100644
--- a/infra/config/generated/luci/luci-scheduler.cfg
+++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -3667,16 +3667,6 @@
   }
 }
 job {
-  id: "android-cronet-arm64-gn2bp-dbg"
-  realm: "ci"
-  schedule: "0 */6 * * *"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "android-cronet-arm64-gn2bp-dbg"
-  }
-}
-job {
   id: "android-cronet-arm64-rel"
   realm: "ci"
   buildbucket {
@@ -3732,60 +3722,6 @@
   }
 }
 job {
-  id: "android-cronet-mainline-clang-arm64-dbg"
-  realm: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "android-cronet-mainline-clang-arm64-dbg"
-  }
-}
-job {
-  id: "android-cronet-mainline-clang-arm64-rel"
-  realm: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "android-cronet-mainline-clang-arm64-rel"
-  }
-}
-job {
-  id: "android-cronet-mainline-clang-riscv64-dbg"
-  realm: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "android-cronet-mainline-clang-riscv64-dbg"
-  }
-}
-job {
-  id: "android-cronet-mainline-clang-riscv64-rel"
-  realm: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "android-cronet-mainline-clang-riscv64-rel"
-  }
-}
-job {
-  id: "android-cronet-mainline-clang-x86-dbg"
-  realm: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "android-cronet-mainline-clang-x86-dbg"
-  }
-}
-job {
-  id: "android-cronet-mainline-clang-x86-rel"
-  realm: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "android-cronet-mainline-clang-x86-rel"
-  }
-}
-job {
   id: "android-cronet-riscv64-dbg"
   realm: "ci"
   buildbucket {
@@ -6846,12 +6782,6 @@
   triggers: "android-cronet-arm64-rel"
   triggers: "android-cronet-asan-arm-rel"
   triggers: "android-cronet-asan-x86-rel"
-  triggers: "android-cronet-mainline-clang-arm64-dbg"
-  triggers: "android-cronet-mainline-clang-arm64-rel"
-  triggers: "android-cronet-mainline-clang-riscv64-dbg"
-  triggers: "android-cronet-mainline-clang-riscv64-rel"
-  triggers: "android-cronet-mainline-clang-x86-dbg"
-  triggers: "android-cronet-mainline-clang-x86-rel"
   triggers: "android-cronet-riscv64-dbg"
   triggers: "android-cronet-riscv64-rel"
   triggers: "android-cronet-x64-dbg"
diff --git a/infra/config/generated/luci/realms.cfg b/infra/config/generated/luci/realms.cfg
index 448c214..3844e90b 100644
--- a/infra/config/generated/luci/realms.cfg
+++ b/infra/config/generated/luci/realms.cfg
@@ -545,6 +545,17 @@
   }
 }
 realms {
+  name: "infra.shadow"
+  bindings {
+    role: "role/buildbucket.builderServiceAccount"
+    principals: "user:chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
+  }
+  bindings {
+    role: "role/buildbucket.creator"
+    principals: "group:mdb/chrome-troopers"
+  }
+}
+realms {
   name: "pools/ci"
   bindings {
     role: "role/swarming.poolOwner"
diff --git a/infra/config/generated/sheriff-rotations/cronet.txt b/infra/config/generated/sheriff-rotations/cronet.txt
index 5302ee8..4e63b41 100644
--- a/infra/config/generated/sheriff-rotations/cronet.txt
+++ b/infra/config/generated/sheriff-rotations/cronet.txt
@@ -1,15 +1,8 @@
 ci/android-cronet-arm-dbg
 ci/android-cronet-arm-rel
 ci/android-cronet-arm64-dbg
-ci/android-cronet-arm64-gn2bp-dbg
 ci/android-cronet-arm64-rel
 ci/android-cronet-asan-arm-rel
-ci/android-cronet-mainline-clang-arm64-dbg
-ci/android-cronet-mainline-clang-arm64-rel
-ci/android-cronet-mainline-clang-riscv64-dbg
-ci/android-cronet-mainline-clang-riscv64-rel
-ci/android-cronet-mainline-clang-x86-dbg
-ci/android-cronet-mainline-clang-x86-rel
 ci/android-cronet-riscv64-dbg
 ci/android-cronet-riscv64-rel
 ci/android-cronet-x64-dbg
diff --git a/infra/config/lib/builder_exemptions.star b/infra/config/lib/builder_exemptions.star
index 86afa52c..1460439 100644
--- a/infra/config/lib/builder_exemptions.star
+++ b/infra/config/lib/builder_exemptions.star
@@ -178,12 +178,6 @@
         "android-cronet-arm64-rel",
         "android-cronet-asan-arm-rel",
         "android-cronet-asan-x86-rel",
-        "android-cronet-mainline-clang-arm64-dbg",
-        "android-cronet-mainline-clang-arm64-rel",
-        "android-cronet-mainline-clang-riscv64-dbg",
-        "android-cronet-mainline-clang-riscv64-rel",
-        "android-cronet-mainline-clang-x86-dbg",
-        "android-cronet-mainline-clang-x86-rel",
         "android-cronet-marshmallow-arm64-perf-rel",
         "android-cronet-x64-dbg",
         "android-cronet-x64-dbg-12-tests",
@@ -394,12 +388,6 @@
         "android-cronet-arm64-dbg",
         "android-cronet-arm64-rel",
         "android-cronet-asan-arm-rel",
-        "android-cronet-mainline-clang-arm64-dbg",
-        "android-cronet-mainline-clang-arm64-rel",
-        "android-cronet-mainline-clang-riscv64-dbg",
-        "android-cronet-mainline-clang-riscv64-rel",
-        "android-cronet-mainline-clang-x86-dbg",
-        "android-cronet-mainline-clang-x86-rel",
         "android-cronet-x64-dbg",
         "android-cronet-x64-dbg-12-tests",
         "android-cronet-x64-dbg-13-tests",
diff --git a/infra/config/lib/ci.star b/infra/config/lib/ci.star
index 628cf8d..44ca864b 100644
--- a/infra/config/lib/ci.star
+++ b/infra/config/lib/ci.star
@@ -292,6 +292,7 @@
     DEFAULT_EXECUTION_TIMEOUT = 3 * time.hour,
     DEFAULT_FYI_PRIORITY = 35,
     DEFAULT_POOL = "luci.chromium.ci",
+    DEFAULT_SHADOW_POOL = "luci.chromium.try",
     DEFAULT_SERVICE_ACCOUNT = "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com",
     DEFAULT_SHADOW_SERVICE_ACCOUNT = "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com",
     DEFAULT_TREE_CLOSING_NOTIFIERS = _DEFAULT_TREE_CLOSING_NOTIFIERS,
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.star b/infra/config/subprojects/chromium/ci/chromium.android.star
index 348cb08..690b927 100644
--- a/infra/config/subprojects/chromium/ci/chromium.android.star
+++ b/infra/config/subprojects/chromium/ci/chromium.android.star
@@ -1513,59 +1513,6 @@
 )
 
 ci.builder(
-    name = "android-cronet-arm64-gn2bp-dbg",
-    description_html = "Builds the gn2bp verification workflow.",
-    schedule = "0 */6 * * *",  # Run every 6 hours.
-    triggered_by = [],
-    builder_spec = builder_config.builder_spec(
-        gclient_config = builder_config.gclient_config(
-            config = "chromium",
-            apply_configs = [
-                "android",
-                "checkout_copybara",
-            ],
-        ),
-        chromium_config = builder_config.chromium_config(
-            config = "main_builder",
-            apply_configs = [
-                "cronet_builder",
-                "mb",
-            ],
-            build_config = builder_config.build_config.DEBUG,
-            target_arch = builder_config.target_arch.ARM,
-            target_bits = 64,
-            target_platform = builder_config.target_platform.ANDROID,
-        ),
-        android_config = builder_config.android_config(config = "base_config"),
-        build_gs_bucket = "chromium-android-archive",
-    ),
-    gn_args = gn_args.config(
-        configs = [
-            "android_builder_without_codecs",
-            "android_with_static_analysis",
-            "cronet_android",
-            "debug_static_builder",
-            "remoteexec",
-            "arm64",
-        ],
-    ),
-    targets = targets.bundle(
-        additional_compile_targets = [
-            "cronet_gn2bp_aosp_feedback_loop",
-            "cronet_package",
-            "cronet_package_ci",
-        ],
-    ),
-    gardener_rotations = args.ignore_default(gardener_rotations.CRONET),
-    console_view_entry = consoles.console_view_entry(
-        category = "cronet|gn2bp",
-        short_name = "gn2bp",
-    ),
-    contact_team_email = "cronet-team@google.com",
-    notifies = ["cronet"],
-)
-
-ci.builder(
     name = "android-cronet-arm64-rel",
     builder_spec = builder_config.builder_spec(
         gclient_config = builder_config.gclient_config(
@@ -1673,301 +1620,6 @@
     notifies = ["cronet"],
 )
 
-# Compiles with Android Mainline Clang
-ci.builder(
-    name = "android-cronet-mainline-clang-arm64-dbg",
-    builder_spec = builder_config.builder_spec(
-        gclient_config = builder_config.gclient_config(
-            config = "chromium",
-            apply_configs = ["android"],
-        ),
-        chromium_config = builder_config.chromium_config(
-            config = "main_builder",
-            apply_configs = [
-                "cronet_builder",
-                "mb",
-            ],
-            build_config = builder_config.build_config.DEBUG,
-            target_arch = builder_config.target_arch.ARM,
-            target_bits = 64,
-            target_platform = builder_config.target_platform.ANDROID,
-        ),
-        android_config = builder_config.android_config(config = "base_config"),
-        build_gs_bucket = "chromium-android-archive",
-    ),
-    gn_args = gn_args.config(
-        configs = [
-            "android_builder_without_codecs",
-            "android_with_static_analysis",
-            "cronet_android",
-            "debug_static_builder",
-            "remoteexec",
-            "arm64",
-            "cronet_android_mainline_clang",
-        ],
-    ),
-    targets = targets.bundle(
-        targets = [
-            "cronet_common_compile_targets",
-        ],
-    ),
-    gardener_rotations = args.ignore_default(gardener_rotations.CRONET),
-    console_view_entry = consoles.console_view_entry(
-        category = "cronet|mainline_clang|arm64",
-        short_name = "dbg",
-    ),
-    contact_team_email = "cronet-team@google.com",
-    notifies = ["cronet"],
-)
-
-# Compiles with Android Mainline Clang (coverage-enabled)
-ci.builder(
-    name = "android-cronet-mainline-clang-arm64-rel",
-    builder_spec = builder_config.builder_spec(
-        gclient_config = builder_config.gclient_config(
-            config = "chromium",
-            apply_configs = ["android"],
-        ),
-        chromium_config = builder_config.chromium_config(
-            config = "main_builder",
-            apply_configs = [
-                "cronet_builder",
-                "mb",
-            ],
-            build_config = builder_config.build_config.RELEASE,
-            target_arch = builder_config.target_arch.ARM,
-            target_bits = 64,
-            target_platform = builder_config.target_platform.ANDROID,
-        ),
-        android_config = builder_config.android_config(config = "base_config"),
-        build_gs_bucket = "chromium-android-archive",
-    ),
-    gn_args = gn_args.config(
-        configs = [
-            "android_builder_without_codecs",
-            "cronet_android",
-            "official_optimize",
-            "release_builder",
-            "remoteexec",
-            "minimal_symbols",
-            "arm64",
-            "strip_debug_info",
-            "cronet_android_mainline_clang",
-            "use_clang_coverage",
-        ],
-    ),
-    targets = targets.bundle(
-        targets = [
-            "cronet_common_compile_targets",
-        ],
-    ),
-    gardener_rotations = args.ignore_default(gardener_rotations.CRONET),
-    console_view_entry = consoles.console_view_entry(
-        category = "cronet|mainline_clang_coverage|arm64",
-        short_name = "rel",
-    ),
-    contact_team_email = "cronet-team@google.com",
-    notifies = ["cronet"],
-)
-
-# Compiles with Android Mainline Clang
-ci.builder(
-    name = "android-cronet-mainline-clang-riscv64-dbg",
-    builder_spec = builder_config.builder_spec(
-        gclient_config = builder_config.gclient_config(
-            config = "chromium",
-            apply_configs = ["android"],
-        ),
-        chromium_config = builder_config.chromium_config(
-            config = "main_builder",
-            apply_configs = [
-                "cronet_builder",
-                "mb",
-            ],
-            build_config = builder_config.build_config.DEBUG,
-            target_arch = builder_config.target_arch.ARM,
-            target_bits = 64,
-            target_platform = builder_config.target_platform.ANDROID,
-        ),
-        android_config = builder_config.android_config(config = "base_config"),
-        build_gs_bucket = "chromium-android-archive",
-    ),
-    gn_args = gn_args.config(
-        configs = [
-            "android_builder_without_codecs",
-            "android_with_static_analysis",
-            "cronet_android",
-            "debug_static_builder",
-            "remoteexec",
-            "riscv64",
-            "cronet_android_mainline_clang",
-        ],
-    ),
-    targets = targets.bundle(
-        targets = [
-            "cronet_common_compile_targets",
-        ],
-    ),
-    gardener_rotations = args.ignore_default(gardener_rotations.CRONET),
-    console_view_entry = consoles.console_view_entry(
-        category = "cronet|mainline_clang|riscv64",
-        short_name = "dbg",
-    ),
-    contact_team_email = "cronet-team@google.com",
-    notifies = ["cronet"],
-)
-
-# Compiles with Android Mainline Clang
-ci.builder(
-    name = "android-cronet-mainline-clang-riscv64-rel",
-    builder_spec = builder_config.builder_spec(
-        gclient_config = builder_config.gclient_config(
-            config = "chromium",
-            apply_configs = ["android"],
-        ),
-        chromium_config = builder_config.chromium_config(
-            config = "main_builder",
-            apply_configs = [
-                "cronet_builder",
-                "mb",
-            ],
-            build_config = builder_config.build_config.RELEASE,
-            target_arch = builder_config.target_arch.ARM,
-            target_bits = 64,
-            target_platform = builder_config.target_platform.ANDROID,
-        ),
-        android_config = builder_config.android_config(config = "base_config"),
-        build_gs_bucket = "chromium-android-archive",
-    ),
-    gn_args = gn_args.config(
-        configs = [
-            "android_builder_without_codecs",
-            "cronet_android",
-            "official_optimize",
-            "release_builder",
-            "remoteexec",
-            "minimal_symbols",
-            "riscv64",
-            "strip_debug_info",
-            "cronet_android_mainline_clang",
-        ],
-    ),
-    targets = targets.bundle(
-        targets = [
-            "cronet_common_compile_targets",
-        ],
-    ),
-    gardener_rotations = args.ignore_default(gardener_rotations.CRONET),
-    console_view_entry = consoles.console_view_entry(
-        category = "cronet|mainline_clang|riscv64",
-        short_name = "rel",
-    ),
-    contact_team_email = "cronet-team@google.com",
-    notifies = ["cronet"],
-)
-
-# Compiles with Android Mainline Clang
-ci.builder(
-    name = "android-cronet-mainline-clang-x86-dbg",
-    branch_selector = branches.selector.ANDROID_BRANCHES,
-    builder_spec = builder_config.builder_spec(
-        gclient_config = builder_config.gclient_config(
-            config = "chromium",
-            apply_configs = [
-                "android",
-            ],
-        ),
-        chromium_config = builder_config.chromium_config(
-            config = "main_builder",
-            apply_configs = [
-                "cronet_builder",
-                "mb",
-            ],
-            build_config = builder_config.build_config.DEBUG,
-            target_arch = builder_config.target_arch.INTEL,
-            target_bits = 32,
-            target_platform = builder_config.target_platform.ANDROID,
-        ),
-        android_config = builder_config.android_config(
-            config = "base_config",
-        ),
-        build_gs_bucket = "chromium-android-archive",
-    ),
-    gn_args = gn_args.config(
-        configs = [
-            "android_builder_without_codecs",
-            "android_with_static_analysis",
-            "cronet_android",
-            "debug_static_builder",
-            "remoteexec",
-            "x86",
-            "cronet_android_mainline_clang",
-        ],
-    ),
-    targets = targets.bundle(
-        targets = [
-            "cronet_common_compile_targets",
-        ],
-    ),
-    gardener_rotations = args.ignore_default(gardener_rotations.CRONET),
-    console_view_entry = consoles.console_view_entry(
-        category = "cronet|mainline_clang|x86",
-        short_name = "dbg",
-    ),
-    contact_team_email = "cronet-team@google.com",
-    notifies = ["cronet"],
-)
-
-# Compiles with Android Mainline Clang (coverage-enabled)
-ci.builder(
-    name = "android-cronet-mainline-clang-x86-rel",
-    builder_spec = builder_config.builder_spec(
-        gclient_config = builder_config.gclient_config(
-            config = "chromium",
-            apply_configs = ["android"],
-        ),
-        chromium_config = builder_config.chromium_config(
-            config = "main_builder",
-            apply_configs = [
-                "cronet_builder",
-                "mb",
-            ],
-            build_config = builder_config.build_config.RELEASE,
-            target_arch = builder_config.target_arch.INTEL,
-            target_bits = 32,
-            target_platform = builder_config.target_platform.ANDROID,
-        ),
-        android_config = builder_config.android_config(config = "base_config"),
-        build_gs_bucket = "chromium-android-archive",
-    ),
-    gn_args = gn_args.config(
-        configs = [
-            "android_builder_without_codecs",
-            "cronet_android",
-            "official_optimize",
-            "release_builder",
-            "remoteexec",
-            "minimal_symbols",
-            "x86",
-            "strip_debug_info",
-            "cronet_android_mainline_clang",
-            "use_clang_coverage",
-        ],
-    ),
-    targets = targets.bundle(
-        targets = [
-            "cronet_common_compile_targets",
-        ],
-    ),
-    gardener_rotations = args.ignore_default(gardener_rotations.CRONET),
-    console_view_entry = consoles.console_view_entry(
-        category = "cronet|mainline_clang_coverage|x86",
-        short_name = "rel",
-    ),
-    contact_team_email = "cronet-team@google.com",
-    notifies = ["cronet"],
-)
-
 ci.builder(
     name = "android-cronet-riscv64-dbg",
     description_html = "Verifies building Cronet against RISC-V64",
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
index 93499ab..136566a 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -618,20 +618,6 @@
 )
 
 try_.builder(
-    name = "android-cronet-arm64-gn2bp-dbg",
-    mirrors = ["ci/android-cronet-arm64-gn2bp-dbg"],
-    gn_args = "ci/android-cronet-arm64-gn2bp-dbg",
-    contact_team_email = "cronet-team@google.com",
-    main_list_view = "try",
-    siso_remote_jobs = siso.remote_jobs.LOW_JOBS_FOR_CQ,
-    tryjob = try_.job(
-        location_filters = [
-            "components/cronet/gn2bp/.+",
-        ],
-    ),
-)
-
-try_.builder(
     name = "android-cronet-arm64-rel",
     mirrors = ["ci/android-cronet-arm64-rel"],
     # TODO(crbug.com/40462241): Switch this back to debug try builder when cronet's
@@ -650,55 +636,6 @@
 )
 
 try_.builder(
-    name = "android-cronet-mainline-clang-arm64-dbg",
-    mirrors = ["ci/android-cronet-mainline-clang-arm64-dbg"],
-    gn_args = "ci/android-cronet-mainline-clang-arm64-dbg",
-    contact_team_email = "cronet-team@google.com",
-    siso_remote_jobs = siso.remote_jobs.LOW_JOBS_FOR_CQ,
-)
-
-try_.builder(
-    name = "android-cronet-mainline-clang-arm64-rel",
-    mirrors = ["ci/android-cronet-mainline-clang-arm64-rel"],
-    gn_args = "ci/android-cronet-mainline-clang-arm64-rel",
-    contact_team_email = "cronet-team@google.com",
-    siso_remote_jobs = siso.remote_jobs.LOW_JOBS_FOR_CQ,
-)
-
-try_.builder(
-    name = "android-cronet-mainline-clang-riscv64-dbg",
-    mirrors = ["ci/android-cronet-mainline-clang-riscv64-dbg"],
-    gn_args = "ci/android-cronet-mainline-clang-riscv64-dbg",
-    contact_team_email = "cronet-team@google.com",
-    siso_remote_jobs = siso.remote_jobs.LOW_JOBS_FOR_CQ,
-)
-
-try_.builder(
-    name = "android-cronet-mainline-clang-riscv64-rel",
-    mirrors = ["ci/android-cronet-mainline-clang-riscv64-rel"],
-    gn_args = "ci/android-cronet-mainline-clang-riscv64-rel",
-    contact_team_email = "cronet-team@google.com",
-    siso_remote_jobs = siso.remote_jobs.LOW_JOBS_FOR_CQ,
-)
-
-try_.builder(
-    name = "android-cronet-mainline-clang-x86-dbg",
-    branch_selector = branches.selector.ANDROID_BRANCHES,
-    mirrors = ["ci/android-cronet-mainline-clang-x86-dbg"],
-    gn_args = "ci/android-cronet-mainline-clang-x86-dbg",
-    contact_team_email = "cronet-team@google.com",
-    siso_remote_jobs = siso.remote_jobs.LOW_JOBS_FOR_CQ,
-)
-
-try_.builder(
-    name = "android-cronet-mainline-clang-x86-rel",
-    mirrors = ["ci/android-cronet-mainline-clang-x86-rel"],
-    gn_args = "ci/android-cronet-mainline-clang-x86-rel",
-    contact_team_email = "cronet-team@google.com",
-    siso_remote_jobs = siso.remote_jobs.LOW_JOBS_FOR_CQ,
-)
-
-try_.builder(
     name = "android-cronet-riscv64-dbg",
     mirrors = ["ci/android-cronet-riscv64-dbg"],
     gn_args = "ci/android-cronet-riscv64-dbg",
diff --git a/infra/config/subprojects/infra.star b/infra/config/subprojects/infra.star
index a58c5dd..145d301 100644
--- a/infra/config/subprojects/infra.star
+++ b/infra/config/subprojects/infra.star
@@ -4,6 +4,7 @@
 """Definitions of builders in the infra bucket."""
 
 load("//lib/builders.star", "builders", "cpu", "os")
+load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 
 consoles.console_view(
@@ -18,6 +19,8 @@
     os = os.LINUX_DEFAULT,
     cpu = cpu.X86_64,
     build_numbers = True,
+    shadow_pool = ci.DEFAULT_SHADOW_POOL,
+    shadow_service_account = ci.DEFAULT_SHADOW_SERVICE_ACCOUNT,
 )
 
 luci.bucket(
@@ -49,6 +52,22 @@
     ],
 )
 
+luci.bucket(
+    name = "infra.shadow",
+    shadows = "infra",
+    constraints = luci.bucket_constraints(
+        pools = [ci.DEFAULT_SHADOW_POOL],
+        service_accounts = [ci.DEFAULT_SHADOW_SERVICE_ACCOUNT],
+    ),
+    bindings = [
+        luci.binding(
+            roles = "role/buildbucket.creator",
+            groups = "mdb/chrome-troopers",
+        ),
+    ],
+    dynamic = True,
+)
+
 builders.builder(
     name = "autosharder",
     bucket = "infra",
diff --git a/internal b/internal
index 56e640d..ebf59a9 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit 56e640d103307c0b369edd25a0ba25661a6fe93e
+Subproject commit ebf59a967121173a07b14a2c2b415983f7267b85
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn
index 58d3838..c993f37c 100644
--- a/ios/chrome/app/BUILD.gn
+++ b/ios/chrome/app/BUILD.gn
@@ -479,6 +479,7 @@
     "//ios/chrome/browser/omaha/model",
     "//ios/chrome/browser/passwords/model",
     "//ios/chrome/browser/promos_manager/model:factory",
+    "//ios/chrome/browser/push_notification/model:push_notification_delegate",
     "//ios/chrome/browser/push_notification/model:push_notification_service",
     "//ios/chrome/browser/push_notification/model:push_notification_util",
     "//ios/chrome/browser/saved_tab_groups/model",
diff --git a/ios/chrome/app/change_profile_commands.h b/ios/chrome/app/change_profile_commands.h
index 46dd15e..070f9e93 100644
--- a/ios/chrome/app/change_profile_commands.h
+++ b/ios/chrome/app/change_profile_commands.h
@@ -12,8 +12,6 @@
 
 @class SceneState;
 
-using ProfileDeletedCallback = base::OnceCallback<void(bool)>;
-
 // App-level commands related to switching profiles.
 @protocol ChangeProfileCommands
 
@@ -35,12 +33,11 @@
              forScene:(SceneState*)sceneState
          continuation:(ChangeProfileContinuation)continuation;
 
-// Deletes the profile named `profileName` and invoke `completion` when the
-// profile is marked for deletion and unloaded (or as soon as the operation
-// fails in case of failure). Each scenes that are currently displaying
-// `profileName` will switch to the personal profile.
-- (void)deleteProfile:(std::string_view)profileName
-           completion:(ProfileDeletedCallback)completion;
+// Deletes the profile named `profileName` (the data may be deleted at
+// a later time and the profile itself will be unloaded asynchronously).
+// All the scenes currently connected to this profile will switch to the
+// personal profile (with an animation).
+- (void)deleteProfile:(std::string_view)profileName;
 
 @end
 
diff --git a/ios/chrome/app/credential_provider_migrator_app_agent.h b/ios/chrome/app/credential_provider_migrator_app_agent.h
index 76c0975..54a9230 100644
--- a/ios/chrome/app/credential_provider_migrator_app_agent.h
+++ b/ios/chrome/app/credential_provider_migrator_app_agent.h
@@ -7,19 +7,10 @@
 
 #import "ios/chrome/app/application_delegate/observing_app_state_agent.h"
 
-namespace webauthn {
-class PasskeyModel;
-}  // namespace webauthn
-
 // The agent that kicks off the migration of passwords created in the credential
 // provider to the password manager.
 @interface CredentialProviderMigratorAppAgent : SceneObservingAppAgent
 
-// Performs the credential migration only for the specified passkey model.
-// If passkey_model is null, the migration is performed for all passkey models.
-- (void)credentialMigrationForPasskeyModel:
-    (webauthn::PasskeyModel*)passkeyModel;
-
 @end
 
 #endif  // IOS_CHROME_APP_CREDENTIAL_PROVIDER_MIGRATOR_APP_AGENT_H_
diff --git a/ios/chrome/app/credential_provider_migrator_app_agent.mm b/ios/chrome/app/credential_provider_migrator_app_agent.mm
index e2e10407..59dfa919 100644
--- a/ios/chrome/app/credential_provider_migrator_app_agent.mm
+++ b/ios/chrome/app/credential_provider_migrator_app_agent.mm
@@ -4,6 +4,12 @@
 
 #import "ios/chrome/app/credential_provider_migrator_app_agent.h"
 
+#import <map>
+
+#import "base/containers/contains.h"
+#import "base/functional/bind.h"
+#import "base/functional/callback.h"
+#import "base/functional/callback_helpers.h"
 #import "base/memory/raw_ptr.h"
 #import "components/keyed_service/core/service_access_type.h"
 #import "components/password_manager/core/browser/features/password_manager_features_util.h"
@@ -32,26 +38,52 @@
 
 @interface CredentialProviderMigratorAppAgent () <PasskeyModelObserverDelegate>
 
-// Keep track of the migration status of each profile.
-@property(nonatomic, strong) NSMutableSet<NSString*>* migratingTracker;
-
-@property(nonatomic, strong)
-    CredentialProviderCreationNotifier* credentialProviderCreationNotifier;
+// Invoked when -startMigrationWithCompletion: completes for a given profile.
+// The `profile` pointer may be null if the profile has been destroyed before
+// the callback is invoked.
+- (void)migrationCompleteForProfile:(ProfileIOS*)profile
+                        profileName:(const std::string&)profileName;
 
 @end
 
+namespace {
+
+// Helper function that call -migrationCompleteForProfile:... while allowing
+// to use base::BindOnce(...) which is safer as is avoid capturing implicitly
+// pointer to C++ objects.
+void MigrationCompleteForProfile(
+    __weak CredentialProviderMigratorAppAgent* app_agent,
+    base::WeakPtr<ProfileIOS> weak_profile,
+    const std::string& profile_name,
+    BOOL success,
+    NSError* error) {
+  DCHECK(success) << error.localizedDescription;
+  [app_agent migrationCompleteForProfile:weak_profile.get()
+                             profileName:profile_name];
+}
+
+}  // namespace
+
 @implementation CredentialProviderMigratorAppAgent {
-  std::vector<std::unique_ptr<PasskeyModelObserverBridge>>
+  CredentialProviderCreationNotifier* _credentialProviderCreationNotifier;
+
+  // Maps of PasskeyModel to the registered observer.
+  std::map<webauthn::PasskeyModel*,
+           std::unique_ptr<webauthn::PasskeyModel::Observer>>
       _passkeyModelObservers;
+
+  // Maps profile name to the CredentialProviderMigrator responsible for the
+  // profile's migration.
+  std::map<std::string, CredentialProviderMigrator*, std::less<>> _migratorMap;
 }
 
 - (instancetype)init {
   self = [super init];
   if (self) {
     __weak __typeof__(self) weakSelf = self;
-    self.credentialProviderCreationNotifier =
+    _credentialProviderCreationNotifier =
         [[CredentialProviderCreationNotifier alloc] initWithBlock:^() {
-          [weakSelf credentialMigrationForPasskeyModel:nullptr];
+          [weakSelf migrateCredentialForAllPasskeyModels];
         }];
   }
   return self;
@@ -59,13 +91,33 @@
 
 // Migrate the password when Chrome comes to foreground.
 - (void)appDidEnterForeground {
-  [self credentialMigrationForPasskeyModel:nullptr];
+  [self migrateCredentialForAllPasskeyModels];
 }
 
 #pragma mark - PasskeyModelObserverDelegate
 
+- (void)passKeyModelShuttingDown:(webauthn::PasskeyModel*)passkeyModel {
+  [self removeObserverForPasskeyModel:passkeyModel];
+}
+
 - (void)passkeyModelIsReady:(webauthn::PasskeyModel*)passkeyModel {
-  [self credentialMigrationForPasskeyModel:passkeyModel];
+  const std::vector<ProfileIOS*> loadedProfiles =
+      GetApplicationContext()->GetProfileManager()->GetLoadedProfiles();
+
+  const auto iter =
+      std::ranges::find_if(loadedProfiles, [passkeyModel](ProfileIOS* profile) {
+        return IOSPasskeyModelFactory::GetForProfile(profile) == passkeyModel;
+      });
+
+  if (iter != loadedProfiles.end()) {
+    NSString* key = AppGroupUserDefaultsCredentialProviderNewCredentials();
+    NSUserDefaults* userDefaults = app_group::GetGroupUserDefaults();
+
+    [self migrateCredentialForProfile:*iter
+                         passKeyModel:passkeyModel
+                                  key:key
+                         userDefaults:userDefaults];
+  }
 }
 
 #pragma mark - Private
@@ -81,111 +133,107 @@
   }
 }
 
-// Performs the credential migration only for the specified passkey model.
-// If passkey_model is nil, the migration is performed for all passkey models.
-- (void)credentialMigrationForPasskeyModel:
-    (webauthn::PasskeyModel*)passkeyModel {
+// Migrates the credential for all passkey models.
+- (void)migrateCredentialForAllPasskeyModels {
   NSString* key = AppGroupUserDefaultsCredentialProviderNewCredentials();
   NSUserDefaults* userDefaults = app_group::GetGroupUserDefaults();
 
   const std::vector<ProfileIOS*> loadedProfiles =
       GetApplicationContext()->GetProfileManager()->GetLoadedProfiles();
-  if (!self.migratingTracker) {
-    self.migratingTracker =
-        [NSMutableSet setWithCapacity:loadedProfiles.size()];
-  }
 
   for (ProfileIOS* profile : loadedProfiles) {
-    NSString* profilePathString =
-        [NSString stringWithCString:profile->GetStatePath()
-                                        .BaseName()
-                                        .MaybeAsASCII()
-                                        .c_str()
-                           encoding:NSASCIIStringEncoding];
-    // Do nothing if the migration for a profile already started.
-    if ([self.migratingTracker containsObject:profilePathString]) {
-      continue;
-    }
-
-    webauthn::PasskeyModel* passkeyStore =
+    webauthn::PasskeyModel* passkeyModel =
         IOSPasskeyModelFactory::GetForProfile(profile);
-    // If the migration is happening as a result of a passkey model becoming
-    // ready, only perform the migration for that specific passkey model.
-    if (passkeyModel && passkeyStore != passkeyModel) {
-      continue;
-    }
 
-    if (!passkeyModel && passkeyStore && !passkeyStore->IsReady()) {
-      // If the passkey model isn't ready, delay the migration of passkeys until
-      // it is ready.
-      if (![self isObservingPasskeyModel:passkeyStore]) {
-        [self addObserverForPasskeyModel:passkeyStore];
-      }
-      // The passkeyStore is set to nullptr here so that the observer just added
-      // above won't be removed in the migration's completion block below.
-      passkeyStore = nullptr;
-    }
-
-    password_manager::PasswordForm::Store defaultStore =
-        password_manager::features_util::IsAccountStorageEnabled(
-            profile->GetPrefs(), SyncServiceFactory::GetForProfile(profile))
-            ? password_manager::PasswordForm::Store::kAccountStore
-            : password_manager::PasswordForm::Store::kProfileStore;
-    scoped_refptr<password_manager::PasswordStoreInterface> storeToSave =
-        defaultStore == password_manager::PasswordForm::Store::kAccountStore
-            ? IOSChromeAccountPasswordStoreFactory::GetForProfile(
-                  profile, ServiceAccessType::IMPLICIT_ACCESS)
-            : IOSChromeProfilePasswordStoreFactory::GetForProfile(
-                  profile, ServiceAccessType::IMPLICIT_ACCESS);
-    CredentialProviderMigrator* migrator =
-        [[CredentialProviderMigrator alloc] initWithUserDefaults:userDefaults
-                                                             key:key
-                                                   passwordStore:storeToSave
-                                                    passkeyStore:passkeyStore];
-    [self.migratingTracker addObject:profilePathString];
-
-    [self allowInfobarForProfile:profile allowed:YES];
-    __weak __typeof__(self) weakSelf = self;
-    [migrator startMigrationWithCompletion:^(BOOL success, NSError* error) {
-      DCHECK(success) << error.localizedDescription;
-      if (weakSelf) {
-        [weakSelf.migratingTracker removeObject:profilePathString];
-        if (passkeyStore) {
-          [weakSelf removeObserverForPasskeyModel:passkeyStore];
-        }
-        [weakSelf allowInfobarForProfile:profile allowed:NO];
-      }
-    }];
+    [self migrateCredentialForProfile:profile
+                         passKeyModel:passkeyModel
+                                  key:key
+                         userDefaults:userDefaults];
   }
 }
 
+// Migrate the credential for the given profile and model.
+- (void)migrateCredentialForProfile:(ProfileIOS*)profile
+                       passKeyModel:(webauthn::PasskeyModel*)passkeyModel
+                                key:(NSString*)key
+                       userDefaults:(NSUserDefaults*)userDefaults {
+  CHECK(profile);
+  // Do nothing if the migration for the profile already started.
+  if (base::Contains(_migratorMap, profile->GetProfileName())) {
+    return;
+  }
+
+  // If the passkey model isn't ready, delay the migration of passkeys until
+  // it is ready.
+  if (passkeyModel && !passkeyModel->IsReady()) {
+    if (![self isObservingPasskeyModel:passkeyModel]) {
+      [self addObserverForPasskeyModel:passkeyModel];
+    }
+    return;
+  }
+
+  password_manager::PasswordForm::Store defaultStore =
+      password_manager::features_util::IsAccountStorageEnabled(
+          profile->GetPrefs(), SyncServiceFactory::GetForProfile(profile))
+          ? password_manager::PasswordForm::Store::kAccountStore
+          : password_manager::PasswordForm::Store::kProfileStore;
+  scoped_refptr<password_manager::PasswordStoreInterface> storeToSave =
+      defaultStore == password_manager::PasswordForm::Store::kAccountStore
+          ? IOSChromeAccountPasswordStoreFactory::GetForProfile(
+                profile, ServiceAccessType::IMPLICIT_ACCESS)
+          : IOSChromeProfilePasswordStoreFactory::GetForProfile(
+                profile, ServiceAccessType::IMPLICIT_ACCESS);
+
+  CredentialProviderMigrator* migrator =
+      [[CredentialProviderMigrator alloc] initWithUserDefaults:userDefaults
+                                                           key:key
+                                                 passwordStore:storeToSave
+                                                  passkeyStore:passkeyModel];
+  _migratorMap.insert(std::make_pair(profile->GetProfileName(), migrator));
+  [self allowInfobarForProfile:profile allowed:YES];
+
+  __weak __typeof__(self) weakSelf = self;
+  [migrator startMigrationWithCompletion:base::CallbackToBlock(base::BindOnce(
+                                             &MigrationCompleteForProfile,
+                                             weakSelf, profile->AsWeakPtr(),
+                                             profile->GetProfileName()))];
+}
+
+- (void)migrationCompleteForProfile:(ProfileIOS*)profile
+                        profileName:(const std::string&)profileName {
+  auto iter = _migratorMap.find(profileName);
+  CHECK(iter != _migratorMap.end());
+  _migratorMap.erase(iter);
+  if (!profile) {
+    return;
+  }
+
+  webauthn::PasskeyModel* passkeyModel =
+      IOSPasskeyModelFactory::GetForProfile(profile);
+  if ([self isObservingPasskeyModel:passkeyModel]) {
+    [self removeObserverForPasskeyModel:passkeyModel];
+  }
+
+  [self allowInfobarForProfile:profile allowed:NO];
+}
+
 // Returns whether we already own an observer for the provided passkey model.
 - (BOOL)isObservingPasskeyModel:(webauthn::PasskeyModel*)passkeyModel {
-  for (const auto& passkeyModelObserver : _passkeyModelObservers) {
-    if (passkeyModelObserver->IsObserving(passkeyModel)) {
-      return YES;
-    }
-  }
-  return NO;
+  return base::Contains(_passkeyModelObservers, passkeyModel);
 }
 
 // Adds an observer for the provided passkey model.
 - (void)addObserverForPasskeyModel:(webauthn::PasskeyModel*)passkeyModel {
-  _passkeyModelObservers.emplace_back(
-      std::make_unique<PasskeyModelObserverBridge>(self, passkeyModel));
+  CHECK(![self isObservingPasskeyModel:passkeyModel]);
+  _passkeyModelObservers.insert(std::make_pair(
+      passkeyModel,
+      std::make_unique<PasskeyModelObserverBridge>(self, passkeyModel)));
 }
 
 // Removes an observer for the provided passkey model.
 - (void)removeObserverForPasskeyModel:(webauthn::PasskeyModel*)passkeyModel {
-  auto itEnd = _passkeyModelObservers.end();
-  for (auto it = _passkeyModelObservers.begin(); it != itEnd; ++it) {
-    if ((*it)->IsObserving(passkeyModel)) {
-      // Remove the observer both from the passkey model and from this object.
-      passkeyModel->RemoveObserver(it->get());
-      _passkeyModelObservers.erase(it);
-      return;
-    }
-  }
+  CHECK([self isObservingPasskeyModel:passkeyModel]);
+  _passkeyModelObservers.erase(passkeyModel);
 }
 
 @end
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm
index c4ab0fb..89757f3f 100644
--- a/ios/chrome/app/main_controller.mm
+++ b/ios/chrome/app/main_controller.mm
@@ -23,6 +23,7 @@
 #import "base/strings/sys_string_conversions.h"
 #import "base/task/bind_post_task.h"
 #import "base/task/sequenced_task_runner.h"
+#import "base/timer/timer.h"
 #import "components/component_updater/component_updater_service.h"
 #import "components/component_updater/installer_policies/autofill_states_component_installer.h"
 #import "components/component_updater/installer_policies/on_device_head_suggest_component_installer.h"
@@ -164,13 +165,6 @@
 #import "ios/chrome/browser/default_browser/model/default_status/default_status_helper.h"
 #endif  // !BUILDFLAG(IS_IOS_MACCATALYST)
 
-@interface MainController (ForUnloadProfileMarkedForDeletion)
-
-- (void)unloadProfileMarkedForDeletion:(std::string_view)profileName
-                            completion:(ProfileDeletedCallback)completion;
-
-@end
-
 namespace {
 
 #if BUILDFLAG(FAST_APP_TERMINATE_ENABLED)
@@ -329,23 +323,6 @@
       count_discarded_scene_still_connected, 100);
 }
 
-// Helper used to call -unloadProfileMarkedForDeletion:completion: from
-// a callback.
-void UnloadProfileMarkedForDeletion(MainController* controller,
-                                    const std::string& profile_name,
-                                    ProfileDeletedCallback completion) {
-  [controller unloadProfileMarkedForDeletion:profile_name
-                                  completion:std::move(completion)];
-}
-
-// Helper used to implement a continuation that invoke `done_closure`.
-void DeleteProfileContinuation(base::OnceClosure done_closure,
-                               SceneState* scene_state,
-                               base::OnceClosure next_closure) {
-  std::move(done_closure).Run();
-  std::move(next_closure).Run();
-}
-
 }  // namespace
 
 @interface MainController () <AppStateObserver,
@@ -465,6 +442,11 @@
   // reached a significant stage (e.g. loaded the session and allowed the
   // user to interact with the application, ...).
   ProfileInitStage _highestProfileInitStageReached;
+
+  // Timer used to schedule the unload of unused profiles during the next
+  // run loop (to avoid unloading a profile and destroying all objects in
+  // an observer method as this can be dangerous if it destroy the sender).
+  base::OneShotTimer _timer;
 }
 
 // Defined by public protocols.
@@ -949,6 +931,13 @@
 #pragma mark - ProfileStateObserver
 
 - (void)profileState:(ProfileState*)profileState
+    sceneDisconnected:(SceneState*)sceneState {
+  if (profileState.connectedScenes.count == 0) {
+    [self scheduleUnloadUnusedProfiles];
+  }
+}
+
+- (void)profileState:(ProfileState*)profileState
     willTransitionToInitStage:(ProfileInitStage)nextInitStage
                 fromInitStage:(ProfileInitStage)fromInitStage {
   if (nextInitStage > _highestProfileInitStageReached) {
@@ -1032,10 +1021,9 @@
   }
 
   // This should happen for all ProfileStage as it is responsible for
-  // removing self from the observers and for recording the lauch metrics
-  // which should wait until all SceneStates have been mapped to Profiles.
+  // recording the lauch metrics which should wait until all SceneStates
+  // have been mapped to Profiles.
   if (nextInitStage == ProfileInitStage::kFinal) {
-    [profileState removeObserver:self];
     [MetricsMediator logProfileLoadMetrics:profileState.profile];
     [self recordLaunchMetrics];
   }
@@ -1688,8 +1676,7 @@
                  continuation:std::move(continuation)];
 }
 
-- (void)deleteProfile:(std::string_view)profileName
-           completion:(ProfileDeletedCallback)completion {
+- (void)deleteProfile:(std::string_view)profileName {
   CHECK(AreSeparateProfilesForManagedAccountsEnabled());
   CHECK_EQ(self.appState.initStage, AppInitStage::kFinal);
   ProfileManagerIOS* manager = GetApplicationContext()->GetProfileManager();
@@ -1698,61 +1685,44 @@
       manager->GetProfileAttributesStorage()->GetPersonalProfileName();
   DCHECK_GT(personalProfile.size(), 0u);
 
+  // Mark the profile for deletion, and then if there is no UI elements
+  // attached, immediately request it to be unloaded.
   manager->MarkProfileForDeletion(profileName);
   auto iter = _profileControllers.find(profileName);
-
-  NSArray<SceneState*>* scenes = nil;
-  if (iter != _profileControllers.end()) {
-    ProfileController* controller = iter->second;
-    scenes = controller.state.connectedScenes;
-  }
-
-  if (scenes.count == 0) {
-    // Either the Profile is not loaded or there is no scene connected, so
-    // there is no need to switch any scene to another Profile. Invoke the
-    // next step directly without waiting.
-    [self unloadProfileMarkedForDeletion:profileName
-                              completion:std::move(completion)];
+  if (iter == _profileControllers.end()) {
+    manager->UnloadProfile(profileName);
     return;
   }
 
-  __weak MainController* weakSelf = self;
-  base::RepeatingClosure closure = BarrierClosure(
-      scenes.count,
-      base::BindOnce(&UnloadProfileMarkedForDeletion, weakSelf,
-                     std::string(profileName), std::move(completion)));
+  ProfileController* controller = iter->second;
+  NSArray<SceneState*>* scenes = controller.state.connectedScenes;
+
+  // If there are no connected scenes, then there is no need to change
+  // the profile for the scene. Do not immediately unload the profile,
+  // as there may still be objects that are shutting down. Schedule a
+  // call to -unloadUnusedProfiles to unload it at the next run loop.
+  if (scenes.count == 0) {
+    [self scheduleUnloadUnusedProfiles];
+    return;
+  }
+
+  // Otherwise, change the profile for all connected scenes. This will
+  // result in a call to -profileState:sceneDisconnected: for each one
+  // and eventually a call to -scheduleUnloadUnusedProfiles.
+  auto continuation = base::BindRepeating(
+      [](SceneState* scene_state, base::OnceClosure closure) {
+        std::move(closure).Run();
+      });
 
   for (SceneState* scene in scenes) {
     [self changeProfile:personalProfile
                forScene:scene
-           continuation:base::BindOnce(&DeleteProfileContinuation, closure)];
+           continuation:continuation];
   }
 }
 
 #pragma mark - Private
 
-// Removes `profileName` in profile controller if needed and unload
-// `profileName` which should have been marked for deletion.
-- (void)unloadProfileMarkedForDeletion:(std::string_view)profileName
-                            completion:(ProfileDeletedCallback)completion {
-  ProfileManagerIOS* manager = GetApplicationContext()->GetProfileManager();
-  CHECK(manager->IsProfileMarkedForDeletion(profileName));
-  if (auto iter = _profileControllers.find(profileName);
-      iter != _profileControllers.end()) {
-    ProfileController* controller = iter->second;
-    NSArray<SceneState*>* scenes = controller.state.connectedScenes;
-    DCHECK_EQ(scenes.count, 0u);
-
-    // Call -shutdown before deleting the object.
-    [controller shutdown];
-    _profileControllers.erase(iter);
-  }
-
-  manager->UnloadProfile(profileName);
-  base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
-      FROM_HERE, base::BindOnce(std::move(completion), true));
-}
-
 // Attach a Profile to all connected scenes.
 - (void)attachProfilesToAllConnectedScenes {
   ApplicationContext* applicationContext = GetApplicationContext();
@@ -1865,4 +1835,44 @@
   [sceneState.controller setProfileState:state];
 }
 
+// Unload all unused profiles.
+- (void)unloadUnusedProfiles {
+  std::vector<std::string> profilesToUnload;
+  for (const auto& [name, controller] : _profileControllers) {
+    if (controller.state.connectedScenes.count == 0) {
+      profilesToUnload.push_back(name);
+    }
+  }
+
+  if (profilesToUnload.empty()) {
+    return;
+  }
+
+  ProfileManagerIOS* manager = GetApplicationContext()->GetProfileManager();
+
+  for (const auto& name : profilesToUnload) {
+    auto iter = _profileControllers.find(name);
+    CHECK(iter != _profileControllers.end());
+
+    ProfileController* controller = iter->second;
+    CHECK_EQ(controller.state.connectedScenes.count, 0u);
+    [controller.state removeObserver:self];
+
+    // Call -shutdown before deleting the object.
+    [controller shutdown];
+    _profileControllers.erase(iter);
+    manager->UnloadProfile(name);
+  }
+}
+
+// Schedule a call to -unloadUnusedProfiles at the next run loop iteration.
+- (void)scheduleUnloadUnusedProfiles {
+  if (!_timer.IsRunning()) {
+    __weak __typeof(self) weakSelf = self;
+    _timer.Start(FROM_HERE, base::Seconds(0), base::BindOnce(^{
+                   [weakSelf unloadUnusedProfiles];
+                 }));
+  }
+}
+
 @end
diff --git a/ios/chrome/app/profile/profile_state.mm b/ios/chrome/app/profile/profile_state.mm
index 08c5d1d..d6eaa308 100644
--- a/ios/chrome/app/profile/profile_state.mm
+++ b/ios/chrome/app/profile/profile_state.mm
@@ -266,8 +266,9 @@
       break;
 
     case SceneActivationLevelDisconnected:
-      [_connectedSceneStates removeObject:sceneState];
       [sceneState removeObserver:self];
+      [_connectedSceneStates removeObject:sceneState];
+      [_observers profileState:self sceneDisconnected:sceneState];
       break;
 
     case SceneActivationLevelBackground:
diff --git a/ios/chrome/app/profile/profile_state_observer.h b/ios/chrome/app/profile/profile_state_observer.h
index 84df149..0156f34 100644
--- a/ios/chrome/app/profile/profile_state_observer.h
+++ b/ios/chrome/app/profile/profile_state_observer.h
@@ -20,6 +20,10 @@
 - (void)profileState:(ProfileState*)profileState
       sceneConnected:(SceneState*)sceneState;
 
+// Called when a scene is disconnected.
+- (void)profileState:(ProfileState*)profileState
+    sceneDisconnected:(SceneState*)sceneState;
+
 // Called when the first scene initializes its UI.
 - (void)profileState:(ProfileState*)profileState
     firstSceneHasInitializedUI:(SceneState*)sceneState;
diff --git a/ios/chrome/app/resources/Settings.bundle/Experimental.plist b/ios/chrome/app/resources/Settings.bundle/Experimental.plist
index fffdbc7..282f725 100644
--- a/ios/chrome/app/resources/Settings.bundle/Experimental.plist
+++ b/ios/chrome/app/resources/Settings.bundle/Experimental.plist
@@ -568,6 +568,16 @@
 			<key>Type</key>
 			<string>PSToggleSwitchSpecifier</string>
 			<key>Title</key>
+                        <string>Enable Reader Mode HTML override</string>
+			<key>Key</key>
+			<string>ForceReaderModeDebugHTMLOverride</string>
+			<key>DefaultValue</key>
+			<false/>
+                </dict>
+		<dict>
+			<key>Type</key>
+			<string>PSToggleSwitchSpecifier</string>
+			<key>Title</key>
 			<string>Enable AI Prototyping Menu</string>
 			<key>Key</key>
 			<string>EnableAIPrototypingMenu</string>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb
index c3bf405..1de1f47 100644
--- a/ios/chrome/app/strings/resources/ios_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">እንደገና ጫን</translation>
 <translation id="2015722694326466240">የይለፍ ቃላትን ለመመልከት በመጀመሪያ በመሣሪያዎ ላይ የይለፍ ኮድ ማዘጋጀት አለብዎት።</translation>
 <translation id="201759455285471444">የትር ቡድኑን ዘርጋ</translation>
+<translation id="202070562065520783">ይህን አብራራልኝ</translation>
 <translation id="2021670401941426298">መተግበር የሚችል ከሆነ የፍለጋ ታሪክዎን ለመሰረዝ የፍለጋ ፕሮግራምዎን መመሪያዎች ይመልከቱ።</translation>
 <translation id="2044394949148788042">የትር ፍርግርግን ይክፈቱ</translation>
 <translation id="20485545164632846">አዲስ ንጥል</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index 7d8e0d4..761e01b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -526,6 +526,7 @@
 <translation id="3167868116600277716">خلاصة ميزة "اقتراحات"</translation>
 <translation id="3169472444629675720">اقتراحات</translation>
 <translation id="3174662312949010067">يمكنك أيضًا استخدام كلمات المرور المحفوظة على أجهزتك الأخرى.</translation>
+<translation id="3177338796769255211">يمكنك تسجيل الدخول للوصول إلى الإشارات المرجعية وغير ذلك على جميع أجهزتك</translation>
 <translation id="3181954750937456830">التصفُّح الآمن (يحميك ويحمي جهازك من المواقع الإلكترونية الضارة)</translation>
 <translation id="3190736958609431397">إيقاف التتبُّع</translation>
 <translation id="3208260410153224535">أوقفت مؤسستك إمكانية تسجيل الدخول. سيتم حفظ كلمات المرور والإشارات المرجعية الجديدة وغيرها على هذا الجهاز فقط.</translation>
@@ -663,7 +664,7 @@
 <translation id="3858860766373142691">الاسم</translation>
 <translation id="3868495844258915202">‏عرض عناوين URL بالكامل</translation>
 <translation id="3875783148670536197">الاطّلاع على الإرشادات</translation>
-<translation id="3885587018298784481">الانضمام إلى مجموعة عائلة</translation>
+<translation id="3885587018298784481">يجب الانضمام إلى مجموعة عائلة</translation>
 <translation id="3888863481921783344">سيتم استخدام هذه البيانات لعرض المدعوين المحتملين إلى الحدث الخاص بك.</translation>
 <translation id="3891414008432200754">السعر</translation>
 <translation id="3892144330757387737">سيظهر لك السجلّ هنا</translation>
@@ -1108,7 +1109,7 @@
 <translation id="5684761169742812828">‏تم الكشف عن كلمة المرور هذه في عملية اختراق للبيانات على الإنترنت. إذا لم يكن لديك الوقت لتغييرها الآن، تنصحك Google بإبقاء هذا التحذير لتذكيرك لاحقًا.</translation>
 <translation id="5694848685995373177">‏تم حفظ الملف في الحساب <ph name="USER_EMAIL" /> على Google Drive.</translation>
 <translation id="570209299585559496">يمكنك تغيير طريقة العرض التلقائية للمواقع الإلكترونية إلى وضع سطح المكتب في "الإعدادات" ثمّ "إعدادات المحتوى"</translation>
-<translation id="5702108177581350218">‏عند مشاركة نسخة من اسم المستخدم وكلمة المرور، يمكن لأحد أفراد عائلتك ملء هذه البيانات باستخدام "مدير كلمات المرور في Google".</translation>
+<translation id="5702108177581350218">‏عند مشاركة نسخة من اسم المستخدم وكلمة المرور مع فرد من عائلتك، يمكنه ملء هذه البيانات باستخدام "مدير كلمات المرور في Google".</translation>
 <translation id="5704908597376970822">تعذّر تسجيل الدخول.</translation>
 <translation id="5709005673595820640">{count,plural, =1{لديك كلمة مرور واحدة ({count}) مستخدَمة لحساب آخر ويمكن أن تعرّضك لمشاكل أمنية. عليك تغييرها الآن للحفاظ على أمانك.}zero{لديك {count} كلمة مرور مستخدَمة لحساب آخر ويمكن أن تعرّضك لمشاكل أمنية. عليك تغييرها الآن للحفاظ على أمانك.}two{لديك كلمتا مرور ({count}) مستخدَمتان لحساب آخر ويمكنهما تعريضك لمشاكل أمنية. عليك تغييرهما الآن للحفاظ على أمانك.}few{لديك {count} كلمات مرور مستخدَمة لحساب آخر ويمكن أن تعرّضك لمشاكل أمنية. عليك تغييرها الآن للحفاظ على أمانك.}many{لديك {count} كلمة مرور مستخدَمة لحساب آخر ويمكن أن تعرّضك لمشاكل أمنية. عليك تغييرها الآن للحفاظ على أمانك.}other{لديك {count} كلمة مرور مستخدَمة لحساب آخر ويمكن أن تعرّضك لمشاكل أمنية. عليك تغييرها الآن للحفاظ على أمانك.}}</translation>
 <translation id="57094364128775171">اقتراح كلمة مرور قوية…</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
index 3ebfa97..5f5a6855 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -526,7 +526,7 @@
 <translation id="3167868116600277716">Sažetak sadržaja na Discoveru</translation>
 <translation id="3169472444629675720">Otkrijte</translation>
 <translation id="3174662312949010067">Također možete koristiti sačuvane lozinke na drugim uređajima.</translation>
-<translation id="3177338796769255211">Prijavite se kako biste imali pristup svojim oznakama i ostalom na svim svojim uređajima</translation>
+<translation id="3177338796769255211">Prijavite se da pristupite svojim oznakama i drugom na svim uređajima</translation>
 <translation id="3181954750937456830">Sigurno pregledanje (štiti vas i vaš uređaj od opasnih web lokacija)</translation>
 <translation id="3190736958609431397">Prestani pratiti</translation>
 <translation id="3208260410153224535">Vaša organizacija je isključila prijavu. Nove oznake, lozinke i još mnogo toga će se pohranjivati samo na ovom uređaju.</translation>
@@ -1127,6 +1127,7 @@
 <translation id="573974402615125334">Da dijelite grupe kartica, pridružujete im se i sarađujete u njima, sinhronizirajte historiju i kartice</translation>
 <translation id="5740123193752401435">Pretraživanje kartica…</translation>
 <translation id="5744274077973758795">Obavještenja funkcije <ph name="FEATURE_NAME" /> su uključena</translation>
+<translation id="5745598824054949526">Tekst nije pronađen</translation>
 <translation id="574762237186762643">Događaji</translation>
 <translation id="5749158352074143502">Nastavi s ovom karticom</translation>
 <translation id="5753021559215751319">Sačuvaj lozinku</translation>
@@ -1290,6 +1291,7 @@
 <translation id="6410883413783534063">Otvorite kartice da istovremeno posjetite različite stranice</translation>
 <translation id="6416807286621280684">Novosti o praćenim paketima i isporukama.</translation>
 <translation id="6418346271604475326">Pripremanje PDF-a</translation>
+<translation id="6421038304268477484">Prevedeni tekst</translation>
 <translation id="6429213933892582367">Otvorite Opcije lozinke</translation>
 <translation id="6434591244308415567">Došlo je do greške. Pokušajte ponovo kasnije.</translation>
 <translation id="6435307030888827407">Nastavi bez prijave</translation>
@@ -1968,6 +1970,7 @@
 <translation id="9097506547406246598">Nije moguće prestati pratiti. Nešto nije uredu.</translation>
 <translation id="9098541895599151034">Izbrisati <ph name="NUMBER_OF_ACCOUNTS" /> lozinku/e/i?</translation>
 <translation id="9099233023029360602">Svaki put pitaj koji račun koristiti</translation>
+<translation id="9099821309562615674">Tekst koji želite prevesti treba biti čitljiv i nalaziti se u kadru.</translation>
 <translation id="9100610230175265781">Potreban je pristupni izraz</translation>
 <translation id="91023216973987714">Načini plaćanja</translation>
 <translation id="9106655997975673326">S uređaja "<ph name="SOURCE_DEVICE" />"</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cy.xtb b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
index b67b75f..4d71348 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cy.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">Ail-lwytho</translation>
 <translation id="2015722694326466240">I weld cyfrineiriau, rhaid i chi osod cod pas ar eich dyfais yn gyntaf.</translation>
 <translation id="201759455285471444">Ehangu'r grŵp tab.</translation>
+<translation id="202070562065520783">Eglurwch hyn i mi</translation>
 <translation id="2021670401941426298">Gweld cyfarwyddiadau eich peiriant chwilio er mwyn dileu eich hanes chwilio, os yw'n berthnasol.</translation>
 <translation id="2044394949148788042">Agorwch y grid tabiau</translation>
 <translation id="20485545164632846">eitem newydd</translation>
@@ -525,6 +526,7 @@
 <translation id="3167868116600277716">Ffrwd darganfod</translation>
 <translation id="3169472444629675720">Discover</translation>
 <translation id="3174662312949010067">Gallwch hefyd ddefnyddio cyfrineiriau sydd wedi'u cadw ar eich dyfeisiau eraill.</translation>
+<translation id="3177338796769255211">Mewngofnodwch i gael eich nodau tudalen a rhagor ar eich holl ddyfeisiau</translation>
 <translation id="3181954750937456830">Pori'n Ddiogel (yn eich amddiffyn chi a'ch dyfais rhag gwefannau peryglus)</translation>
 <translation id="3190736958609431397">Dadolrhain</translation>
 <translation id="3208260410153224535">Mae eich sefydliad wedi diffodd mewngofnodi. Dim ond i'r ddyfais hon y bydd nodau tudalen, cyfrineiriau a rhagor sy'n newydd yn cael eu cadw.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb
index 6991714..99a8c55 100644
--- a/ios/chrome/app/strings/resources/ios_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">Genindlæs</translation>
 <translation id="2015722694326466240">Angiv en adgangskode på din enhed, før du kan se adgangskoder.</translation>
 <translation id="201759455285471444">Udvid fanegruppe.</translation>
+<translation id="202070562065520783">Forklar dette til mig</translation>
 <translation id="2021670401941426298">Se din søgemaskines vejledning i, hvordan du sletter din søgehistorik, hvis det er relevant.</translation>
 <translation id="2044394949148788042">Åbn fanegitteret</translation>
 <translation id="20485545164632846">nyt element</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb
index 6ae6b00c..a17ac46a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">Aktualisieren</translation>
 <translation id="2015722694326466240">Um die Passwörter zu sehen, musst du zuerst einen Sicherheitscode auf deinem Gerät einrichten.</translation>
 <translation id="201759455285471444">Tabgruppe maximieren.</translation>
+<translation id="202070562065520783">Erkläre mir das</translation>
 <translation id="2021670401941426298">Informationen zum Löschen deines Suchverlaufs findest du in der Anleitung deiner Suchmaschine.</translation>
 <translation id="2044394949148788042">Tabraster öffnen</translation>
 <translation id="20485545164632846">neues Element</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb
index ffdab16..d8568f2 100644
--- a/ios/chrome/app/strings/resources/ios_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">Επανάληψη φόρτωσης</translation>
 <translation id="2015722694326466240">Για να δείτε τους κωδικούς πρόσβασης, θα πρέπει πρώτα να ορίσετε έναν κωδικό πρόσβασης για τη συσκευή σας.</translation>
 <translation id="201759455285471444">Ανάπτυξη ομάδας καρτελών.</translation>
+<translation id="202070562065520783">Εξήγησέ μου το εξής</translation>
 <translation id="2021670401941426298">Ανατρέξτε στις οδηγίες της μηχανής αναζήτησης σχετικά με τη διαγραφή του ιστορικού αναζήτησής σας, εφόσον υπάρχουν.</translation>
 <translation id="2044394949148788042">Άνοιγμα του πλέγματος καρτελών</translation>
 <translation id="20485545164632846">νέο στοιχείο</translation>
@@ -525,6 +526,7 @@
 <translation id="3167868116600277716">Ροή Discover</translation>
 <translation id="3169472444629675720">Discover</translation>
 <translation id="3174662312949010067">Μπορείτε επίσης να αποθηκεύσετε κωδικούς πρόσβασης σε άλλες συσκευές σας.</translation>
+<translation id="3177338796769255211">Συνδεθείτε, για να έχετε στη διάθεσή σας τους σελιδοδείκτες και άλλα στοιχεία σε όλες τις συσκευές σας</translation>
 <translation id="3181954750937456830">Ασφαλής περιήγηση (προστατεύει εσάς και τη συσκευή σας από επικίνδυνους ιστοτόπους)</translation>
 <translation id="3190736958609431397">Κατάργηση παρακολούθησης</translation>
 <translation id="3208260410153224535">Η σύνδεση απενεργοποιήθηκε από τον οργανισμό σας. Οι νέοι σελιδοδείκτες, κωδικοί πρόσβασης και άλλα δεδομένα θα αποθηκεύονται μόνο σε αυτήν τη συσκευή.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb
index 9391a7f..2286c76 100644
--- a/ios/chrome/app/strings/resources/ios_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -1125,6 +1125,7 @@
 <translation id="573974402615125334">Vahelehegruppide jagamiseks, nendega liitumiseks ning nendes koos töötamiseks sünkroonige oma ajalugu ja vahelehed</translation>
 <translation id="5740123193752401435">Otsige vahelehtedelt …</translation>
 <translation id="5744274077973758795">Funktsiooni <ph name="FEATURE_NAME" /> märguanded on sisse lülitatud</translation>
+<translation id="5745598824054949526">Teksti ei leitud</translation>
 <translation id="574762237186762643">Sündmused</translation>
 <translation id="5749158352074143502">Jätka selle vahekaardiga</translation>
 <translation id="5753021559215751319">Salvesta parool</translation>
@@ -1288,6 +1289,7 @@
 <translation id="6410883413783534063">Avage vahelehti, et samal ajal eri lehti külastada</translation>
 <translation id="6416807286621280684">Teie jälgitavad pakid ja tarnevärskendused.</translation>
 <translation id="6418346271604475326">PDF-i ettevalm.</translation>
+<translation id="6421038304268477484">Tõlgitud tekst</translation>
 <translation id="6429213933892582367">Avage jaotis Paroolivalikud.</translation>
 <translation id="6434591244308415567">Ilmnes viga. Proovige hiljem uuesti.</translation>
 <translation id="6435307030888827407">Jää väljalogituks</translation>
@@ -1966,6 +1968,7 @@
 <translation id="9097506547406246598">Ei saa jälgimist lõpetada. Midagi läks valesti.</translation>
 <translation id="9098541895599151034">Kas kustutada <ph name="NUMBER_OF_ACCOUNTS" /> parooli?</translation>
 <translation id="9099233023029360602">Küsi iga kord, millist kontot kasutada</translation>
+<translation id="9099821309562615674">Veenduge, et tõlgitav tekst oleks selge ja asuks kaadris.</translation>
 <translation id="9100610230175265781">Parool on vajalik</translation>
 <translation id="91023216973987714">Makseviisid</translation>
 <translation id="9106655997975673326">Seadmest <ph name="SOURCE_DEVICE" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
index ee9afcca..1b519c7 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -525,6 +525,7 @@
 <translation id="3167868116600277716">فید «یافته‌ها»</translation>
 <translation id="3169472444629675720">کشف کردن</translation>
 <translation id="3174662312949010067">همچنین می‌توانید از گذرواژه‌های ذخیره‌شده در دیگر دستگاه‌هایتان استفاده کنید.</translation>
+<translation id="3177338796769255211">به سیستم وارد شوید تا نشانک‌ها و موارد دیگر را در همه دستگاه‌هایتان دریافت کنید</translation>
 <translation id="3181954750937456830">مرور ایمن (از شما و دستگاهتان درمقابل سایت‌های خطرناک محافظت می‌کند)</translation>
 <translation id="3190736958609431397">لغو پیگیری</translation>
 <translation id="3208260410153224535">سازمانتان ورود به سیستم را خاموش کرده است. نشانک‌ها، گذرواژه‌ها، و سایر اطلاعات جدید فقط در این دستگاه ذخیره خواهد شد.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
index 507dda21..f4fd873 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">Actualiser</translation>
 <translation id="2015722694326466240">Pour afficher vos mots de passe, vous devez d'abord définir un mot de passe sur votre appareil.</translation>
 <translation id="201759455285471444">Développer le groupe d'onglets.</translation>
+<translation id="202070562065520783">Explique-moi ceci</translation>
 <translation id="2021670401941426298">Consultez les instructions de votre moteur de recherche pour supprimer votre historique de recherche, le cas échéant.</translation>
 <translation id="2044394949148788042">Ouvrir la grille d'onglets</translation>
 <translation id="20485545164632846">nouvel élément</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
index d6423dd..8294c0a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -1509,7 +1509,7 @@
 <translation id="7366909168761621528">Données de navigation</translation>
 <translation id="7367530036083223701">Accédez à vos mots de passe de manière sécurisée depuis l'écran d'accueil avec le widget Gestionnaire de mots de passe.</translation>
 <translation id="7369285139974632858">Ajouter aux favoris</translation>
-<translation id="7380220816562673297">Pour le moment, vous ne pouvez partager des mots de passe qu'avec des membres de votre famille. <ph name="BEGIN_LINK" />Créez un groupe familial<ph name="END_LINK" /> avec jusqu'à six membres, et profitez pleinement de vos produits et abonnements sur Google.</translation>
+<translation id="7380220816562673297">Pour le moment, vous ne pouvez partager des mots de passe qu'avec des membres de votre famille. <ph name="BEGIN_LINK" />Créez un groupe familial<ph name="END_LINK" /> réunissant jusqu'à six personnes, et profitez pleinement de vos produits et abonnements sur Google.</translation>
 <translation id="739101637685146669">Quelle URL souhaitez-vous ajouter à vos favoris ?</translation>
 <translation id="7393747756726387725">Zoom avant</translation>
 <translation id="7397805793441258955">{COUNT,plural, =1{1 site}one{# site}other{# sites}}</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
index 917ca409..0f20c59 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">ફરીથી લોડ કરો</translation>
 <translation id="2015722694326466240">પાસવર્ડ જોવા માટે, તમારે સૌથી પહેલા તમારા ઉપકરણ પર એક પાસકોડ સેટ કરવો આવશ્યક છે.</translation>
 <translation id="201759455285471444">ટૅબનું ગ્રૂપ મોટું કરો.</translation>
+<translation id="202070562065520783">મને આ સમજાવો</translation>
 <translation id="2021670401941426298">જો લાગુ થતી હોય, તો તમારા શોધ ઇતિહાસને ડિલીટ કરવા માટે, તમારા શોધ એન્જિનની સૂચનાઓ જુઓ.</translation>
 <translation id="2044394949148788042">ટૅબ ગ્રિડ ખોલો</translation>
 <translation id="20485545164632846">નવી આઇટમ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
index 7509f406..274ce41 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">फिर से लोड करें</translation>
 <translation id="2015722694326466240">पासवर्ड देखने के लिए, आपको सबसे पहले अपने डिवाइस पर एक पासवर्ड सेट करना होगा.</translation>
 <translation id="201759455285471444">टैब ग्रुप को बड़ा करें.</translation>
+<translation id="202070562065520783">मुझे इसके बारे में पूरी जानकारी दो</translation>
 <translation id="2021670401941426298">अपना खोज इतिहास मिटाने के लिए, सर्च इंजन के निर्देश देखें.</translation>
 <translation id="2044394949148788042">टैब ग्रिड खोलें</translation>
 <translation id="20485545164632846">नया आइटम</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
index 7908db9..f31d5e8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -1127,6 +1127,7 @@
 <translation id="573974402615125334">Da biste dijelili, pridruživali se i surađivali u grupama kartica, sinkronizirajte povijest i kartice</translation>
 <translation id="5740123193752401435">Pretražite kartice…</translation>
 <translation id="5744274077973758795">Uključene su obavijesti značajke <ph name="FEATURE_NAME" /></translation>
+<translation id="5745598824054949526">Tekst nije pronađen</translation>
 <translation id="574762237186762643">Događaji</translation>
 <translation id="5749158352074143502">Nastavi s ovom karticom</translation>
 <translation id="5753021559215751319">Spremi zaporku</translation>
@@ -1290,6 +1291,7 @@
 <translation id="6410883413783534063">Otvorite kartice da biste istovremeno posjetili različite stranice</translation>
 <translation id="6416807286621280684">Vaši praćeni paketi i novosti o isporuci.</translation>
 <translation id="6418346271604475326">Priprema PDF-a</translation>
+<translation id="6421038304268477484">Prevedeni tekst</translation>
 <translation id="6429213933892582367">Otvorite Opcije zaporke</translation>
 <translation id="6434591244308415567">Došlo je do pogreške. Pokušajte ponovo kasnije.</translation>
 <translation id="6435307030888827407">Ostanite odjavljeni</translation>
@@ -1968,6 +1970,7 @@
 <translation id="9097506547406246598">Prestanak praćenja nije uspio. Nešto nije u redu.</translation>
 <translation id="9098541895599151034">Želite li izbrisati zaporke (<ph name="NUMBER_OF_ACCOUNTS" />)?</translation>
 <translation id="9099233023029360602">Svaki put pitaj koji račun upotrijebiti</translation>
+<translation id="9099821309562615674">Tekst koji želite prevesti treba biti čitljiv i nalaziti se u kadru.</translation>
 <translation id="9100610230175265781">Potrebna je zaporka</translation>
 <translation id="91023216973987714">Načini plaćanja</translation>
 <translation id="9106655997975673326">S uređaja <ph name="SOURCE_DEVICE" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb
index 2357fb3..bc45275 100644
--- a/ios/chrome/app/strings/resources/ios_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">Muat ulang</translation>
 <translation id="2015722694326466240">Untuk melihat sandi, Anda harus menyetel kode sandi di perangkat terlebih dahulu.</translation>
 <translation id="201759455285471444">Luaskan grup tab.</translation>
+<translation id="202070562065520783">Jelaskan ini kepada saya</translation>
 <translation id="2021670401941426298">Lihat petunjuk mesin telusur untuk menghapus histori penelusuran Anda, jika memungkinkan.</translation>
 <translation id="2044394949148788042">Buka petak tab</translation>
 <translation id="20485545164632846">item baru</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb
index 0e09313..a1b5a4c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_is.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -525,6 +525,7 @@
 <translation id="3167868116600277716">Tillögustraumur</translation>
 <translation id="3169472444629675720">Discover</translation>
 <translation id="3174662312949010067">Þú getur einnig notað vistuð aðgangsorð í öðrum tækjum.</translation>
+<translation id="3177338796769255211">Skráðu þig inn til að fá bókamerkin þín og fleira í öllum tækjunum þínum</translation>
 <translation id="3181954750937456830">Örugg vefnotkun (verndar þig og tækið þitt fyrir hættulegum vefsvæðum)</translation>
 <translation id="3190736958609431397">Hætta að vakta</translation>
 <translation id="3208260410153224535">Fyrirtækið þitt slökkti á innskráningu. Ný bókamerki, aðgangsorð og fleira verður aðeins vistað í þessu tæki.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
index 19fdaa9..a64c022 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">再読み込み</translation>
 <translation id="2015722694326466240">パスワードを表示するには、まずデバイスにパスコードを設定する必要があります。</translation>
 <translation id="201759455285471444">タブグループを開く。</translation>
+<translation id="202070562065520783">この内容を説明</translation>
 <translation id="2021670401941426298">検索履歴を削除する場合は、お使いの検索エンジンの手順をご確認ください(該当する場合)。</translation>
 <translation id="2044394949148788042">タブグリッドを開く</translation>
 <translation id="20485545164632846">新しいアイテム</translation>
@@ -525,6 +526,7 @@
 <translation id="3167868116600277716">Discover フィード</translation>
 <translation id="3169472444629675720">Discover</translation>
 <translation id="3174662312949010067">保存したパスワードを他のデバイスで使用することもできます。</translation>
+<translation id="3177338796769255211">ログインすると、すべてのデバイスで同じブックマークやその他の設定を使用できるようになります</translation>
 <translation id="3181954750937456830">セーフ ブラウジング(危険なサイトからユーザーとデバイスを保護します)</translation>
 <translation id="3190736958609431397">トラッキングを停止</translation>
 <translation id="3208260410153224535">ログインは組織によってオフにされています。新しいブックマークやパスワードなどは、このデバイスにのみ保存されます。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
index b85ab959..c41790c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -526,6 +526,7 @@
 <translation id="3167868116600277716">არხის დათვალიერება</translation>
 <translation id="3169472444629675720">Discover</translation>
 <translation id="3174662312949010067">თქვენი შენახული პაროლების გამოყენება თქვენს სხვა მოწყობილობებზეც შეგიძლიათ.</translation>
+<translation id="3177338796769255211">შედით სისტემაში, რომ მიიღოთ თქვენი სანიშნეები და სხვა მონაცემები თქვენს ყველა მოწყობილობაზე</translation>
 <translation id="3181954750937456830">Safe Browsing (თქვენ და თქვენს მოწყობილობებს გიცავთ სახიფათო საიტებისგან)</translation>
 <translation id="3190736958609431397">თვალის მიდევნების გაუქმება</translation>
 <translation id="3208260410153224535">თქვენმა ორგანიზაციამ გამორთო სისტემაში შესვლა. ახალი სანიშნეები, პაროლები და სხვა კონტენტი შეინახება მხოლოდ ამ მოწყობილობაზე.</translation>
@@ -1126,6 +1127,7 @@
 <translation id="573974402615125334">ჩანართების ჯგუფების გაზიარების, მათში შეერთებისა და თანამშრომლობისთვის საჭიროა თქვენი ისტორიისა და ჩანართების დასინქრონება</translation>
 <translation id="5740123193752401435">მოიძიეთ ჩანართებში…</translation>
 <translation id="5744274077973758795"><ph name="FEATURE_NAME" />-ის შეტყობინებები ჩართულია</translation>
+<translation id="5745598824054949526">ტექსტი ვერ მოიძებნა</translation>
 <translation id="574762237186762643">მოვლენები</translation>
 <translation id="5749158352074143502">ამ ჩანართით გაგრძელება</translation>
 <translation id="5753021559215751319">პაროლის შენახვა</translation>
@@ -1289,6 +1291,7 @@
 <translation id="6410883413783534063">გახსენით ვებგვერდები ჩანართებში, რათა სხვადასხვა ვებგვერდს ერთდროულად ეწვიოთ</translation>
 <translation id="6416807286621280684">თქვენ მიერ თვალმიდევნებული პაკეტები და მიწოდების შესახებ განახლებები.</translation>
 <translation id="6418346271604475326">PDF მზადდება</translation>
+<translation id="6421038304268477484">თარგმნილი ტექსტი</translation>
 <translation id="6429213933892582367">გახსენით „პაროლების ვარიანტები“</translation>
 <translation id="6434591244308415567">წარმოიქმნა შეცდომა. ცადეთ მოგვიანებით.</translation>
 <translation id="6435307030888827407">გამოსულ მდგომარეობაში დარჩენა</translation>
@@ -1967,6 +1970,7 @@
 <translation id="9097506547406246598">თვალის მიდევნების გაუქმება ვერ მოხერხდა. რაღაც შეცდომა მოხდა.</translation>
 <translation id="9098541895599151034">გსურთ <ph name="NUMBER_OF_ACCOUNTS" /> პაროლის წაშლა?</translation>
 <translation id="9099233023029360602">ყოველთვის მკითხეთ, რომელი ანგარიშის გამოყენება მსურს</translation>
+<translation id="9099821309562615674">დარწმუნდით, რომ ტექსტი, რომელსაც თარგმნით, გასაგებია და მოქცეულია ჩარჩოში.</translation>
 <translation id="9100610230175265781">აუცილებელია კოდური ფრაზის მითითება</translation>
 <translation id="91023216973987714">გადახდის მეთოდები</translation>
 <translation id="9106655997975673326">„<ph name="SOURCE_DEVICE" />“-დან</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
index 21de405..4cb1fb8b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -1068,7 +1068,7 @@
 <translation id="555749644339804659">Құпия сөздер тексерілуде…</translation>
 <translation id="5559567453458728487">Веб-беттердегі өлшем бірліктерді түрлендіру</translation>
 <translation id="556042886152191864">Түйме</translation>
-<translation id="5567439033041178034">ТОЛЫҒЫРАҚ</translation>
+<translation id="5567439033041178034">Толық ақпарат</translation>
 <translation id="5572648434713976849">Мекенжай жолағында жақсартылған ұсыныстар аласыз.</translation>
 <translation id="5576885723883013398">Жаңа терезе</translation>
 <translation id="5578543325423650885"><ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) "<ph name="GROUP_NAME" />" қойындылар тобын пайдалану рұқсатынан бірден айырылып қалады.</translation>
@@ -1220,7 +1220,7 @@
 <translation id="6152406514676263192">Қызығушылықтарыңызға негізделген барынша сәйкес контентті көру үшін синхрондау функциясын қосыңыз.</translation>
 <translation id="6159839020698489198">міндетті емес</translation>
 <translation id="6160780110287872296">Файлды жүктеп алу керек пе?</translation>
-<translation id="6165508094623778733">Толығырақ</translation>
+<translation id="6165508094623778733">Толық ақпарат</translation>
 <translation id="6168647875670665004">Мақала ұсыныстары</translation>
 <translation id="6169031022444660352">Сақталған барлық тіркелу дерегін жою үшін алдымен құрылғыда рұқсат кодын орнату керек.</translation>
 <translation id="6173499589275053515">Google аккаунтыңызда (<ph name="EMAIL" />) сақталған құпия сөз.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
index 45139efe..95a60ff 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -1125,6 +1125,7 @@
 <translation id="573974402615125334">ಟ್ಯಾಬ್ ಗುಂಪುಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಲು, ಸೇರಿಕೊಳ್ಳಲು ಮತ್ತು ಅವುಗಳಲ್ಲಿ ಕೊಲಾಬೊರೇಟ್ ಮಾಡಲು, ನಿಮ್ಮ ಇತಿಹಾಸ ಮತ್ತು ಟ್ಯಾಬ್‌ಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಿ</translation>
 <translation id="5740123193752401435">ಟ್ಯಾಬ್‌ಗಳನ್ನು ಹುಡುಕಿ…</translation>
 <translation id="5744274077973758795"><ph name="FEATURE_NAME" /> ನೋಟಿಫಿಕೇಶನ್‌ಗಳನ್ನು ಆನ್ ಮಾಡಲಾಗಿದೆ</translation>
+<translation id="5745598824054949526">ಯಾವುದೇ ಪಠ್ಯ ಕಂಡುಬಂದಿಲ್ಲ</translation>
 <translation id="574762237186762643">ಈವೆಂಟ್‌ಗಳು</translation>
 <translation id="5749158352074143502">ಈ ಟ್ಯಾಬ್‌ನೊಂದಿಗೆ ಮುಂದುವರಿಯಿರಿ</translation>
 <translation id="5753021559215751319">ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಸೇವ್‌ ಮಾಡಿ</translation>
@@ -1288,6 +1289,7 @@
 <translation id="6410883413783534063">ಒಂದೇ ಸಮಯದಲ್ಲಿ ಬೇರೆಬೇರೆ ಪುಟಗಳಿಗೆ ಭೇಟಿ ನೀಡಲು ಟ್ಯಾಬ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="6416807286621280684">ನಿಮ್ಮ ಟ್ರ್ಯಾಕ್ ಮಾಡಿದ ಪ್ಯಾಕೇಜ್‌ಗಳು ಮತ್ತು ಡೆಲಿವರಿ ಅಪ್‌ಡೇಟ್‌ಗಳು.</translation>
 <translation id="6418346271604475326">PDF ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ</translation>
+<translation id="6421038304268477484">ಅನುವಾದಿಸಿದ ಪಠ್ಯ</translation>
 <translation id="6429213933892582367">ಪಾಸ್‌ವರ್ಡ್ ಆಯ್ಕೆಗಳು ಎಂಬುದನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="6434591244308415567">ಒಂದು ದೋಷ ಸಂಭವಿಸಿದೆ. ಆನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="6435307030888827407">ಸೈನ್ ಔಟ್ ಆಗಿಯೇ ಇರಿ</translation>
@@ -1966,6 +1968,7 @@
 <translation id="9097506547406246598">ಅನ್‌ಫಾಲೋ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ಏನೋ ತಪ್ಪಾಗಿದೆ.</translation>
 <translation id="9098541895599151034"><ph name="NUMBER_OF_ACCOUNTS" /> ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಅಳಿಸಬೇಕೆ?</translation>
 <translation id="9099233023029360602">ಪ್ರತಿ ಬಾರಿ ಯಾವ ಖಾತೆಯನ್ನು ಬಳಸಬೇಕೆಂದು ಕೇಳಿ</translation>
+<translation id="9099821309562615674">ನೀವು ಅನುವಾದಿಸುತ್ತಿರುವ ಪಠ್ಯ ಸ್ಪಷ್ಟವಾಗಿದೆ ಮತ್ತು ಫ್ರೇಮ್‌ನಲ್ಲಿದೆ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.</translation>
 <translation id="9100610230175265781">ಪಾಸ್‌ಫ್ರೇಸ್ ಅಗತ್ಯವಿದೆ</translation>
 <translation id="91023216973987714">ಪಾವತಿ ವಿಧಾನಗಳು</translation>
 <translation id="9106655997975673326">"<ph name="SOURCE_DEVICE" />" ಅವರ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
index 5bf7a1a..c3961d22 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">새로고침</translation>
 <translation id="2015722694326466240">비밀번호를 보려면 먼저 기기에 비밀번호를 설정해야 합니다.</translation>
 <translation id="201759455285471444">탭 그룹을 펼칩니다.</translation>
+<translation id="202070562065520783">설명해 줘</translation>
 <translation id="2021670401941426298">Google이 아닌 다른 검색엔진을 사용 중이라면 해당 검색엔진의 검색 기록 삭제 안내를 확인하세요.</translation>
 <translation id="2044394949148788042">탭 그리드 열기</translation>
 <translation id="20485545164632846">새 항목</translation>
@@ -525,6 +526,7 @@
 <translation id="3167868116600277716">디스커버 피드</translation>
 <translation id="3169472444629675720">디스커버</translation>
 <translation id="3174662312949010067">다른 기기에서도 저장된 비밀번호를 사용할 수 있습니다</translation>
+<translation id="3177338796769255211">모든 기기에서 내 북마크 등을 사용하려면 로그인하세요</translation>
 <translation id="3181954750937456830">세이프 브라우징(사용자와 사용자의 기기를 위험한 사이트로부터 보호)</translation>
 <translation id="3190736958609431397">추적 취소</translation>
 <translation id="3208260410153224535">조직에서 로그인을 사용 중지했습니다. 새 북마크, 비밀번호 등이 이 기기에만 저장됩니다.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
index 61ab773..b3e9d6ac 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">Кайрадан жүктөө</translation>
 <translation id="2015722694326466240">Сырсөздөрдү көрүү үчүн адегенде, түзмөгүңүздөгү өткөрүүчү кодду жөндөп алышыңыз керек.</translation>
 <translation id="201759455285471444">Өтмөктөр тобун жайып көрсөтүү.</translation>
+<translation id="202070562065520783">Муну түшүндүрүп бер</translation>
 <translation id="2021670401941426298">Издөө таржымалын өчүрүү үчүн, бар болсо, издөө каражатындагы нускамаларды караңыз.</translation>
 <translation id="2044394949148788042">Өтмөк торчосун ачуу</translation>
 <translation id="20485545164632846">жаңы нерсе</translation>
@@ -525,6 +526,7 @@
 <translation id="3167868116600277716">Сунуштар түрмөгү</translation>
 <translation id="3169472444629675720">Аныктоо</translation>
 <translation id="3174662312949010067">Сакталган сырсөздөрдү башка түзмөктөрүңүздө да колдонсоңуз болот.</translation>
+<translation id="3177338796769255211">Бардык түзмөктөрүңүздө кыстармаларды жана башка нерселерди алуу үчүн аккаунтуңузга кириңиз</translation>
 <translation id="3181954750937456830">Коопсуз серептөө (сизди жана түзмөгүңүздү кооптуу сайттардан коргойт)</translation>
 <translation id="3190736958609431397">Көз салууну токтотуу</translation>
 <translation id="3208260410153224535">Уюмуңуз кирүү аракетин өчүрүп койду. Жаңы кыстармалар, сырсөздөр жана башкалар ушул түзмөккө гана сакталат.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
index 63f02f8..9885f7c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -525,6 +525,7 @@
 <translation id="3167868116600277716">ຟີດ Discover</translation>
 <translation id="3169472444629675720">ຄົ້ນຫາ</translation>
 <translation id="3174662312949010067">ທ່ານສາມາດໃຊ້ລະຫັດຜ່ານທີ່ບັນທຶກໄວ້ຢູ່ອຸປະກອນອື່ນຂອງທ່ານໄດ້ນຳ.</translation>
+<translation id="3177338796769255211">ເຂົ້າສູ່ລະບົບເພື່ອຮັບບຸກມາກ ແລະ ຂໍ້ມູນອື່ນໆຂອງທ່ານໃນອຸປະກອນທຸກເຄື່ອງຂອງທ່ານ</translation>
 <translation id="3181954750937456830">Safe Browsing (ປົກປ້ອງທ່ານ ແລະ ອຸປະກອນຂອງທ່ານຈາກເວັບໄຊອັນຕະລາຍ)</translation>
 <translation id="3190736958609431397">ເຊົາຕິດຕາມ</translation>
 <translation id="3208260410153224535">ອົງກອນຂອງທ່ານປິດການເຂົ້າສູ່ລະບົບໄວ້. ບຸກມາກ, ລະຫັດຜ່ານ ແລະ ຂໍ້ມູນອື່ນໆຈະຖືກບັນທຶກໄປໃສ່ອຸປະກອນນີ້ເທົ່ານັ້ນ.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
index 81c3652..fd20fb5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">Įkelti iš naujo</translation>
 <translation id="2015722694326466240">Jei norite matyti slaptažodžius, pirmiausia turite nustatyti įrenginio slaptažodį.</translation>
 <translation id="201759455285471444">Išskleisti skirtukų grupę.</translation>
+<translation id="202070562065520783">Paaiškink tai man</translation>
 <translation id="2021670401941426298">Peržiūrėkite paieškos variklio instrukcijas, kaip ištrinti paieškos istoriją (jei taikoma).</translation>
 <translation id="2044394949148788042">Atidarykite skirtuko tinklelį</translation>
 <translation id="20485545164632846">naujas elementas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
index 9b23ddd..b62334f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -525,6 +525,7 @@
 <translation id="3167868116600277716">Discover plūsma</translation>
 <translation id="3169472444629675720">Discover</translation>
 <translation id="3174662312949010067">Varat arī izmantot saglabātās paroles citās savās ierīcēs.</translation>
+<translation id="3177338796769255211">Pierakstieties, lai piekļūtu grāmatzīmēm un citiem datiem visās savās ierīcēs.</translation>
 <translation id="3181954750937456830">Droša pārlūkošana (aizsargā jūs un ierīci pret bīstamām vietnēm)</translation>
 <translation id="3190736958609431397">Atcelt izsekošanu</translation>
 <translation id="3208260410153224535">Jūsu organizācija izslēdza pierakstīšanos. Jaunas grāmatzīmes, paroles un citi dati tiks saglabāti tikai šajā ierīcē.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb
index 35e6b3d..6a08bd4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_my.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -1125,6 +1125,7 @@
 <translation id="573974402615125334">တဘ်အုပ်စုများ မျှဝေရန်၊ ပါဝင်ရန်နှင့် ပူးတွဲလုပ်ကိုင်ရန် သင်၏ မှတ်တမ်းနှင့် တဘ်များကို စင့်ခ်လုပ်ပါ</translation>
 <translation id="5740123193752401435">တဘ်များရှာရန်…</translation>
 <translation id="5744274077973758795"><ph name="FEATURE_NAME" /> အကြောင်းကြားချက်များ ဖွင့်ထားသည်</translation>
+<translation id="5745598824054949526">စာသား ရှာမတွေ့ပါ</translation>
 <translation id="574762237186762643">အစီအစဉ်များ</translation>
 <translation id="5749158352074143502">ဤတဘ်ဖြင့် ရှေ့ဆက်ရန်</translation>
 <translation id="5753021559215751319">စကားဝှက် သိမ်းရန်</translation>
@@ -1288,6 +1289,7 @@
 <translation id="6410883413783534063">စာမျက်နှာအမျိုးမျိုး တစ်ပြိုင်နက်ဝင်ကြည့်ရန် တဘ်များကိုဖွင့်ပါ</translation>
 <translation id="6416807286621280684">သင်ခြေရာခံထားသော ပက်ကေ့ဂျ်နှင့် ပေးပို့မှု အပ်ဒိတ်များ။</translation>
 <translation id="6418346271604475326">PDF ပြင်ဆင်နေသည်</translation>
+<translation id="6421038304268477484">ဘာသာပြန်ထားသော စာသား</translation>
 <translation id="6429213933892582367">စကားဝှက် ရွေးစရာများကို ဖွင့်ပါ</translation>
 <translation id="6434591244308415567">အမှားအယွင်း ရှိနေသည်။ နောက်မှ ထပ်လုပ်ကြည့်ပါ။</translation>
 <translation id="6435307030888827407">ထွက်ထားရန်</translation>
@@ -1966,6 +1968,7 @@
 <translation id="9097506547406246598">လိုက်မကြည့်တော့၍ မရပါ။ တစ်ခုခုမှားသွားသည်။</translation>
 <translation id="9098541895599151034">စကားဝှက် <ph name="NUMBER_OF_ACCOUNTS" /> ခုကို ဖျက်မလား။</translation>
 <translation id="9099233023029360602">သုံးလိုသောအကောင့်ကို အကြိမ်တိုင်းမေးရန်</translation>
+<translation id="9099821309562615674">သင်ဘာသာပြန်နေသော စာသားသည် ရှင်းလင်းပြီး ဘောင်အတွင်းရှိကြောင်း သေချာပါစေ။</translation>
 <translation id="9100610230175265781">စကားဝှက် လိုအပ်</translation>
 <translation id="91023216973987714">ငွေပေးချေနည်းလမ်းများ</translation>
 <translation id="9106655997975673326">“<ph name="SOURCE_DEVICE" />” မှ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
index 42f6480..c1e23ea 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -525,6 +525,7 @@
 <translation id="3167868116600277716">Discover को फिड</translation>
 <translation id="3169472444629675720">पत्ता लगाउनुहोस्</translation>
 <translation id="3174662312949010067">तपाईं सेभ गरिएका पासवर्डहरू अन्य डिभाइसहरूमा पनि प्रयोग गर्न सक्नुहुन्छ।</translation>
+<translation id="3177338796769255211">आफ्ना सबै डिभाइसमा आफ्ना बुकमार्कलगायतका कुरा प्राप्त गर्न साइन इन गर्नुहोस्</translation>
 <translation id="3181954750937456830">सुरक्षित ब्राउजिङ (तपाईं र तपाईंको यन्त्रलाई खतरनाक साइटहरूबाट सुरक्षित राख्छ)</translation>
 <translation id="3190736958609431397">ट्र्याक गर्न छाड्नुहोस्</translation>
 <translation id="3208260410153224535">तपाईंको सङ्गठनले साइन इन गर्ने सुविधा अफ गरेको छ। नयाँ बुकमार्क, पासवर्ड र अन्य कुराहरू यो डिभाइसमा मात्र सेभ गरिने छन्।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
index e4c8b41..611fc8e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -525,6 +525,7 @@
 <translation id="3167868116600277716">Discover-feed</translation>
 <translation id="3169472444629675720">Discover</translation>
 <translation id="3174662312949010067">Je kunt je opgeslagen wachtwoorden ook op je andere apparaten gebruiken.</translation>
+<translation id="3177338796769255211">Log in om onder andere je bookmarks op al je apparaten te gebruiken</translation>
 <translation id="3181954750937456830">Safe Browsing (hiermee worden jij en je apparaat beschermd tegen gevaarlijke sites)</translation>
 <translation id="3190736958609431397">Niet meer volgen</translation>
 <translation id="3208260410153224535">Je organisatie heeft inloggen uitgezet. Items zoals nieuwe bookmarks en wachtwoorden worden alleen opgeslagen op dit apparaat.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb
index e01fbc5..5d03424 100644
--- a/ios/chrome/app/strings/resources/ios_strings_or.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">ପୁଣି ଲୋଡ କରନ୍ତୁ</translation>
 <translation id="2015722694326466240">ପାସ୍‍ୱାର୍ଡଗୁଡ଼ିକୁ ଦେଖିବା ପାଇଁ ଆପଣଙ୍କୁ ପ୍ରଥମରୁ ଆପଣଙ୍କ ଡିଭାଇସ୍‌ରେ ନିଶ୍ଚିତ ରୂପେ ଗୋଟିଏ ପାସକୋଡ୍ ସେଟ୍ କରିବାକୁ ହେବ।</translation>
 <translation id="201759455285471444">ଟାବ ଗ୍ରୁପକୁ ବିସ୍ତାର କରନ୍ତୁ।</translation>
+<translation id="202070562065520783">ମୋତେ ଏହାକୁ ବ୍ୟାଖ୍ୟା କରନ୍ତୁ</translation>
 <translation id="2021670401941426298">ଯଦି ଲାଗୁ ହୁଏ, ତେବେ ଆପଣଙ୍କ ସନ୍ଧାନ ଇତିହାସକୁ ଡିଲିଟ୍ କରିବା ପାଇଁ ଆପଣଙ୍କ ସନ୍ଧାନ ଇଞ୍ଜିନର ନିର୍ଦ୍ଦେଶଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ।</translation>
 <translation id="2044394949148788042">ଟାବ ଗ୍ରିଡ ଖୋଲନ୍ତୁ</translation>
 <translation id="20485545164632846">ନୂଆ ଆଇଟମ</translation>
@@ -525,6 +526,7 @@
 <translation id="3167868116600277716">Discover ଫିଡ</translation>
 <translation id="3169472444629675720">ଖୋଜି ପାଆନ୍ତୁ</translation>
 <translation id="3174662312949010067">ଆପଣ ଆପଣଙ୍କ ଅନ୍ୟ ଡିଭାଇସଗୁଡ଼ିକରେ ସେଭ କରାଯାଇଥିବା ପାସୱାର୍ଡଗୁଡ଼ିକୁ ମଧ୍ୟ ବ୍ୟବହାର କରିପାରିବେ।</translation>
+<translation id="3177338796769255211">ଆପଣଙ୍କର ସମସ୍ତ ଡିଭାଇସରେ ଆପଣଙ୍କ ବୁକମାର୍କ ଏବଂ ଆହୁରି ଅନେକ କିଛି ପାଇବାକୁ ସାଇନ ଇନ କରନ୍ତୁ</translation>
 <translation id="3181954750937456830">ସେଫ୍ ବ୍ରାଉଜିଂ (ଆପଣଙ୍କୁ ଏବଂ ଆପଣଙ୍କର ଡିଭାଇସ୍‍କୁ ବିପଜ୍ଜନକ ସାଇଟ୍‍ଗୁଡ଼ିକରୁ ରକ୍ଷା କରେ)</translation>
 <translation id="3190736958609431397">ଅନଟ୍ରାକ କରନ୍ତୁ</translation>
 <translation id="3208260410153224535">ଆପଣଙ୍କ ସଂସ୍ଥା ସାଇନ-ଇନ କରିବାକୁ ବନ୍ଦ କରିଦେଇଛି। ନୂଆ ବୁକମାର୍କ, ପାସୱାର୍ଡ ଏବଂ ଆହୁରି ଅନେକ କିଛିକୁ କେବଳ ଏହି ଡିଭାଇସରେ ସେଭ କରାଯିବ।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
index 63f2f39..f8f1c3d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -1125,6 +1125,7 @@
 <translation id="573974402615125334">ਟੈਬ ਗਰੁੱਪਾਂ ਵਿੱਚ ਸਾਂਝਾ ਕਰਨ, ਸ਼ਾਮਲ ਹੋਣ ਅਤੇ ਸਹਿਯੋਗ ਕਰਨ ਲਈ ਆਪਣੇ ਇਤਿਹਾਸ ਅਤੇ ਟੈਬਾਂ ਨੂੰ ਸਿੰਕ ਕਰੋ</translation>
 <translation id="5740123193752401435">ਟੈਬਾਂ ਖੋਜੋ…</translation>
 <translation id="5744274077973758795"><ph name="FEATURE_NAME" /> ਲਈ ਸੂਚਨਾਵਾਂ ਚਾਲੂ ਕੀਤੀਆਂ ਹੋਈਆਂ ਹਨ</translation>
+<translation id="5745598824054949526">ਕੋਈ ਲਿਖਤ ਨਹੀਂ ਮਿਲੀ</translation>
 <translation id="574762237186762643">ਇਵੈਂਟ</translation>
 <translation id="5749158352074143502">ਇਸ ਟੈਬ 'ਤੇ ਜਾਰੀ ਰੱਖੋ</translation>
 <translation id="5753021559215751319">ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰੋ</translation>
@@ -1288,6 +1289,7 @@
 <translation id="6410883413783534063">ਇੱਕੋ ਵੇਲੇ ਵੱਖ-ਵੱਖ ਪੰਨਿਆਂ 'ਤੇ ਜਾਣ ਲਈ ਟੈਬਾਂ ਖੋਲ੍ਹੋ</translation>
 <translation id="6416807286621280684">ਤੁਹਾਡੇ ਟਰੈਕ ਕੀਤੇ ਪੈਕੇਜ ਅਤੇ ਡਿਲੀਵਰੀ ਅੱਪਡੇਟ।</translation>
 <translation id="6418346271604475326">PDF ਤਿਆਰ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation>
+<translation id="6421038304268477484">ਅਨੁਵਾਦ ਕੀਤੀ ਲਿਖਤ</translation>
 <translation id="6429213933892582367">ਪਾਸਵਰਡ ਵਿਕਲਪ ਖੋਲ੍ਹੋ</translation>
 <translation id="6434591244308415567">ਇੱਕ ਗੜਬੜ ਹੋ ਗਈ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation>
 <translation id="6435307030888827407">ਸਾਈਨ-ਆਊਟ ਰਹੋ</translation>
@@ -1966,6 +1968,7 @@
 <translation id="9097506547406246598">ਅਨੁਸਰਣ ਕਰਨਾ ਬੰਦ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ।</translation>
 <translation id="9098541895599151034">ਕੀ <ph name="NUMBER_OF_ACCOUNTS" /> ਦੇ ਪਾਸਵਰਡਾਂ ਨੂੰ ਮਿਟਾਉਣਾ ਹੈ?</translation>
 <translation id="9099233023029360602">ਪੁੱਛੋ ਕਿ ਹਰ ਵਾਰ ਕਿਹੜਾ ਖਾਤਾ ਵਰਤਣਾ ਹੈ</translation>
+<translation id="9099821309562615674">ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਹਾਡੇ ਵੱਲੋਂ ਅਨੁਵਾਦ ਕੀਤੀ ਜਾ ਰਹੀ ਲਿਖਤ ਸਪਸ਼ਟ ਅਤੇ ਫ੍ਰੇਮ ਅੰਦਰ ਹੈ।</translation>
 <translation id="9100610230175265781">ਪਾਸਫਰੇਜ਼ ਲੋੜੀਂਦਾ</translation>
 <translation id="91023216973987714">ਭੁਗਤਾਨ ਵਿਧੀਆਂ</translation>
 <translation id="9106655997975673326">"<ph name="SOURCE_DEVICE" />" ਤੋਂ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
index 865163d..c1bd252 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">Reîncarcă</translation>
 <translation id="2015722694326466240">Pentru a vedea parolele, trebuie mai întâi să setezi o parolă pe dispozitiv.</translation>
 <translation id="201759455285471444">Extinde grupul de file.</translation>
+<translation id="202070562065520783">Explică-mi</translation>
 <translation id="2021670401941426298">Vezi instrucțiunile motorului de căutare pentru ștergerea istoricului căutărilor, dacă este cazul.</translation>
 <translation id="2044394949148788042">Deschide grila cu file</translation>
 <translation id="20485545164632846">articol nou</translation>
@@ -525,6 +526,7 @@
 <translation id="3167868116600277716">Feedul Discover</translation>
 <translation id="3169472444629675720">Discover</translation>
 <translation id="3174662312949010067">Poți folosi parolele salvate și pe alte dispozitive.</translation>
+<translation id="3177338796769255211">Conectează-te pentru a-ți accesa marcajele și altele pe toate dispozitivele</translation>
 <translation id="3181954750937456830">Navigare sigură (protecție împotriva site-urilor periculoase)</translation>
 <translation id="3190736958609431397">Anulează urmărirea</translation>
 <translation id="3208260410153224535">Organizația a dezactivat conectarea. Marcajele, parolele și alte date noi vor fi salvate numai pe acest dispozitiv.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
index 7b3de0a..dfb06f5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">Перезагрузить</translation>
 <translation id="2015722694326466240">Чтобы просматривать пароли, настройте на устройстве код доступа.</translation>
 <translation id="201759455285471444">Развернуть группу вкладок.</translation>
+<translation id="202070562065520783">Объясни мне</translation>
 <translation id="2021670401941426298">Изучите инструкции по удалению истории поиска в справочных материалах используемой поисковой системы.</translation>
 <translation id="2044394949148788042">Откройте сетку таблицы.</translation>
 <translation id="20485545164632846">новый продукт</translation>
@@ -525,6 +526,7 @@
 <translation id="3167868116600277716">Лента рекомендаций</translation>
 <translation id="3169472444629675720">Рекомендации</translation>
 <translation id="3174662312949010067">Вы также можете использовать сохраненные пароли на других своих устройствах.</translation>
+<translation id="3177338796769255211">Войдите, чтобы получить доступ к закладкам и многому другому на всех своих устройствах.</translation>
 <translation id="3181954750937456830">Безопасный просмотр (защищает вас и ваше устройство от опасных сайтов)</translation>
 <translation id="3190736958609431397">Перестать отслеживать</translation>
 <translation id="3208260410153224535">В вашей организации вход в браузере отключен. Новые закладки, пароли и другие данные будут сохраняться только на этом устройстве.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
index 21b1a319..676d98d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">Znova naloži</translation>
 <translation id="2015722694326466240">Če si želite ogledati gesla, morate najprej nastaviti geslo v napravi.</translation>
 <translation id="201759455285471444">Razširitev skupine zavihkov.</translation>
+<translation id="202070562065520783">Pojasni mi to</translation>
 <translation id="2021670401941426298">Oglejte si navodila iskalnika za brisanje zgodovine iskanja, če je na voljo.</translation>
 <translation id="2044394949148788042">Odprite mrežo zavihkov</translation>
 <translation id="20485545164632846">nov element</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
index b4c4466..8ee7eae 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -1127,6 +1127,7 @@
 <translation id="573974402615125334">Da biste delili grupe kartica, pridruživali im se i sarađivali u njima, sinhronizujte istoriju i kartice</translation>
 <translation id="5740123193752401435">Pretražite kartice…</translation>
 <translation id="5744274077973758795">Obaveštenja su uključena za <ph name="FEATURE_NAME" /></translation>
+<translation id="5745598824054949526">Tekst nije pronađen</translation>
 <translation id="574762237186762643">Događaji</translation>
 <translation id="5749158352074143502">Nastavite sa ovom karticom</translation>
 <translation id="5753021559215751319">Sačuvaj lozinku</translation>
@@ -1290,6 +1291,7 @@
 <translation id="6410883413783534063">Otvorite kartice da biste istovremeno posetili različite stranice</translation>
 <translation id="6416807286621280684">Praćeni paketi i novosti o isporuci.</translation>
 <translation id="6418346271604475326">Priprema PDF datoteke</translation>
+<translation id="6421038304268477484">Prevedeni tekst</translation>
 <translation id="6429213933892582367">Otvorite Opcije lozinki</translation>
 <translation id="6434591244308415567">Došlo je do greške. Probajte ponovo kasnije.</translation>
 <translation id="6435307030888827407">Ostanite odjavljeni</translation>
@@ -1968,6 +1970,7 @@
 <translation id="9097506547406246598">Opozivanje praćenja nije uspelo. Došlo je do greške.</translation>
 <translation id="9098541895599151034">Želite li da izbrišete lozinke za <ph name="NUMBER_OF_ACCOUNTS" /> naloga?</translation>
 <translation id="9099233023029360602">Svaki put pitaj koji nalog želim da koristim</translation>
+<translation id="9099821309562615674">Uverite se da je tekst koji prevodite jasan i u kadru.</translation>
 <translation id="9100610230175265781">Potrebna je pristupna fraza</translation>
 <translation id="91023216973987714">Načini plaćanja</translation>
 <translation id="9106655997975673326">Sa telefona <ph name="SOURCE_DEVICE" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
index ec9ce783..604cf53 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -1127,6 +1127,7 @@
 <translation id="573974402615125334">Да бисте делили групе картица, придруживали им се и сарађивали у њима, синхронизујте историју и картице</translation>
 <translation id="5740123193752401435">Претражите картице…</translation>
 <translation id="5744274077973758795">Обавештења су укључена за <ph name="FEATURE_NAME" /></translation>
+<translation id="5745598824054949526">Текст није пронађен</translation>
 <translation id="574762237186762643">Догађаји</translation>
 <translation id="5749158352074143502">Наставите са овом картицом</translation>
 <translation id="5753021559215751319">Сачувај лозинку</translation>
@@ -1290,6 +1291,7 @@
 <translation id="6410883413783534063">Отворите картице да бисте истовремено посетили различите странице</translation>
 <translation id="6416807286621280684">Праћени пакети и новости о испоруци.</translation>
 <translation id="6418346271604475326">Припрема PDF датотеке</translation>
+<translation id="6421038304268477484">Преведени текст</translation>
 <translation id="6429213933892582367">Отворите Опције лозинки</translation>
 <translation id="6434591244308415567">Дошло је до грешке. Пробајте поново касније.</translation>
 <translation id="6435307030888827407">Останите одјављени</translation>
@@ -1968,6 +1970,7 @@
 <translation id="9097506547406246598">Опозивање праћења није успело. Дошло је до грешке.</translation>
 <translation id="9098541895599151034">Желите ли да избришете лозинке за <ph name="NUMBER_OF_ACCOUNTS" /> налога?</translation>
 <translation id="9099233023029360602">Сваки пут питај који налог желим да користим</translation>
+<translation id="9099821309562615674">Уверите се да је текст који преводите јасан и у кадру.</translation>
 <translation id="9100610230175265781">Потребна је приступна фраза</translation>
 <translation id="91023216973987714">Начини плаћања</translation>
 <translation id="9106655997975673326">Са телефона <ph name="SOURCE_DEVICE" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
index 78eda0c..2f74f0d6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">Läs in igen</translation>
 <translation id="2015722694326466240">Du måste ställa in ett lösenord på enheten om du vill kunna se lösenorden.</translation>
 <translation id="201759455285471444">Utöka flikgruppen.</translation>
+<translation id="202070562065520783">Förklara detta för mig</translation>
 <translation id="2021670401941426298">Läs sökmotorns anvisningar för att radera sökhistoriken om tillämpligt.</translation>
 <translation id="2044394949148788042">Öppna rutnätet med flikar</translation>
 <translation id="20485545164632846">nytt objekt</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb
index 53d8618..c0ae5a40 100644
--- a/ios/chrome/app/strings/resources/ios_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -1127,6 +1127,7 @@
 <translation id="573974402615125334">ట్యాబ్ గ్రూప్‌లలో షేర్ చేయడానికి, చేరడానికి, సహకరించడానికి, మీ హిస్టరీని, ట్యాబ్‌లను సింక్ చేయండి</translation>
 <translation id="5740123193752401435">ట్యాబ్‌లలో సెర్చ్ చేయండి…</translation>
 <translation id="5744274077973758795"><ph name="FEATURE_NAME" /> నోటిఫికేషన్‌లు ఆన్ చేయబడ్డాయి</translation>
+<translation id="5745598824054949526">ఎటువంటి టెక్స్ట్ కనుగొనబడలేదు</translation>
 <translation id="574762237186762643">ఈవెంట్‌లు</translation>
 <translation id="5749158352074143502">ఈ ట్యాబ్‌తో కొనసాగించండి</translation>
 <translation id="5753021559215751319">పాస్‌వర్డ్‌ను సేవ్ చేయండి</translation>
@@ -1290,6 +1291,7 @@
 <translation id="6410883413783534063">ఒకే సమయంలో వేర్వేరు పేజీలను సందర్శించడానికి ట్యాబ్‌లను తెరవండి</translation>
 <translation id="6416807286621280684">మీరు ట్రాక్ చేసిన ప్యాకేజీలు, డెలివరీ అప్‌డేట్‌లు.</translation>
 <translation id="6418346271604475326">PDF సిద్ధపరు.</translation>
+<translation id="6421038304268477484">అనువదించిన టెక్స్ట్</translation>
 <translation id="6429213933892582367">పాస్‌వర్డ్ ఆప్షన్‌లను తెరవండి</translation>
 <translation id="6434591244308415567">ఎర్రర్ ఏర్పడింది. తర్వాత మళ్లీ ట్రై చేయండి.</translation>
 <translation id="6435307030888827407">సైన్ అవుట్ అయి ఉండండి</translation>
@@ -1968,6 +1970,7 @@
 <translation id="9097506547406246598">అన్-ఫాలో చేయడం సాధ్యం కాదు. ఏదో తప్పు జరిగింది.</translation>
 <translation id="9098541895599151034"><ph name="NUMBER_OF_ACCOUNTS" /> URLలకు సంబంధించిన పాస్‌వర్డ్‌లను తొలగించాలా?</translation>
 <translation id="9099233023029360602">ప్రతిసారీ ఏ ఖాతాను ఉపయోగించాలో అడగండి</translation>
+<translation id="9099821309562615674">మీరు అనువదిస్తున్న టెక్స్ట్ స్పష్టంగా ఉండేలా, ఫ్రేమ్‌లో ఉండేలా చూసుకోండి.</translation>
 <translation id="9100610230175265781">రహస్య పదబంధం అవసరం</translation>
 <translation id="91023216973987714">పేమెంట్ ఆప్షన్‌లు</translation>
 <translation id="9106655997975673326">"<ph name="SOURCE_DEVICE" />" నుండి</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb
index d25f040f..71b2c3e0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">โหลดซ้ำ</translation>
 <translation id="2015722694326466240">หากต้องการดูรหัสผ่าน คุณต้องตั้งพาสโค้ดในอุปกรณ์ก่อน</translation>
 <translation id="201759455285471444">ขยายกลุ่มแท็บ</translation>
+<translation id="202070562065520783">อธิบายให้ฉันฟังหน่อย</translation>
 <translation id="2021670401941426298">ดูวิธีลบประวัติการค้นหา (หากมี) ของเครื่องมือค้นหาที่คุณใช้</translation>
 <translation id="2044394949148788042">เปิดตารางกริดของแท็บ</translation>
 <translation id="20485545164632846">รายการใหม่</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
index 9abcad35..20bc476 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -1126,6 +1126,7 @@
 <translation id="573974402615125334">Varaqlar guruhini ulashish, ularga qoʻshilish va boshqalar bilan birga ishlash uchun varaqlar va tarixni sinxronlang</translation>
 <translation id="5740123193752401435">Varaqlar ichidan qidirish…</translation>
 <translation id="5744274077973758795"><ph name="FEATURE_NAME" /> bildirishnomalari yoqildi</translation>
+<translation id="5745598824054949526">Hech qanday matn topilmadi</translation>
 <translation id="574762237186762643">Tadbirlar</translation>
 <translation id="5749158352074143502">Shu varaqda davom etish</translation>
 <translation id="5753021559215751319">Parolni saqlash</translation>
@@ -1289,6 +1290,7 @@
 <translation id="6410883413783534063">Bir vaqtda turli sahifalarga tashrif buyurish uchun varaqlar ochish</translation>
 <translation id="6416807286621280684">Kuzatuvdagi paketlar va yetkazib berish xabarlari.</translation>
 <translation id="6418346271604475326">PDF tayyorlanmoqda</translation>
+<translation id="6421038304268477484">Tarjima qilingan matn</translation>
 <translation id="6429213933892582367">Parol sozlamalarini oching</translation>
 <translation id="6434591244308415567">Xatolik yuz berdi. Keyinroq urining.</translation>
 <translation id="6435307030888827407">Hisobga kirilmasin</translation>
@@ -1967,6 +1969,7 @@
 <translation id="9097506547406246598">Obuna bekor qilinmadi. Xatolik yuz berdi.</translation>
 <translation id="9098541895599151034"><ph name="NUMBER_OF_ACCOUNTS" /> ta hisob paroli oʻchirilsinmi?</translation>
 <translation id="9099233023029360602">Har safar qaysi hisobdan foydalanish soʻralsin</translation>
+<translation id="9099821309562615674">Tarjima qilayotgan matningiz aniq va kadr ichida ekanini tekshiring.</translation>
 <translation id="9100610230175265781">Kodli ibora zarur</translation>
 <translation id="91023216973987714">Toʻlov usullari</translation>
 <translation id="9106655997975673326">“<ph name="SOURCE_DEVICE" />” qurilmasidan</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
index 7312d7d..aac29c4d8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">重新加载</translation>
 <translation id="2015722694326466240">要想查看密码,您必须先在设备上设置密码。</translation>
 <translation id="201759455285471444">展开标签页分组。</translation>
+<translation id="202070562065520783">向我解释</translation>
 <translation id="2021670401941426298">查看您所用搜索引擎的说明,了解如何删除您的搜索记录(若适用)。</translation>
 <translation id="2044394949148788042">打开标签页网格</translation>
 <translation id="20485545164632846">新项</translation>
@@ -1125,6 +1126,7 @@
 <translation id="573974402615125334">如需分享、加入标签页分组并在其中协作,请同步历史记录和标签页</translation>
 <translation id="5740123193752401435">搜索标签页…</translation>
 <translation id="5744274077973758795">“<ph name="FEATURE_NAME" />”通知已开启</translation>
+<translation id="5745598824054949526">找不到文字</translation>
 <translation id="574762237186762643">活动</translation>
 <translation id="5749158352074143502">继续使用此标签页</translation>
 <translation id="5753021559215751319">保存密码</translation>
@@ -1288,6 +1290,7 @@
 <translation id="6410883413783534063">打开多个标签页即可同时访问不同网页</translation>
 <translation id="6416807286621280684">您跟踪的包裹和送货动态。</translation>
 <translation id="6418346271604475326">正在准备 PDF 文件</translation>
+<translation id="6421038304268477484">译文</translation>
 <translation id="6429213933892582367">打开“密码选项”</translation>
 <translation id="6434591244308415567">发生错误,请稍后重试。</translation>
 <translation id="6435307030888827407">保持退出账号状态</translation>
@@ -1966,6 +1969,7 @@
 <translation id="9097506547406246598">无法取消关注。出了点问题。</translation>
 <translation id="9098541895599151034">删除 <ph name="NUMBER_OF_ACCOUNTS" /> 个密码?</translation>
 <translation id="9099233023029360602">每次都询问要使用哪个账号</translation>
+<translation id="9099821309562615674">请确保要翻译的文字清晰可辨且位于画面内。</translation>
 <translation id="9100610230175265781">必须提供密码</translation>
 <translation id="91023216973987714">支付方式</translation>
 <translation id="9106655997975673326">来自“<ph name="SOURCE_DEVICE" />”</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
index cc333d7..984cd1d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">重新載入</translation>
 <translation id="2015722694326466240">如要查看密碼,您必須先在裝置上設定密碼。</translation>
 <translation id="201759455285471444">打開分頁群組。</translation>
+<translation id="202070562065520783">為我說明</translation>
 <translation id="2021670401941426298">建議您查看搜尋引擎的搜尋記錄刪除指示 (如有)。</translation>
 <translation id="2044394949148788042">開啟分頁網格</translation>
 <translation id="20485545164632846">新項目</translation>
@@ -525,6 +526,7 @@
 <translation id="3167868116600277716">探索動態消息</translation>
 <translation id="3169472444629675720">探索</translation>
 <translation id="3174662312949010067">您亦可在其他裝置上使用已儲存的密碼。</translation>
+<translation id="3177338796769255211">登入帳戶即可在任何裝置上存取自己的書籤及其他內容</translation>
 <translation id="3181954750937456830">安全瀏覽 (保護您和裝置免受危險網站攻擊)</translation>
 <translation id="3190736958609431397">取消追蹤</translation>
 <translation id="3208260410153224535">你的機構已關閉登入功能。新書籤、密碼等資料只會儲存在此裝置上。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
index 04a4158..ea117f9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -261,6 +261,7 @@
 <translation id="2010008505735295285">重新載入</translation>
 <translation id="2015722694326466240">你必須先在裝置上設定螢幕解鎖密碼才能查看密碼。</translation>
 <translation id="201759455285471444">展開分頁群組。</translation>
+<translation id="202070562065520783">說明一下</translation>
 <translation id="2021670401941426298">如要瞭解如何刪除搜尋記錄,請查看搜尋引擎的操作說明 (如果有的話)。</translation>
 <translation id="2044394949148788042">開啟分頁方格</translation>
 <translation id="20485545164632846">新項目</translation>
@@ -525,6 +526,7 @@
 <translation id="3167868116600277716">「探索」動態消息</translation>
 <translation id="3169472444629675720">探索</translation>
 <translation id="3174662312949010067">你也可以在其他裝置上使用已儲存的密碼。</translation>
+<translation id="3177338796769255211">只要在裝置上登入帳戶,即可存取書籤和其他資訊</translation>
 <translation id="3181954750937456830">安全瀏覽 (保護你和你的裝置不受危險網站攻擊)</translation>
 <translation id="3190736958609431397">取消追蹤</translation>
 <translation id="3208260410153224535">貴機構已關閉登入功能。新的書籤、密碼等資訊只會儲存在這部裝置上。</translation>
diff --git a/ios/chrome/browser/account_picker/ui_bundled/account_picker_confirmation/account_picker_confirmation_screen_mediator.mm b/ios/chrome/browser/account_picker/ui_bundled/account_picker_confirmation/account_picker_confirmation_screen_mediator.mm
index 03bf48a..afdc524 100644
--- a/ios/chrome/browser/account_picker/ui_bundled/account_picker_confirmation/account_picker_confirmation_screen_mediator.mm
+++ b/ios/chrome/browser/account_picker/ui_bundled/account_picker_confirmation/account_picker_confirmation_screen_mediator.mm
@@ -124,10 +124,6 @@
                                                       selectedIdentity]];
 }
 
-- (void)handleIdentityListChanged {
-  [self selectSelectedIdentity];
-}
-
 - (void)handleIdentityUpdated:(id<SystemIdentity>)identity {
   if ([_selectedIdentity isEqual:identity]) {
     [self updateSelectedIdentityUI];
@@ -158,7 +154,7 @@
 #pragma mark -  IdentityManagerObserver
 
 - (void)onAccountsOnDeviceChanged {
-  [self handleIdentityListChanged];
+  [self selectSelectedIdentity];
 }
 
 - (void)onExtendedAccountInfoUpdated:(const AccountInfo&)info {
diff --git a/ios/chrome/browser/account_picker/ui_bundled/account_picker_selection/account_picker_selection_screen_mediator.mm b/ios/chrome/browser/account_picker/ui_bundled/account_picker_selection/account_picker_selection_screen_mediator.mm
index 66b4d9ee..052dbc60 100644
--- a/ios/chrome/browser/account_picker/ui_bundled/account_picker_selection/account_picker_selection_screen_mediator.mm
+++ b/ios/chrome/browser/account_picker/ui_bundled/account_picker_selection/account_picker_selection_screen_mediator.mm
@@ -117,11 +117,6 @@
   configurator.selected = [identity isEqual:self.selectedIdentity];
 }
 
-- (void)handleIdentityListChanged {
-  [self loadIdentityItemConfigurators];
-  [self.consumer reloadAllIdentities];
-}
-
 - (void)handleIdentityUpdated:(id<SystemIdentity>)identity {
   AccountPickerSelectionScreenIdentityItemConfigurator* configurator = nil;
   for (AccountPickerSelectionScreenIdentityItemConfigurator* cursor in self
@@ -138,7 +133,8 @@
 #pragma mark -  IdentityManagerObserver
 
 - (void)onAccountsOnDeviceChanged {
-  [self handleIdentityListChanged];
+  [self loadIdentityItemConfigurators];
+  [self.consumer reloadAllIdentities];
 }
 
 - (void)onExtendedAccountInfoUpdated:(const AccountInfo&)info {
diff --git a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer.mm b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer.mm
index 2b38150..4deccf7 100644
--- a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow_performer.mm
@@ -113,10 +113,9 @@
         ->SetSelectedType(clear_selected_type.value(), false);
   }
 
-  signin::MultiProfileSignOut(
-      browser, signin_metrics::ProfileSignout::kUserTappedUndoRightAfterSignIn,
-      /*force_snackbar_over_toolbar=*/false,
-      /*snackbar_message=*/nil, /*signout_completion=*/nil);
+  signin::ProfileSignoutRequest(
+      signin_metrics::ProfileSignout::kUserTappedUndoRightAfterSignIn)
+      .Run(browser);
 }
 
 }  // namespace
diff --git a/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_signout_continuation.h b/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_signout_continuation.h
index afeafb8..2f21556 100644
--- a/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_signout_continuation.h
+++ b/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_signout_continuation.h
@@ -7,7 +7,7 @@
 
 #import <UIKit/UIKit.h>
 
-#import "base/ios/block_types.h"
+#import "base/functional/callback_forward.h"
 #import "ios/chrome/app/change_profile_continuation.h"
 
 @class MDCSnackbarMessage;
@@ -16,6 +16,9 @@
 enum class ProfileSignout;
 }  // namespace signin_metrics
 
+// Callback invoked when the signout operation is complete.
+using SignoutCompletionCallback = base::OnceCallback<void(SceneState*)>;
+
 // Returns a ChangeProfileContinuation that sign-out the profile, presents
 // a snackbar, and then runs `signout_completion`.
 ChangeProfileContinuation CreateChangeProfileSignoutContinuation(
@@ -23,7 +26,7 @@
     BOOL force_snackbar_over_toolbar,
     BOOL should_record_metrics,
     MDCSnackbarMessage* snackbar_message,
-    ProceduralBlock signout_completion);
+    SignoutCompletionCallback signout_completion);
 
 // Returns a ChangeProfileContinuation that shows a force sign out prompt.
 ChangeProfileContinuation CreateChangeProfileForceSignoutContinuation();
diff --git a/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_signout_continuation.mm b/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_signout_continuation.mm
index 559db717..d8a715e 100644
--- a/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_signout_continuation.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_signout_continuation.mm
@@ -4,6 +4,8 @@
 
 #import "ios/chrome/browser/authentication/ui_bundled/change_profile/change_profile_signout_continuation.h"
 
+#import "base/check.h"
+#import "base/functional/callback.h"
 #import "base/functional/callback_helpers.h"
 #import "base/metrics/user_metrics.h"
 #import "base/metrics/user_metrics_action.h"
@@ -22,28 +24,35 @@
 
 namespace {
 
-// Called by ChangeProfileSignoutContinuation once the sign-out is complete.
-void SignoutDone(base::WeakPtr<Browser> weak_browser,
-                 bool force_snackbar_over_toolbar,
-                 MDCSnackbarMessage* snackbar_message) {
+// Completion for ChangeProfileSignoutContinuation(...) that presents the
+// snackback message (if non-null), invoke the signout completion and then
+// the closure.
+void ChangeProfileSignoutCompletion(
+    base::WeakPtr<Browser> weak_browser,
+    MDCSnackbarMessage* snackbar_message,
+    bool force_snackbar_over_toolbar,
+    SignoutCompletionCallback signout_completion,
+    base::OnceClosure closure) {
   Browser* browser = weak_browser.get();
   if (!browser) {
     return;
   }
 
-  if (!snackbar_message) {
-    return;
+  if (snackbar_message) {
+    id<SnackbarCommands> snackbar_commands_handler =
+        HandlerForProtocol(browser->GetCommandDispatcher(), SnackbarCommands);
+
+    if (force_snackbar_over_toolbar) {
+      [snackbar_commands_handler
+          showSnackbarMessageOverBrowserToolbar:snackbar_message];
+    } else {
+      [snackbar_commands_handler showSnackbarMessage:snackbar_message
+                                        bottomOffset:0];
+    }
   }
 
-  id<SnackbarCommands> snackbar_commands_handler =
-      HandlerForProtocol(browser->GetCommandDispatcher(), SnackbarCommands);
-  if (force_snackbar_over_toolbar) {
-    [snackbar_commands_handler
-        showSnackbarMessageOverBrowserToolbar:snackbar_message];
-  } else {
-    [snackbar_commands_handler showSnackbarMessage:snackbar_message
-                                      bottomOffset:0];
-  }
+  std::move(signout_completion).Run(browser->GetSceneState());
+  std::move(closure).Run();
 }
 
 // Implementation of the continuation that sign-out the profile.
@@ -52,7 +61,7 @@
     BOOL force_snackbar_over_toolbar,
     BOOL should_record_metrics,
     MDCSnackbarMessage* snackbar_message,
-    base::OnceClosure signout_completion,
+    SignoutCompletionCallback signout_completion,
     SceneState* scene_state,
     base::OnceClosure closure) {
   // The regular browser should be used to complete the signout, even if in
@@ -61,13 +70,12 @@
       scene_state.browserProviderInterface.mainBrowserProvider.browser;
   CHECK(browser);
 
-  // Create the closure corresponding to the action to perform once the signout
-  // action completes, chaining `signout_completion` and `closure`.
+  // Create the final completion that will be invoked when the signout
+  // operation completes.
   base::OnceClosure completion =
-      base::BindOnce(&SignoutDone, browser->AsWeakPtr(),
-                     force_snackbar_over_toolbar, snackbar_message)
-          .Then(std::move(signout_completion))
-          .Then(std::move(closure));
+      base::BindOnce(&ChangeProfileSignoutCompletion, browser->AsWeakPtr(),
+                     snackbar_message, force_snackbar_over_toolbar,
+                     std::move(signout_completion), std::move(closure));
 
   AuthenticationService* authentication_service =
       AuthenticationServiceFactory::GetForProfile(browser->GetProfile());
@@ -114,12 +122,12 @@
     BOOL force_snackbar_over_toolbar,
     BOOL should_record_metrics,
     MDCSnackbarMessage* snackbar_message,
-    ProceduralBlock signout_completion) {
+    SignoutCompletionCallback signout_completion) {
+  CHECK(!signout_completion.is_null());
   return base::BindOnce(&ChangeProfileSignoutContinuation,
                         signout_source_metric, force_snackbar_over_toolbar,
                         should_record_metrics, snackbar_message,
-                        signout_completion ? base::BindOnce(signout_completion)
-                                           : base::DoNothing());
+                        std::move(signout_completion));
 }
 
 ChangeProfileContinuation CreateChangeProfileForceSignoutContinuation() {
diff --git a/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/BUILD.gn b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/BUILD.gn
new file mode 100644
index 0000000..3e7c6257f
--- /dev/null
+++ b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/BUILD.gn
@@ -0,0 +1,48 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("coordinator") {
+  sources = [
+    "fullscreen_signin_screen_coordinator.h",
+    "fullscreen_signin_screen_coordinator.mm",
+    "fullscreen_signin_screen_mediator.h",
+    "fullscreen_signin_screen_mediator.mm",
+    "fullscreen_signin_screen_mediator_delegate.h",
+  ]
+  deps = [
+    "//base",
+    "//components/metrics:metrics_pref_names",
+    "//components/prefs",
+    "//components/signin/public/identity_manager/objc",
+    "//components/sync/service",
+    "//components/web_resource",
+    "//google_apis",
+    "//ios/chrome/browser/authentication/ui_bundled/authentication_flow",
+    "//ios/chrome/browser/authentication/ui_bundled/enterprise:enterprise_utils",
+    "//ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui",
+    "//ios/chrome/browser/authentication/ui_bundled/identity_chooser",
+    "//ios/chrome/browser/authentication/ui_bundled/signin:constants",
+    "//ios/chrome/browser/authentication/ui_bundled/signin:interruptible_chrome_coordinator",
+    "//ios/chrome/browser/authentication/ui_bundled/signin:signin_headers",
+    "//ios/chrome/browser/authentication/ui_bundled/signin/logging",
+    "//ios/chrome/browser/first_run/model",
+    "//ios/chrome/browser/first_run/ui_bundled:constants",
+    "//ios/chrome/browser/first_run/ui_bundled:screen_delegate",
+    "//ios/chrome/browser/first_run/ui_bundled:utils",
+    "//ios/chrome/browser/first_run/ui_bundled/tos",
+    "//ios/chrome/browser/first_run/ui_bundled/uma",
+    "//ios/chrome/browser/policy/model:policy_util",
+    "//ios/chrome/browser/shared/coordinator/chrome_coordinator",
+    "//ios/chrome/browser/shared/model/application_context",
+    "//ios/chrome/browser/shared/model/browser",
+    "//ios/chrome/browser/shared/model/profile",
+    "//ios/chrome/browser/shared/public/commands",
+    "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/signin/model",
+    "//ios/chrome/browser/signin/model:authentication_service",
+    "//ios/chrome/browser/signin/model:authentication_service_factory",
+    "//ios/chrome/browser/signin/model:system_identity",
+    "//ios/chrome/browser/sync/model",
+  ]
+}
diff --git a/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_coordinator.h b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_coordinator.h
similarity index 66%
rename from ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_coordinator.h
rename to ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_coordinator.h
index b3c0fd54..070c8fd 100644
--- a/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_coordinator.h
+++ b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_coordinator.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_SIGNIN_SIGNIN_SCREEN_COORDINATOR_H_
-#define IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_SIGNIN_SIGNIN_SCREEN_COORDINATOR_H_
+#ifndef IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_FULLSCREEN_SIGNIN_SCREEN_COORDINATOR_FULLSCREEN_SIGNIN_SCREEN_COORDINATOR_H_
+#define IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_FULLSCREEN_SIGNIN_SCREEN_COORDINATOR_FULLSCREEN_SIGNIN_SCREEN_COORDINATOR_H_
 
 #import "ios/chrome/browser/authentication/ui_bundled/signin/interruptible_chrome_coordinator.h"
 #import "ios/chrome/browser/shared/coordinator/chrome_coordinator/chrome_coordinator.h"
@@ -14,11 +14,12 @@
 enum class PromoAction : int;
 }  // namespace signin_metrics
 
-// Coordinator to present sign-in screen with FRE consent (optional).
-@interface SigninScreenCoordinator
+// Coordinator responsible for presenting the fullscreen sign-in UI.
+// It is a child coordinator managed by the FullscreenSigninCoordinator.
+@interface FullscreenSigninScreenCoordinator
     : ChromeCoordinator <InterruptibleChromeCoordinator>
 
-// Initiates a SigninScreenCoordinator with `navigationController`,
+// Initiates a FullscreenSigninScreenCoordinator with `navigationController`,
 // `browser` and `delegate`.
 // The `delegate` parameter is for handling the transfer between screens.
 // The `accessPoint` and `promoAction` parameters are used for logging.
@@ -36,4 +37,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_SIGNIN_SIGNIN_SCREEN_COORDINATOR_H_
+#endif  // IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_FULLSCREEN_SIGNIN_SCREEN_COORDINATOR_FULLSCREEN_SIGNIN_SCREEN_COORDINATOR_H_
diff --git a/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_coordinator.mm b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_coordinator.mm
similarity index 89%
rename from ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_coordinator.mm
rename to ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_coordinator.mm
index 7dccc48..d0507d7 100644
--- a/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_coordinator.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_coordinator.mm
@@ -2,11 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_coordinator.h"
+#import "ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_coordinator.h"
 
 #import "base/apple/foundation_util.h"
 #import "base/strings/sys_string_conversions.h"
 #import "ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow.h"
+#import "ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_mediator.h"
+#import "ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_mediator_delegate.h"
+#import "ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/fullscreen_signin_screen_consumer.h"
+#import "ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/fullscreen_signin_screen_view_controller.h"
 #import "ios/chrome/browser/authentication/ui_bundled/identity_chooser/identity_chooser_coordinator.h"
 #import "ios/chrome/browser/authentication/ui_bundled/identity_chooser/identity_chooser_coordinator_delegate.h"
 #import "ios/chrome/browser/authentication/ui_bundled/signin/interruptible_chrome_coordinator.h"
@@ -16,10 +20,6 @@
 #import "ios/chrome/browser/first_run/ui_bundled/first_run_constants.h"
 #import "ios/chrome/browser/first_run/ui_bundled/first_run_screen_delegate.h"
 #import "ios/chrome/browser/first_run/ui_bundled/first_run_util.h"
-#import "ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_consumer.h"
-#import "ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_mediator.h"
-#import "ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_mediator_delegate.h"
-#import "ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_view_controller.h"
 #import "ios/chrome/browser/first_run/ui_bundled/tos/tos_coordinator.h"
 #import "ios/chrome/browser/first_run/ui_bundled/uma/uma_coordinator.h"
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
@@ -34,19 +34,21 @@
 #import "ios/chrome/browser/signin/model/identity_manager_factory.h"
 #import "ios/chrome/browser/sync/model/sync_service_factory.h"
 
-@interface SigninScreenCoordinator () <IdentityChooserCoordinatorDelegate,
-                                       SigninScreenMediatorDelegate,
-                                       SigninScreenViewControllerDelegate,
-                                       TOSCommands,
-                                       UIAdaptivePresentationControllerDelegate,
-                                       UMACoordinatorDelegate>
+@interface FullscreenSigninScreenCoordinator () <
+    FullscreenSigninScreenMediatorDelegate,
+    FullscreenSigninScreenViewControllerDelegate,
+    IdentityChooserCoordinatorDelegate,
+    TOSCommands,
+    UIAdaptivePresentationControllerDelegate,
+    UMACoordinatorDelegate>
 
 // First run screen delegate.
 @property(nonatomic, weak) id<FirstRunScreenDelegate> delegate;
 // Sign-in screen view controller.
-@property(nonatomic, strong) SigninScreenViewController* viewController;
+@property(nonatomic, strong)
+    FullscreenSigninScreenViewController* viewController;
 // Sign-in screen mediator.
-@property(nonatomic, strong) SigninScreenMediator* mediator;
+@property(nonatomic, strong) FullscreenSigninScreenMediator* mediator;
 // Account manager service.
 @property(nonatomic, assign) ChromeAccountManagerService* accountManagerService;
 // Authentication service.
@@ -64,7 +66,7 @@
 
 @end
 
-@implementation SigninScreenCoordinator {
+@implementation FullscreenSigninScreenCoordinator {
   signin_metrics::AccessPoint _accessPoint;
   signin_metrics::PromoAction _promoAction;
 }
@@ -97,7 +99,7 @@
                    forProtocol:@protocol(TOSCommands)];
   id<TOSCommands> TOSHandler =
       HandlerForProtocol(self.browser->GetCommandDispatcher(), TOSCommands);
-  self.viewController = [[SigninScreenViewController alloc] init];
+  self.viewController = [[FullscreenSigninScreenViewController alloc] init];
   self.viewController.TOSHandler = TOSHandler;
   self.viewController.delegate = self;
 
@@ -118,7 +120,7 @@
   PrefService* localPrefService = GetApplicationContext()->GetLocalState();
   PrefService* prefService = profile->GetPrefs();
   syncer::SyncService* syncService = SyncServiceFactory::GetForProfile(profile);
-  self.mediator = [[SigninScreenMediator alloc]
+  self.mediator = [[FullscreenSigninScreenMediator alloc]
       initWithAccountManagerService:self.accountManagerService
               authenticationService:self.authenticationService
                     identityManager:identityManager
@@ -247,9 +249,10 @@
   [self.UMACoordinator start];
 }
 
-#pragma mark - SigninScreenMediatorDelegate
+#pragma mark - FullscreenSigninScreenMediatorDelegate
 
-- (void)signinScreenMediatorDidFinishSignin:(SigninScreenMediator*)mediator {
+- (void)fullscreenSigninScreenMediatorDidFinishSignin:
+    (FullscreenSigninScreenMediator*)mediator {
   CHECK_EQ(mediator, self.mediator, base::NotFatalUntil::M140);
   [self finishPresentingWithSignIn:YES];
 }
@@ -315,7 +318,7 @@
   }
 }
 
-#pragma mark - SigninScreenViewControllerDelegate
+#pragma mark - FullscreenSigninScreenViewControllerDelegate
 
 - (void)showAccountPickerFromPoint:(CGPoint)point {
   DCHECK(!self.identityChooserCoordinator);
diff --git a/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_mediator.h b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_mediator.h
similarity index 78%
rename from ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_mediator.h
rename to ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_mediator.h
index feba19e..b39635a 100644
--- a/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_mediator.h
+++ b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_mediator.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_SIGNIN_SIGNIN_SCREEN_MEDIATOR_H_
-#define IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_SIGNIN_SIGNIN_SCREEN_MEDIATOR_H_
+#ifndef IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_FULLSCREEN_SIGNIN_SCREEN_COORDINATOR_FULLSCREEN_SIGNIN_SCREEN_MEDIATOR_H_
+#define IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_FULLSCREEN_SIGNIN_SCREEN_COORDINATOR_FULLSCREEN_SIGNIN_SCREEN_MEDIATOR_H_
 
 #import <Foundation/Foundation.h>
 
@@ -12,9 +12,9 @@
 @class AuthenticationFlow;
 class AuthenticationService;
 class ChromeAccountManagerService;
+@protocol FullscreenSigninScreenConsumer;
+@protocol FullscreenSigninScreenMediatorDelegate;
 class PrefService;
-@protocol SigninScreenConsumer;
-@protocol SigninScreenMediatorDelegate;
 namespace signin {
 class IdentityManager;
 }  // namespace signin
@@ -27,11 +27,11 @@
 }  // namespace syncer
 @protocol SystemIdentity;
 
-// Mediator that handles the sign-in operation.
-@interface SigninScreenMediator : NSObject
+// Mediator that handles the fullscreen sign-in operation.
+@interface FullscreenSigninScreenMediator : NSObject
 
 // Consumer for this mediator.
-@property(nonatomic, weak) id<SigninScreenConsumer> consumer;
+@property(nonatomic, weak) id<FullscreenSigninScreenConsumer> consumer;
 // The identity currently selected.
 @property(nonatomic, strong) id<SystemIdentity> selectedIdentity;
 // Contains the user choice for UMA reporting. This value is set to the default
@@ -46,7 +46,7 @@
 // Whether dismiss gestures should be ignored (e.g. swipe away).
 @property(nonatomic, assign, readonly) BOOL ignoreDismissGesture;
 // Delegate of the mediator.
-@property(nonatomic, weak) id<SigninScreenMediatorDelegate> delegate;
+@property(nonatomic, weak) id<FullscreenSigninScreenMediatorDelegate> delegate;
 
 // The designated initializer.
 // `accountManagerService` account manager service.
@@ -87,4 +87,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_SIGNIN_SIGNIN_SCREEN_MEDIATOR_H_
+#endif  // IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_FULLSCREEN_SIGNIN_SCREEN_COORDINATOR_FULLSCREEN_SIGNIN_SCREEN_MEDIATOR_H_
diff --git a/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_mediator.mm b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_mediator.mm
similarity index 95%
rename from ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_mediator.mm
rename to ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_mediator.mm
index ccf95e1e..74d4d29 100644
--- a/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_mediator.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_mediator.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_mediator.h"
+#import "ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_mediator.h"
 
 #import "base/containers/contains.h"
 #import "base/metrics/histogram_functions.h"
@@ -17,13 +17,13 @@
 #import "google_apis/gaia/gaia_id.h"
 #import "ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow.h"
 #import "ios/chrome/browser/authentication/ui_bundled/enterprise/enterprise_utils.h"
+#import "ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_mediator_delegate.h"
+#import "ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/fullscreen_signin_screen_consumer.h"
 #import "ios/chrome/browser/authentication/ui_bundled/signin/logging/first_run_signin_logger.h"
 #import "ios/chrome/browser/authentication/ui_bundled/signin/logging/user_signin_logger.h"
 #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_utils.h"
 #import "ios/chrome/browser/first_run/model/first_run_metrics.h"
 #import "ios/chrome/browser/first_run/ui_bundled/first_run_util.h"
-#import "ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_consumer.h"
-#import "ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_mediator_delegate.h"
 #import "ios/chrome/browser/policy/model/policy_util.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
 #import "ios/chrome/browser/signin/model/authentication_service.h"
@@ -42,7 +42,8 @@
 };
 }  // namespace
 
-@interface SigninScreenMediator () <IdentityManagerObserverBridgeDelegate> {
+@interface FullscreenSigninScreenMediator () <
+    IdentityManagerObserverBridgeDelegate> {
 }
 
 // Application local pref.
@@ -62,7 +63,7 @@
 
 @end
 
-@implementation SigninScreenMediator {
+@implementation FullscreenSigninScreenMediator {
   // Account manager service to retrieve Chrome identities.
   raw_ptr<ChromeAccountManagerService> _accountManagerService;
   // Authentication service for sign in.
@@ -222,7 +223,7 @@
 
 #pragma mark - Properties
 
-- (void)setConsumer:(id<SigninScreenConsumer>)consumer {
+- (void)setConsumer:(id<FullscreenSigninScreenConsumer>)consumer {
   DCHECK(consumer);
   DCHECK(!_consumer);
   _consumer = consumer;
@@ -304,7 +305,7 @@
   }
   [self.logger logSigninCompletedWithResult:SigninCoordinatorResultSuccess
                                addedAccount:self.addedAccount];
-  [self.delegate signinScreenMediatorDidFinishSignin:self];
+  [self.delegate fullscreenSigninScreenMediatorDidFinishSignin:self];
 }
 
 - (bool)selectedIdentityIsValid {
diff --git a/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_mediator_delegate.h b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_mediator_delegate.h
new file mode 100644
index 0000000..0969485
--- /dev/null
+++ b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_mediator_delegate.h
@@ -0,0 +1,18 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_FULLSCREEN_SIGNIN_SCREEN_COORDINATOR_FULLSCREEN_SIGNIN_SCREEN_MEDIATOR_DELEGATE_H_
+#define IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_FULLSCREEN_SIGNIN_SCREEN_COORDINATOR_FULLSCREEN_SIGNIN_SCREEN_MEDIATOR_DELEGATE_H_
+
+@class FullscreenSigninScreenMediator;
+
+@protocol FullscreenSigninScreenMediatorDelegate <NSObject>
+
+// Let the coordinator know the sing-in ended successfully.
+- (void)fullscreenSigninScreenMediatorDidFinishSignin:
+    (FullscreenSigninScreenMediator*)mediator;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_FULLSCREEN_SIGNIN_SCREEN_COORDINATOR_FULLSCREEN_SIGNIN_SCREEN_MEDIATOR_DELEGATE_H_
diff --git a/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/BUILD.gn b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/BUILD.gn
new file mode 100644
index 0000000..fe7f6e7
--- /dev/null
+++ b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/BUILD.gn
@@ -0,0 +1,28 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("ui") {
+  sources = [
+    "fullscreen_signin_screen_consumer.h",
+    "fullscreen_signin_screen_view_controller.h",
+    "fullscreen_signin_screen_view_controller.mm",
+  ]
+  deps = [
+    "//base",
+    "//ios/chrome/app/strings",
+    "//ios/chrome/browser/authentication/ui_bundled/views",
+    "//ios/chrome/browser/first_run/ui_bundled:constants",
+    "//ios/chrome/browser/settings/ui_bundled/elements:enterprise_info_popover_view_controller",
+    "//ios/chrome/browser/shared/public/commands",
+    "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/shared/ui/elements:elements_internal",
+    "//ios/chrome/browser/shared/ui/symbols",
+    "//ios/chrome/common:string_util",
+    "//ios/chrome/common/ui/colors",
+    "//ios/chrome/common/ui/elements:popover_label_view_controller",
+    "//ios/chrome/common/ui/promo_style",
+    "//ios/chrome/common/ui/util",
+    "//ui/base",
+  ]
+}
diff --git a/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_consumer.h b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/fullscreen_signin_screen_consumer.h
similarity index 83%
rename from ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_consumer.h
rename to ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/fullscreen_signin_screen_consumer.h
index e0a9ef3..8557591 100644
--- a/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_consumer.h
+++ b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/fullscreen_signin_screen_consumer.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_SIGNIN_SIGNIN_SCREEN_CONSUMER_H_
-#define IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_SIGNIN_SIGNIN_SCREEN_CONSUMER_H_
+#ifndef IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_FULLSCREEN_SIGNIN_SCREEN_UI_FULLSCREEN_SIGNIN_SCREEN_CONSUMER_H_
+#define IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_FULLSCREEN_SIGNIN_SCREEN_UI_FULLSCREEN_SIGNIN_SCREEN_CONSUMER_H_
 
 #import <UIKit/UIKit.h>
 
@@ -29,8 +29,8 @@
   SigninScreenConsumerScreenIntentWelcomeWithoutUMAAndSignin,
 };
 
-// Handles sign-in screen UI updates.
-@protocol SigninScreenConsumer <NSObject>
+// Handles the fullscreen sign-in screen UI updates.
+@protocol FullscreenSigninScreenConsumer <NSObject>
 
 // Shows details (an icon and a footer) that Chrome is managed by platform
 // policies. This property needs to be set before the view is loaded.
@@ -61,4 +61,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_SIGNIN_SIGNIN_SCREEN_CONSUMER_H_
+#endif  // IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_FULLSCREEN_SIGNIN_SCREEN_UI_FULLSCREEN_SIGNIN_SCREEN_CONSUMER_H_
diff --git a/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/fullscreen_signin_screen_view_controller.h b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/fullscreen_signin_screen_view_controller.h
new file mode 100644
index 0000000..9747abc1
--- /dev/null
+++ b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/fullscreen_signin_screen_view_controller.h
@@ -0,0 +1,35 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_FULLSCREEN_SIGNIN_SCREEN_UI_FULLSCREEN_SIGNIN_SCREEN_VIEW_CONTROLLER_H_
+#define IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_FULLSCREEN_SIGNIN_SCREEN_UI_FULLSCREEN_SIGNIN_SCREEN_VIEW_CONTROLLER_H_
+
+#import <UIKit/UIKit.h>
+
+#import "ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/fullscreen_signin_screen_consumer.h"
+#import "ios/chrome/common/ui/promo_style/promo_style_view_controller.h"
+
+@protocol TOSCommands;
+
+// Delegate for the fullscreen sign-in view controller.
+@protocol FullscreenSigninScreenViewControllerDelegate <
+    PromoStyleViewControllerDelegate>
+
+// Called when the user taps to see the account picker.
+- (void)showAccountPickerFromPoint:(CGPoint)point;
+
+@end
+
+// View controller for a fullscreen sign-in.
+@interface FullscreenSigninScreenViewController
+    : PromoStyleViewController <FullscreenSigninScreenConsumer>
+
+// Handler to open the terms of service dialog.
+@property(nonatomic, weak) id<TOSCommands> TOSHandler;
+@property(nonatomic, weak) id<FullscreenSigninScreenViewControllerDelegate>
+    delegate;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_AUTHENTICATION_UI_BUNDLED_FULLSCREEN_SIGNIN_SCREEN_UI_FULLSCREEN_SIGNIN_SCREEN_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_view_controller.mm b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/fullscreen_signin_screen_view_controller.mm
similarity index 97%
rename from ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_view_controller.mm
rename to ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/fullscreen_signin_screen_view_controller.mm
index 95b68059..98f2bf7c 100644
--- a/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_view_controller.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/fullscreen_signin_screen_view_controller.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_view_controller.h"
+#import "ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/fullscreen_signin_screen_view_controller.h"
 
 #import "base/notreached.h"
 #import "base/strings/sys_string_conversions.h"
@@ -31,7 +31,7 @@
 
 }  // namespace
 
-@interface SigninScreenViewController ()
+@interface FullscreenSigninScreenViewController ()
 
 // Button controlling the display of the selected identity.
 @property(nonatomic, strong) IdentityButtonControl* identityControl;
@@ -43,7 +43,7 @@
 
 @end
 
-@implementation SigninScreenViewController
+@implementation FullscreenSigninScreenViewController
 
 @dynamic delegate;
 @synthesize hasPlatformPolicies = _hasPlatformPolicies;
@@ -284,7 +284,7 @@
   }
 }
 
-#pragma mark - SigninScreenConsumer
+#pragma mark - FullscreenSigninScreenConsumer
 
 - (void)setSelectedIdentityUserName:(NSString*)userName
                               email:(NSString*)email
diff --git a/ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_mediator.mm b/ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_mediator.mm
index 40b4973..a31ef40 100644
--- a/ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_mediator.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_mediator.mm
@@ -145,18 +145,14 @@
 - (void)onExtendedAccountInfoUpdated:(const AccountInfo&)info {
   id<SystemIdentity> identity =
       _accountManagerService->GetIdentityOnDeviceWithGaiaID(info.gaia);
-  [self handleIdentityUpdated:identity];
-}
-
-#pragma mark - Private
-
-- (void)handleIdentityUpdated:(id<SystemIdentity>)identity {
   if ([identity isEqual:_authenticationService->GetPrimaryIdentity(
                             signin::ConsentLevel::kSignin)]) {
     [self updateAvatarImageWithIdentity:identity];
   }
 }
 
+#pragma mark - Private
+
 // Updates the avatar image for the consumer from `identity`.
 - (void)updateAvatarImageWithIdentity:(id<SystemIdentity>)identity {
   UIImage* image = _accountManagerService->GetIdentityAvatarWithIdentity(
diff --git a/ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_popup_coordinator.mm b/ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_popup_coordinator.mm
index 10dbe330..e106d8e 100644
--- a/ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_popup_coordinator.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_popup_coordinator.mm
@@ -128,13 +128,10 @@
   _navigationController = nil;
 
   if (result != SigninCoordinatorResultSuccess && _signOutIfDeclined) {
-    signin::MultiProfileSignOut(
-        self.browser,
+    signin::ProfileSignoutRequest(
         signin_metrics::ProfileSignout::
-            kUserDeclinedHistorySyncAfterDedicatedSignIn,
-        /*force_snackbar_over_toolbar=*/false,
-        /*snackbar_message=*/nil,
-        /*signout_completion=*/nil);
+            kUserDeclinedHistorySyncAfterDedicatedSignIn)
+        .Run(self.browser);
   }
   [self.delegate historySyncPopupCoordinator:self didFinishWithResult:result];
 }
diff --git a/ios/chrome/browser/authentication/ui_bundled/identity_chooser/identity_chooser_mediator.mm b/ios/chrome/browser/authentication/ui_bundled/identity_chooser/identity_chooser_mediator.mm
index 5dffcc3..cda1823 100644
--- a/ios/chrome/browser/authentication/ui_bundled/identity_chooser/identity_chooser_mediator.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/identity_chooser/identity_chooser_mediator.mm
@@ -134,7 +134,17 @@
   [self.consumer itemHasChanged:item];
 }
 
-- (void)handleIdentityListChanged {
+#pragma mark - IdentityManagerObserverBridgeDelegate
+
+- (void)onExtendedAccountInfoUpdated:(const AccountInfo&)info {
+  id<SystemIdentity> identity =
+      _accountManagerService->GetIdentityOnDeviceWithGaiaID(info.gaia);
+  TableViewIdentityItem* item =
+      [self.consumer tableViewIdentityItemWithGaiaID:identity.gaiaID];
+  [self updateTableViewIdentityItem:item withIdentity:identity];
+}
+
+- (void)onAccountsOnDeviceChanged {
   if (!_accountManagerService || !_identityManager) {
     return;
   }
@@ -149,22 +159,4 @@
   }
 }
 
-- (void)handleIdentityUpdated:(id<SystemIdentity>)identity {
-  TableViewIdentityItem* item =
-      [self.consumer tableViewIdentityItemWithGaiaID:identity.gaiaID];
-  [self updateTableViewIdentityItem:item withIdentity:identity];
-}
-
-#pragma mark - IdentityManagerObserverBridgeDelegate
-
-- (void)onExtendedAccountInfoUpdated:(const AccountInfo&)info {
-  id<SystemIdentity> identity =
-      _accountManagerService->GetIdentityOnDeviceWithGaiaID(info.gaia);
-  [self handleIdentityUpdated:identity];
-}
-
-- (void)onAccountsOnDeviceChanged {
-  [self handleIdentityListChanged];
-}
-
 @end
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_coordinator.mm b/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_coordinator.mm
index 3cdea884..d4b51ed 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_coordinator.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_coordinator.mm
@@ -244,7 +244,7 @@
 }
 
 - (void)signOutFromTargetRect:(CGRect)targetRect
-                   completion:(void (^)(BOOL))completion {
+                   completion:(signin_ui::SignoutCompletionCallback)completion {
   if (!_authenticationService->HasPrimaryIdentity(
           signin::ConsentLevel::kSignin)) {
     // This could happen in very rare cases, if the account somehow got removed
@@ -262,10 +262,10 @@
                             view:_viewController.view
         forceSnackbarOverToolbar:YES
                       withSource:metricSignOut
-                      completion:^(BOOL success) {
+                      completion:^(BOOL success, SceneState* scene_state) {
                         [weakSelf stopSignoutActionSheetCoordinator];
                         if (completion) {
-                          completion(success);
+                          completion(success, scene_state);
                         }
                       }];
   [_signoutActionSheetCoordinator start];
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_coordinator_unittests.mm b/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_coordinator_unittests.mm
index 3f3f1c6..503e1e0 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_coordinator_unittests.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_coordinator_unittests.mm
@@ -289,7 +289,7 @@
   OCMExpect([mock_snackbar_commands_handler_
       showSnackbarMessageOverBrowserToolbar:[OCMArg isNotNil]]);
   [coordinator_ signOutFromTargetRect:rect
-                           completion:^(BOOL success) {
+                           completion:^(BOOL success, SceneState* scene_state) {
                              EXPECT_TRUE(success);
                              assertOpenAndInterrupt();
                              closure.Run();
@@ -316,7 +316,7 @@
   base::RepeatingClosure closure = run_loop.QuitClosure();
   CGRect rect = CGRect();
   [coordinator_ signOutFromTargetRect:rect
-                           completion:^(BOOL success) {
+                           completion:^(BOOL success, SceneState* scene_state) {
                              EXPECT_TRUE(success);
                              closure.Run();
                            }];
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_mediator.mm b/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_mediator.mm
index 3876839..31756b35 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_mediator.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_mediator.mm
@@ -205,11 +205,11 @@
 }
 
 - (void)onExtendedAccountInfoUpdated:(const AccountInfo&)info {
-  [self handleIdentityUpdated];
+  [self updateIdentitiesIfAllowed];
 }
 
 - (void)onAccountsOnDeviceChanged {
-  [self handleIdentityListChanged];
+  [self updateIdentitiesIfAllowed];
 }
 
 #pragma mark - SyncObserverModelBridge
@@ -247,10 +247,11 @@
   _blockUpdates = YES;
   self.userInteractionsBlocked = YES;
   __weak __typeof(self) weakSelf = self;
-  [self.delegate signOutFromTargetRect:targetRect
-                            completion:^(BOOL success) {
-                              [weakSelf signoutEndedWithSuccess:success];
-                            }];
+  [self.delegate
+      signOutFromTargetRect:targetRect
+                 completion:^(BOOL success, SceneState* scene_state) {
+                   [weakSelf signoutEndedWithSuccess:success];
+                 }];
 }
 
 - (void)accountTappedWithGaiaID:(NSString*)gaiaID
@@ -423,14 +424,6 @@
 
 #pragma mark - Private
 
-- (void)handleIdentityListChanged {
-  [self updateIdentitiesIfAllowed];
-}
-
-- (void)handleIdentityUpdated {
-  [self updateIdentitiesIfAllowed];
-}
-
 // Updates the identity list in `_identities`, and sends an notification to
 // the consumer.
 - (void)updateIdentitiesIfAllowed {
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_mediator_delegate.h b/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_mediator_delegate.h
index 7db5388a..a41c5a4 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_mediator_delegate.h
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_mediator_delegate.h
@@ -34,7 +34,7 @@
 // it’s a success.
 // It should only be called when the current scene is not blocked.
 - (void)signOutFromTargetRect:(CGRect)targetRect
-                   completion:(void (^)(BOOL))completion;
+                   completion:(signin_ui::SignoutCompletionCallback)completion;
 
 // Shows https://myaccount.google.com/ for the account currently signed-in
 // to Chrome. The content is displayed in a new view in the stack, i.e.
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_mediator_unittests.mm b/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_mediator_unittests.mm
index 2da1546..6f5680d 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_mediator_unittests.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/account_menu/account_menu_mediator_unittests.mm
@@ -458,9 +458,6 @@
 
   // Testing the part before the callback.
   // This variable will contain the callback that should be executed once
-  // sign-out ends.
-  __block signin_ui::SignoutCompletionCallback signoutCallback = nil;
-  // This variable will contain the callback that should be executed once
   // sign-in ends.
   __block signin_ui::SigninCompletionCallback signinCallback = nil;
   const CGRect target = CGRect();
@@ -483,7 +480,6 @@
   OCMExpect([consumer_mock_ setUserInteractionsEnabled:YES]);
   // Simulate AuthenticationFlow failure.
   signinCallback(SigninCoordinatorResultCanceledByUser);
-  EXPECT_EQ(signoutCallback, nil);
 }
 
 // Tests the result of accountTappedWithGaiaID:targetRect:
@@ -650,7 +646,7 @@
   }
   CGRect rect = CGRectMake(0, 0, 40, 24);
 
-  __block void (^completion)(BOOL) = nil;
+  __block signin_ui::SignoutCompletionCallback completion = nil;
   OCMExpect([delegate_mock_
       signOutFromTargetRect:rect
                  completion:[OCMArg checkWithBlock:^BOOL(id value) {
@@ -664,7 +660,7 @@
                       withResult:SigninCoordinatorResultCanceledByUser
                   signedIdentity:nil
                  userTappedClose:NO]);
-  completion(YES);
+  completion(YES, nil);
 }
 
 // Tests tapping on the close button just after the sign-out button.
@@ -677,7 +673,7 @@
     }
   }
   CGRect rect = CGRectMake(0, 0, 40, 24);
-  __block void (^completion)(BOOL) = nil;
+  __block signin_ui::SignoutCompletionCallback completion = nil;
   OCMExpect([delegate_mock_
       signOutFromTargetRect:rect
                  completion:[OCMArg checkWithBlock:^BOOL(id value) {
@@ -688,7 +684,7 @@
   [mediator_ signOutFromTargetRect:rect];
   [mediator_ disconnect];
   OCMExpect([consumer_mock_ setUserInteractionsEnabled:YES]);
-  completion(NO);
+  completion(NO, nil);
 }
 
 // Tests tapping on the close button just after the sign-out button.
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_account_chooser/consistency_account_chooser_mediator.mm b/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_account_chooser/consistency_account_chooser_mediator.mm
index 6c3ffb6..119fab2 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_account_chooser/consistency_account_chooser_mediator.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_account_chooser/consistency_account_chooser_mediator.mm
@@ -146,15 +146,11 @@
   [self.consumer reloadIdentityForIdentityItemConfigurator:configurator];
 }
 
-- (void)handleIdentityListChanged {
-  [self loadIdentityItemConfigurators];
-  [self.consumer reloadAllIdentities];
-}
-
 #pragma mark -  IdentityManagerObserver
 
 - (void)onAccountsOnDeviceChanged {
-  [self handleIdentityListChanged];
+  [self loadIdentityItemConfigurators];
+  [self.consumer reloadAllIdentities];
 }
 
 - (void)onExtendedAccountInfoUpdated:(const AccountInfo&)info {
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_mediator.mm b/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_mediator.mm
index 4b47058..a4cd0e2 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_mediator.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/consistency_promo_signin/consistency_default_account/consistency_default_account_mediator.mm
@@ -150,6 +150,7 @@
     case signin_metrics::AccessPoint::kHistoryPage:
     case signin_metrics::AccessPoint::kCollaborationJoinTabGroup:
     case signin_metrics::AccessPoint::kHistorySyncOptinExpansionPill:
+    case signin_metrics::AccessPoint::kWidget:
       // Nothing prevents instantiating ConsistencyDefaultAccountViewController
       // with an arbitrary entry point, API-wise. In doubt, no label is a good,
       // generic default that fits all entry points.
@@ -283,10 +284,6 @@
                                         managed:isManaged];
 }
 
-- (void)handleIdentityListChanged {
-  [self selectSelectedIdentity];
-}
-
 - (void)handleIdentityUpdated:(id<SystemIdentity>)identity {
   if ([self.selectedIdentity isEqual:identity]) {
     [self updateSelectedIdentityUI];
@@ -317,7 +314,7 @@
 #pragma mark -  IdentityManagerObserver
 
 - (void)onAccountsOnDeviceChanged {
-  [self handleIdentityListChanged];
+  [self selectSelectedIdentity];
 }
 
 - (void)onExtendedAccountInfoUpdated:(const AccountInfo&)info {
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/fullscreen_signin/coordinator/BUILD.gn b/ios/chrome/browser/authentication/ui_bundled/signin/fullscreen_signin/coordinator/BUILD.gn
index ab8bc4e..e39e7cb 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin/fullscreen_signin/coordinator/BUILD.gn
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/fullscreen_signin/coordinator/BUILD.gn
@@ -10,11 +10,11 @@
   deps = [
     "//base",
     "//components/signin/public/identity_manager:identity_manager",
+    "//ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator",
     "//ios/chrome/browser/authentication/ui_bundled/signin:signin_headers",
     "//ios/chrome/browser/authentication/ui_bundled/signin:signin_protected",
     "//ios/chrome/browser/first_run/ui_bundled:screen_delegate",
     "//ios/chrome/browser/first_run/ui_bundled:utils",
-    "//ios/chrome/browser/first_run/ui_bundled/signin",
     "//ios/chrome/browser/main/model",
     "//ios/chrome/browser/screen/ui_bundled:screen_provider",
     "//ios/chrome/browser/screen/ui_bundled:screen_type",
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/fullscreen_signin/coordinator/fullscreen_signin_coordinator.h b/ios/chrome/browser/authentication/ui_bundled/signin/fullscreen_signin/coordinator/fullscreen_signin_coordinator.h
index 2bb15c8..9d6c7cd 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin/fullscreen_signin/coordinator/fullscreen_signin_coordinator.h
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/fullscreen_signin/coordinator/fullscreen_signin_coordinator.h
@@ -9,7 +9,9 @@
 
 @class ScreenProvider;
 
-// Coordinator to present a fullscreen sign-in promo.
+// Main coordinator that manages the overall fullscreen sign-in flow.
+// It contains a child coordinator, FullscreenSigninScreenCoordinator,
+// which is responsible for presenting the actual fullscreen sign-in screen.
 @interface FullscreenSigninCoordinator : SigninCoordinator
 
 // Initiate the coordinator.
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/fullscreen_signin/coordinator/fullscreen_signin_coordinator.mm b/ios/chrome/browser/authentication/ui_bundled/signin/fullscreen_signin/coordinator/fullscreen_signin_coordinator.mm
index f5777c1..382a4751 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin/fullscreen_signin/coordinator/fullscreen_signin_coordinator.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/fullscreen_signin/coordinator/fullscreen_signin_coordinator.mm
@@ -8,12 +8,12 @@
 
 #import "base/notreached.h"
 #import "components/signin/public/identity_manager/identity_manager.h"
+#import "ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_coordinator.h"
 #import "ios/chrome/browser/authentication/ui_bundled/signin/interruptible_chrome_coordinator.h"
 #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_constants.h"
 #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_coordinator+protected.h"
 #import "ios/chrome/browser/first_run/ui_bundled/first_run_screen_delegate.h"
 #import "ios/chrome/browser/first_run/ui_bundled/first_run_util.h"
-#import "ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_coordinator.h"
 #import "ios/chrome/browser/screen/ui_bundled/screen_provider.h"
 #import "ios/chrome/browser/screen/ui_bundled/screen_type.h"
 #import "ios/chrome/browser/shared/model/browser/browser.h"
@@ -117,7 +117,7 @@
     createChildCoordinatorWithScreenType:(ScreenType)type {
   switch (type) {
     case kSignIn:
-      return [[SigninScreenCoordinator alloc]
+      return [[FullscreenSigninScreenCoordinator alloc]
           initWithBaseNavigationController:self.navigationController
                                    browser:self.browser
                                   delegate:self
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/signin_utils.h b/ios/chrome/browser/authentication/ui_bundled/signin/signin_utils.h
index d56dbf01..c8a30cf 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin/signin_utils.h
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/signin_utils.h
@@ -7,7 +7,7 @@
 
 #import <UIKit/UIKit.h>
 
-#import "base/functional/callback_forward.h"
+#import "base/functional/callback.h"
 #import "base/ios/block_types.h"
 #import "components/signin/public/identity_manager/tribool.h"
 #import "components/sync/base/data_type.h"
@@ -19,6 +19,7 @@
 class ChromeAccountManagerService;
 @class MDCSnackbarMessage;
 class ProfileIOS;
+@class SceneState;
 
 namespace signin_metrics {
 enum class ProfileSignout;
@@ -40,6 +41,55 @@
 using UnsyncedDataForSignoutOrProfileSwitchingCallback =
     base::OnceCallback<void(syncer::DataTypeSet data_type_set)>;
 
+// Represents a request to sign-out.
+class ProfileSignoutRequest {
+ public:
+  // Callback invoked before starting the sign-out request with a boolean
+  // indicating whether the operation will require changing the profile.
+  using PrepareCallback = base::OnceCallback<void(bool will_change_profile)>;
+
+  // Callback invoked when the profile switching operation has completed.
+  using CompletionCallback = base::OnceCallback<void(SceneState*)>;
+
+  explicit ProfileSignoutRequest(signin_metrics::ProfileSignout source);
+
+  ProfileSignoutRequest(const ProfileSignoutRequest&) = delete;
+  ProfileSignoutRequest& operator=(const ProfileSignoutRequest&) = delete;
+
+  ~ProfileSignoutRequest();
+
+  // Configures the snackbar message to display and whether it should be
+  // forced over the toolbar or not.
+  ProfileSignoutRequest&& SetSnackbarMessage(
+      MDCSnackbarMessage* snackbar_message,
+      bool force_snackbar_over_toolbar) &&;
+
+  // Configures the callback invoked before starting the request.
+  ProfileSignoutRequest&& SetPrepareCallback(
+      PrepareCallback prepare_callback) &&;
+
+  // Configures the completion callback.
+  ProfileSignoutRequest&& SetCompletionCallback(
+      CompletionCallback completion_callback) &&;
+
+  // Configures whether the metrics should be recorded.
+  ProfileSignoutRequest&& SetShouldRecordMetrics(bool value) &&;
+
+  // Starts the signout request, invoking `prepare_callback` synchronously
+  // before doing any change with a boolean indicating whether the operation
+  // will require changing the profile.
+  void Run(Browser* browser) &&;
+
+ private:
+  const signin_metrics::ProfileSignout source_;
+  PrepareCallback prepare_callback_;
+  CompletionCallback completion_callback_;
+  MDCSnackbarMessage* snackbar_message_;
+  bool force_snackbar_over_toolbar_ = false;
+  bool should_record_metrics_ = true;
+  bool run_has_been_called_ = false;
+};
+
 // Returns the maximum allowed waiting time for the Account Capabilities API.
 base::TimeDelta GetWaitThresholdForCapabilities();
 
@@ -83,17 +133,10 @@
 // Convenience version that grabs the required services from the `profile`.
 id<SystemIdentity> GetDefaultIdentityOnDevice(ProfileIOS* profile);
 
-// Switch profile if needed then sign out from the current profile.
-void MultiProfileSignOut(Browser* browser,
-                         signin_metrics::ProfileSignout signout_source,
-                         bool force_snackbar_over_toolbar,
-                         MDCSnackbarMessage* snackbar_message,
-                         ProceduralBlock signout_completion,
-                         bool should_record_metrics = true);
-
-// Similar to `MultiProfileSignOut`, but switches to personal profile in all
-// windows and not just one. This also skips recording metrics for single
-// profile signout as policies have their own metrics for signout.
+// Switch profile if needed in all windows then sign out from the current
+// profile, but switches to personal profile in all. This also skips
+// recording metrics for single profile signout as policies have their
+// own metrics for signout.
 void MultiProfileSignOutForProfile(
     ProfileIOS* profile,
     signin_metrics::ProfileSignout signout_source,
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/signin_utils.mm b/ios/chrome/browser/authentication/ui_bundled/signin/signin_utils.mm
index 1392f12c..485c3fa 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin/signin_utils.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/signin_utils.mm
@@ -57,6 +57,29 @@
 
 namespace {
 
+// Initiate synchronously the change to `profile`, then run `continuation`
+// when the change completes asynchronously. The UI (thus `scene_state`)
+// will be destroyed synchronously, so this function should not be called
+// directly, instead it should be posted as a task.
+//
+// Destroying the UI will destroy the SceneState, the SceneController and
+// the Browser. As the SceneState is an Objective-C class and the Browser
+// is a C++ class, this method take a SceneState* as parameter to avoid
+// risking accessing a dangling pointer to a C++ object.
+void SwitchToProfileSynchronously(const std::string& profile_name,
+                                  __weak SceneState* weak_scene_state,
+                                  ChangeProfileContinuation continuation) {
+  if (SceneState* scene_state = weak_scene_state) {
+    id<ChangeProfileCommands> change_profile_handler = HandlerForProtocol(
+        scene_state.profileState.appState.appCommandDispatcher,
+        ChangeProfileCommands);
+
+    [change_profile_handler changeProfile:profile_name
+                                 forScene:scene_state
+                             continuation:std::move(continuation)];
+  }
+}
+
 // Maximum delay to wait for fetching the account capabilities before showing
 // the sign-in upgrade promo. If fetching the account capabilities takes more
 // than the delay, then the promo is suppressed - it may be shown on the next
@@ -106,25 +129,28 @@
          is_work_profile;
 }
 
-// Switch from a managed profile to a personal profile then run `continuation`.
+// Post an asynchronous request to switch to `profile`, running `continuation`
+// when the change completes.
+void SwitchToProfile(Browser* browser,
+                     const std::string& profile_name,
+                     ChangeProfileContinuation continuation) {
+  __weak SceneState* weak_scene_state = browser->GetSceneState();
+  base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+      FROM_HERE, base::BindOnce(&SwitchToProfileSynchronously, profile_name,
+                                weak_scene_state, std::move(continuation)));
+}
+
+// Post an asynchronous request to switch from a managed profile to the
+// personal profile, running `continuation` when the change completes.
 void SwitchToPersonalProfile(Browser* browser,
                              ChangeProfileContinuation continuation) {
-  SceneState* scene_state = browser->GetSceneState();
-
   ProfileManagerIOS* profile_manager =
       GetApplicationContext()->GetProfileManager();
-  std::string default_profile_name =
+  std::string personal_profile_name =
       profile_manager->GetProfileAttributesStorage()->GetPersonalProfileName();
+  CHECK(profile_manager->HasProfileWithName(personal_profile_name));
 
-  CHECK(profile_manager->HasProfileWithName(default_profile_name));
-
-  id<ChangeProfileCommands> change_profile_handler =
-      HandlerForProtocol(scene_state.profileState.appState.appCommandDispatcher,
-                         ChangeProfileCommands);
-
-  [change_profile_handler changeProfile:default_profile_name
-                               forScene:scene_state
-                           continuation:std::move(continuation)];
+  SwitchToProfile(browser, personal_profile_name, std::move(continuation));
 }
 
 }  // namespace
@@ -386,25 +412,65 @@
       ChromeAccountManagerServiceFactory::GetForProfile(profile));
 }
 
-void MultiProfileSignOut(Browser* browser,
-                         signin_metrics::ProfileSignout signout_source,
-                         bool force_snackbar_over_toolbar,
-                         MDCSnackbarMessage* snackbar_message,
-                         ProceduralBlock signout_completion,
-                         bool should_record_metrics) {
+ProfileSignoutRequest::ProfileSignoutRequest(
+    signin_metrics::ProfileSignout source)
+    : source_(source),
+      prepare_callback_(base::DoNothing()),
+      completion_callback_(base::DoNothing()) {}
+
+ProfileSignoutRequest::~ProfileSignoutRequest() {
+  CHECK(run_has_been_called_);
+}
+
+ProfileSignoutRequest&& ProfileSignoutRequest::SetSnackbarMessage(
+    MDCSnackbarMessage* snackbar_message,
+    bool force_snackbar_over_toolbar) && {
+  CHECK(!run_has_been_called_);
+  snackbar_message_ = snackbar_message;
+  force_snackbar_over_toolbar_ = force_snackbar_over_toolbar;
+  return std::move(*this);
+}
+
+ProfileSignoutRequest&& ProfileSignoutRequest::SetPrepareCallback(
+    PrepareCallback prepare_callback) && {
+  CHECK(!run_has_been_called_);
+  CHECK(!prepare_callback.is_null());
+  prepare_callback_ = std::move(prepare_callback);
+  return std::move(*this);
+}
+
+ProfileSignoutRequest&& ProfileSignoutRequest::SetCompletionCallback(
+    CompletionCallback completion_callback) && {
+  CHECK(!run_has_been_called_);
+  CHECK(!completion_callback.is_null());
+  completion_callback_ = std::move(completion_callback);
+  return std::move(*this);
+}
+
+ProfileSignoutRequest&& ProfileSignoutRequest::SetShouldRecordMetrics(
+    bool value) && {
+  CHECK(!run_has_been_called_);
+  should_record_metrics_ = value;
+  return std::move(*this);
+}
+
+void ProfileSignoutRequest::Run(Browser* browser) && {
+  CHECK(!run_has_been_called_);
+  run_has_been_called_ = true;
+
   // The regular browser should be used to execute the signout.
   CHECK_EQ(browser->type(), Browser::Type::kRegular);
   SceneState* scene_state = browser->GetSceneState();
 
   ChangeProfileContinuation continuation =
       CreateChangeProfileSignoutContinuation(
-          signout_source, force_snackbar_over_toolbar, should_record_metrics,
-          snackbar_message, signout_completion);
+          source_, force_snackbar_over_toolbar_, should_record_metrics_,
+          snackbar_message_, std::move(completion_callback_));
   ProfileIOS* profile = browser->GetProfile();
   AuthenticationService* authentication_service =
       AuthenticationServiceFactory::GetForProfile(profile);
 
-  if (signout_source == signin_metrics::ProfileSignout::kPrefChanged) {
+  if (source_ == signin_metrics::ProfileSignout::kPrefChanged) {
     ChangeProfileContinuation postSignoutContinuation =
         CreateChangeProfileForceSignoutContinuation();
     continuation = ChainChangeProfileContinuations(
@@ -413,18 +479,19 @@
 
   if (!ShouldSwitchProfileAtSignout(authentication_service,
                                     profile->GetProfileName())) {
+    std::move(prepare_callback_).Run(/*will_change_profile=*/false);
     std::move(continuation).Run(scene_state, base::DoNothing());
     return;
   }
 
-  if (signout_source ==
-      signin_metrics::ProfileSignout::kUserClickedSignoutSettings) {
+  if (source_ == signin_metrics::ProfileSignout::kUserClickedSignoutSettings) {
     ChangeProfileContinuation postSignoutContinuation =
         CreateChangeProfileSettingsContinuation();
     continuation = ChainChangeProfileContinuations(
         std::move(continuation), std::move(postSignoutContinuation));
   }
 
+  std::move(prepare_callback_).Run(/*will_change_profile=*/true);
   SwitchToPersonalProfile(browser, std::move(continuation));
 }
 
@@ -462,7 +529,7 @@
         CreateChangeProfileSignoutContinuation(
             signout_source, /*force_snackbar_over_toolbar=*/false,
             /*should_record_metrics=*/false, /*snackbar_message =*/nil,
-            base::CallbackToBlock(barrier));
+            base::IgnoreArgs<SceneState*>(barrier));
     SwitchToPersonalProfile(browser, std::move(continuation));
   }
 }
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/BUILD.gn b/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/BUILD.gn
index c173ad7a..1d9d7491 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/BUILD.gn
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/BUILD.gn
@@ -11,6 +11,7 @@
     "//base",
     "//components/signin/public/identity_manager",
     "//components/sync/base:features",
+    "//ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator",
     "//ios/chrome/browser/authentication/ui_bundled/history_sync",
     "//ios/chrome/browser/authentication/ui_bundled/signin:signin_headers",
     "//ios/chrome/browser/authentication/ui_bundled/signin:signin_protected",
@@ -18,7 +19,6 @@
     "//ios/chrome/browser/authentication/ui_bundled/signin/logging",
     "//ios/chrome/browser/first_run/ui_bundled:screen_delegate",
     "//ios/chrome/browser/first_run/ui_bundled:utils",
-    "//ios/chrome/browser/first_run/ui_bundled/signin",
     "//ios/chrome/browser/screen/ui_bundled:screen_provider",
     "//ios/chrome/browser/screen/ui_bundled:screen_type",
     "//ios/chrome/browser/shared/model/browser",
@@ -35,9 +35,9 @@
     ":two_screens_signin",
     "//base/test:test_support",
     "//components/sync/base:features",
+    "//ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui",
     "//ios/chrome/browser/authentication/ui_bundled/history_sync:ui",
     "//ios/chrome/browser/authentication/ui_bundled/signin:signin_headers",
-    "//ios/chrome/browser/first_run/ui_bundled/signin:signin_ui",
     "//ios/chrome/browser/shared/model/application_context",
     "//ios/chrome/browser/shared/model/browser/test:test_support",
     "//ios/chrome/browser/shared/model/profile/test",
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/two_screens_signin_coordinator.mm b/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/two_screens_signin_coordinator.mm
index 5dcaeeba..3031515 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/two_screens_signin_coordinator.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/two_screens_signin_coordinator.mm
@@ -10,6 +10,7 @@
 #import "base/notreached.h"
 #import "base/strings/sys_string_conversions.h"
 #import "components/signin/public/identity_manager/identity_manager.h"
+#import "ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_coordinator.h"
 #import "ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_coordinator.h"
 #import "ios/chrome/browser/authentication/ui_bundled/signin/interruptible_chrome_coordinator.h"
 #import "ios/chrome/browser/authentication/ui_bundled/signin/logging/upgrade_signin_logger.h"
@@ -17,7 +18,6 @@
 #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_coordinator+protected.h"
 #import "ios/chrome/browser/authentication/ui_bundled/signin/uno_signin_screen_provider.h"
 #import "ios/chrome/browser/first_run/ui_bundled/first_run_util.h"
-#import "ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_coordinator.h"
 #import "ios/chrome/browser/screen/ui_bundled/screen_provider.h"
 #import "ios/chrome/browser/screen/ui_bundled/screen_type.h"
 #import "ios/chrome/browser/shared/model/browser/browser.h"
@@ -38,7 +38,7 @@
 @implementation TwoScreensSigninCoordinator {
   signin_metrics::PromoAction _promoAction;
 
-  // This can be either the SigninScreenCoordinator or the
+  // This can be either the FullscreenSigninScreenCoordinator or the
   // HistorySyncCoordinator depending on which step the user is on.
   ChromeCoordinator* _childCoordinator;
 
@@ -157,7 +157,7 @@
 - (ChromeCoordinator*)createChildCoordinatorWithScreenType:(ScreenType)type {
   switch (type) {
     case kSignIn:
-      return [[SigninScreenCoordinator alloc]
+      return [[FullscreenSigninScreenCoordinator alloc]
           initWithBaseNavigationController:_navigationController
                                    browser:self.browser
                                   delegate:self
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/two_screens_signin_coordinator_unittest.mm b/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/two_screens_signin_coordinator_unittest.mm
index ebe8d5d..4be443c 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/two_screens_signin_coordinator_unittest.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/signin/two_screens_signin/two_screens_signin_coordinator_unittest.mm
@@ -11,9 +11,9 @@
 #import "base/test/ios/wait_util.h"
 #import "base/test/metrics/histogram_tester.h"
 #import "base/test/metrics/user_action_tester.h"
+#import "ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/ui/fullscreen_signin_screen_view_controller.h"
 #import "ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_view_controller.h"
 #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_constants.h"
-#import "ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_view_controller.h"
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
 #import "ios/chrome/browser/shared/model/browser/test/test_browser.h"
 #import "ios/chrome/browser/shared/model/profile/test/test_profile_ios.h"
@@ -151,8 +151,8 @@
   StartTwoScreensSigninCoordinator(SigninCoordinatorResultInterrupted, nil);
   // Expect the signin screen to be presented.
   EXPECT_NE(PresentedViewController(), nil);
-  EXPECT_TRUE(
-      [TopViewController() isKindOfClass:[SigninScreenViewController class]]);
+  EXPECT_TRUE([TopViewController()
+      isKindOfClass:[FullscreenSigninScreenViewController class]]);
   SigninFakeIdentity();
 
   NextScreen();
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin_promo_view_mediator.mm b/ios/chrome/browser/authentication/ui_bundled/signin_promo_view_mediator.mm
index dbd7bae..9d039a3 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signin_promo_view_mediator.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/signin_promo_view_mediator.mm
@@ -132,6 +132,7 @@
     case signin_metrics::AccessPoint::kHistoryPage:
     case signin_metrics::AccessPoint::kCollaborationJoinTabGroup:
     case signin_metrics::AccessPoint::kHistorySyncOptinExpansionPill:
+    case signin_metrics::AccessPoint::kWidget:
       return false;
   }
 }
@@ -225,6 +226,7 @@
     case signin_metrics::AccessPoint::kHistoryPage:
     case signin_metrics::AccessPoint::kCollaborationJoinTabGroup:
     case signin_metrics::AccessPoint::kHistorySyncOptinExpansionPill:
+    case signin_metrics::AccessPoint::kWidget:
       NOTREACHED() << "Unexpected value for access point "
                    << static_cast<int>(access_point);
   }
@@ -319,6 +321,7 @@
     case signin_metrics::AccessPoint::kHistoryPage:
     case signin_metrics::AccessPoint::kCollaborationJoinTabGroup:
     case signin_metrics::AccessPoint::kHistorySyncOptinExpansionPill:
+    case signin_metrics::AccessPoint::kWidget:
       NOTREACHED() << "Unexpected value for access point "
                    << static_cast<int>(access_point);
   }
@@ -402,6 +405,7 @@
     case signin_metrics::AccessPoint::kHistoryPage:
     case signin_metrics::AccessPoint::kCollaborationJoinTabGroup:
     case signin_metrics::AccessPoint::kHistorySyncOptinExpansionPill:
+    case signin_metrics::AccessPoint::kWidget:
       return nullptr;
   }
 }
@@ -484,6 +488,7 @@
     case signin_metrics::AccessPoint::kHistoryPage:
     case signin_metrics::AccessPoint::kCollaborationJoinTabGroup:
     case signin_metrics::AccessPoint::kHistorySyncOptinExpansionPill:
+    case signin_metrics::AccessPoint::kWidget:
       return nullptr;
   }
 }
@@ -725,7 +730,7 @@
       // by the mediator. We should not have no identity. This can be reproduced
       // with EGtests with bots. The identity notification might not have
       // received yet. Let's update the promo identity.
-      [self handleIdentityListChanged];
+      [self onAccountsOnDeviceChanged];
     }
     DCHECK(self.displayedIdentity)
         << base::SysNSStringToUTF8([self description]);
@@ -1029,7 +1034,9 @@
   return self.dataTypeToWaitForInitialSync != syncer::DataType::UNSPECIFIED;
 }
 
-- (void)handleIdentityListChanged {
+#pragma mark -  IdentityManagerObserver
+
+- (void)onAccountsOnDeviceChanged {
   id<SystemIdentity> currentIdentity = self.displayedIdentity;
   id<SystemIdentity> displayedIdentity = GetDisplayedIdentity(
       _authService, _identityManager, _accountManagerService);
@@ -1041,18 +1048,8 @@
   }
 }
 
-- (void)handleIdentityUpdated {
-  [self sendConsumerNotificationWithIdentityChanged:NO];
-}
-
-#pragma mark -  IdentityManagerObserver
-
-- (void)onAccountsOnDeviceChanged {
-  [self handleIdentityListChanged];
-}
-
 - (void)onExtendedAccountInfoUpdated:(const AccountInfo&)info {
-  [self handleIdentityUpdated];
+  [self sendConsumerNotificationWithIdentityChanged:NO];
 }
 
 #pragma mark - SigninPromoViewDelegate
diff --git a/ios/chrome/browser/authentication/ui_bundled/signout_action_sheet/signout_action_sheet_coordinator.mm b/ios/chrome/browser/authentication/ui_bundled/signout_action_sheet/signout_action_sheet_coordinator.mm
index 33940b90..9502cbf 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signout_action_sheet/signout_action_sheet_coordinator.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/signout_action_sheet/signout_action_sheet_coordinator.mm
@@ -39,6 +39,62 @@
 
 using signin_metrics::SignoutDataLossAlertReason;
 
+// Wrapper around the SignoutActionSheetCoordinator completion taking care
+// of properly handling cancellation and profile change.
+@interface SignoutActionSheetCompletionWrapper : NSObject
+
+- (instancetype)init NS_UNAVAILABLE;
+- (instancetype)initWithCompletion:(signin_ui::SignoutCompletionCallback)block
+    NS_DESIGNATED_INITIALIZER;
+
+// Record whether a change of profile is expected (if true, then calls to
+// -coordinatorStopped are ignored).
+@property(nonatomic, assign) BOOL willChangeProfile;
+
+// Called when the sign-out operation completes, invoke the completion
+// with success unless the coordinator was stopped and the sign-out
+// operation did not change the profile.
+- (void)signoutCompleteForScene:(SceneState*)sceneState;
+
+// Called when the coordinator is stopped. Will invoke the completion
+// with failure unless the sign-out operation requires changing the
+// profile (as this will destroy the UI and thus stop the coordinator).
+- (void)coordinatorStoppedForScene:(SceneState*)sceneState;
+
+@end
+
+@implementation SignoutActionSheetCompletionWrapper {
+  // Completion callback.
+  signin_ui::SignoutCompletionCallback _completion;
+}
+
+- (instancetype)initWithCompletion:(signin_ui::SignoutCompletionCallback)block {
+  if ((self = [super init])) {
+    _completion = block;
+    DCHECK(_completion);
+  }
+  return self;
+}
+
+- (void)signoutCompleteForScene:(SceneState*)sceneState {
+  [self invokeCompletion:YES sceneState:sceneState];
+}
+
+- (void)coordinatorStoppedForScene:(SceneState*)sceneState {
+  if (!_willChangeProfile) {
+    [self invokeCompletion:NO sceneState:sceneState];
+  }
+}
+
+- (void)invokeCompletion:(BOOL)success sceneState:(SceneState*)sceneState {
+  if (signin_ui::SignoutCompletionCallback completion = _completion) {
+    _completion = nil;
+    completion(success, sceneState);
+  }
+}
+
+@end
+
 @interface SignoutActionSheetCoordinator () {
   // YES if the coordinator asked its delegate to block the user interaction.
   // This boolean makes sure the user interaction is allowed when `stop` is
@@ -56,8 +112,8 @@
   BOOL _forceSnackbarOverToolbar;
   // Signin and syncing state.
   SignedInUserState _signedInUserState;
-  // Completion callback.
-  signin_ui::SignoutCompletionCallback _signoutCompletion;
+  // Wrapper around the completion callback.
+  SignoutActionSheetCompletionWrapper* _completionWrapper;
 }
 
 // Service for managing identity authentication.
@@ -86,7 +142,8 @@
     _view = view;
     _signoutSourceMetric = source;
     _forceSnackbarOverToolbar = forceSnackbarOverToolbar;
-    _signoutCompletion = block;
+    _completionWrapper =
+        [[SignoutActionSheetCompletionWrapper alloc] initWithCompletion:block];
   }
   return self;
 }
@@ -94,7 +151,6 @@
 #pragma mark - ChromeCoordinator
 
 - (void)start {
-  DCHECK(_signoutCompletion);
   DCHECK(self.authenticationService->HasPrimaryIdentity(
       signin::ConsentLevel::kSignin));
   PrefService* profilePrefService = self.profile->GetPrefs();
@@ -113,8 +169,9 @@
     [self allowUserInteraction];
   }
   [self dismissActionSheetCoordinator];
+  [_completionWrapper coordinatorStoppedForScene:nil];
+  _completionWrapper = nil;
   _stopped = YES;
-  [self callCompletionBlock:NO];
 }
 
 - (void)dealloc {
@@ -166,6 +223,13 @@
   [self.delegate signoutActionSheetCoordinatorAllowUserInteraction:self];
 }
 
+// Wraps -allowUserInteraction and does nothing if -stop has been called.
+- (void)allowUserInteractionIfNotStopped {
+  if (!_stopped) {
+    [self allowUserInteraction];
+  }
+}
+
 // Fetches for unsynced data, and the sign-out continued after (with unsynced
 // data dialog if needed, and then sign-out).
 - (void)checkForUnsyncedDataAndSignOut {
@@ -223,7 +287,13 @@
     [self handleSignOut];
     [self dismissActionSheetCoordinator];
   } else {
-    [self callCompletionBlock:NO];
+    SceneState* sceneState = nil;
+    if (Browser* browser = self.browser) {
+      sceneState = browser->GetSceneState();
+    }
+    [_completionWrapper coordinatorStoppedForScene:sceneState];
+    _completionWrapper = nil;
+
     [self dismissActionSheetCoordinator];
   }
 }
@@ -231,36 +301,40 @@
 // Signs the user out of the primary account and clears the data from their
 // device if account is managed.
 - (void)handleSignOut {
-  if (!self.browser) {
+  Browser* browser = self.browser;
+  if (!browser) {
     return;
   }
 
   if (!self.authenticationService->HasPrimaryIdentity(
           signin::ConsentLevel::kSignin)) {
-    [self callCompletionBlock:YES];
+    SceneState* sceneState = browser->GetSceneState();
+    [_completionWrapper signoutCompleteForScene:sceneState];
+    _completionWrapper = nil;
     return;
   }
+
   [self preventUserInteraction];
   // Prepare the signout snackbar before account switching.
   // The snackbar message might be nil if the snackbar is not needed.
   MDCSnackbarMessage* snackbarMessage = [self signoutSnackbarMessage];
 
-  __weak __typeof(self) weakSelf = self;
-  signin::MultiProfileSignOut(self.browser, _signoutSourceMetric,
-                              _forceSnackbarOverToolbar, snackbarMessage, ^{
-                                [weakSelf signOutDidFinish];
-                              });
-}
+  // Strongly retain completionWrapper in the blocks to ensure that the
+  // completion callback will be invoked even if the UI is destroyed
+  // (e.g. when the sign-out operation needs to change profile).
+  SignoutActionSheetCompletionWrapper* completionWrapper = _completionWrapper;
 
-// Called when the sign-out is done.
-- (void)signOutDidFinish {
-  if (_stopped) {
-    // The coordinator has been stopped. The UI has been unblocked, and the
-    // owner doesn't expect the completion call anymore.
-    return;
-  }
-  [self allowUserInteraction];
-  [self callCompletionBlock:YES];
+  __weak __typeof(self) weakSelf = self;
+  signin::ProfileSignoutRequest(_signoutSourceMetric)
+      .SetSnackbarMessage(snackbarMessage, _forceSnackbarOverToolbar)
+      .SetPrepareCallback(base::BindOnce(^(bool will_change_profile) {
+        completionWrapper.willChangeProfile = will_change_profile;
+      }))
+      .SetCompletionCallback(base::BindOnce(^(SceneState* scene_state) {
+        [weakSelf allowUserInteractionIfNotStopped];
+        [completionWrapper signoutCompleteForScene:scene_state];
+      }))
+      .Run(browser);
 }
 
 // Returns snackbar if needed.
@@ -283,15 +357,4 @@
   return message;
 }
 
-// Calls `self.signoutCompletion` if available, and sets it to `null` before the
-// call.
-- (void)callCompletionBlock:(BOOL)signedOut {
-  if (!_signoutCompletion) {
-    return;
-  }
-  signin_ui::SignoutCompletionCallback completion = _signoutCompletion;
-  _signoutCompletion = nil;
-  completion(signedOut);
-}
-
 @end
diff --git a/ios/chrome/browser/authentication/ui_bundled/signout_action_sheet/signout_action_sheet_coordinator_unittest.mm b/ios/chrome/browser/authentication/ui_bundled/signout_action_sheet/signout_action_sheet_coordinator_unittest.mm
index d283d77..da0084e 100644
--- a/ios/chrome/browser/authentication/ui_bundled/signout_action_sheet/signout_action_sheet_coordinator_unittest.mm
+++ b/ios/chrome/browser/authentication/ui_bundled/signout_action_sheet/signout_action_sheet_coordinator_unittest.mm
@@ -125,7 +125,7 @@
                               view:view_controller_.view
           forceSnackbarOverToolbar:NO
                         withSource:metricSignOut
-                        completion:^(BOOL success) {
+                        completion:^(BOOL success, SceneState* scene_state) {
                           completion_callback_.Run(success);
                         }];
     return signout_coordinator_;
diff --git a/ios/chrome/browser/autofill/model/bottom_sheet/save_card_bottom_sheet_model.h b/ios/chrome/browser/autofill/model/bottom_sheet/save_card_bottom_sheet_model.h
index 79c27e4..eb677ba 100644
--- a/ios/chrome/browser/autofill/model/bottom_sheet/save_card_bottom_sheet_model.h
+++ b/ios/chrome/browser/autofill/model/bottom_sheet/save_card_bottom_sheet_model.h
@@ -36,6 +36,22 @@
   // Calls `AutofillSaveCardDelegate` to handle the dismiss event.
   void OnDismissed();
 
+  // Logo to be displayed above the title in the bottomsheet.
+  inline int logo_icon_id() const { return ui_info_.logo_icon_id; }
+
+  // Accessibility description for the logo.
+  inline const std::u16string& logo_icon_description() const {
+    return ui_info_.logo_icon_description;
+  }
+
+  // Title displayed in the bottomsheet.
+  inline const std::u16string& title() const { return ui_info_.title_text; }
+
+  // Explanatory text displayed below the title in the bottomsheet.
+  inline const std::u16string& subtitle() const {
+    return ui_info_.description_text;
+  }
+
   base::WeakPtr<SaveCardBottomSheetModel> GetWeakPtr() {
     return weak_ptr_factory_.GetWeakPtr();
   }
diff --git a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/BUILD.gn b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/BUILD.gn
index 033cb6b..eff4386 100644
--- a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/BUILD.gn
+++ b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/BUILD.gn
@@ -6,6 +6,7 @@
   testonly = true
   deps = [
     ":bottom_sheet_unit_tests",
+    ":save_card_bottom_sheet_mediator_unittest",
     ":virtual_card_enrollment_bottom_sheet_coordinator_unittest",
     ":virtual_card_enrollment_bottom_sheet_mediator_unittest",
   ]
@@ -194,12 +195,19 @@
   frameworks = [ "UIKit.framework" ]
 }
 
+source_set("save_card_bottom_sheet_consumer") {
+  sources = [ "save_card_bottom_sheet_consumer.h" ]
+  deps = []
+  frameworks = [ "UIKit.framework" ]
+}
+
 source_set("save_card_bottom_sheet_view_controller") {
   sources = [
     "save_card_bottom_sheet_view_controller.h",
     "save_card_bottom_sheet_view_controller.mm",
   ]
   deps = [
+    ":save_card_bottom_sheet_consumer",
     "//build:branding_buildflags",
     "//ios/chrome/browser/shared/ui/bottom_sheet:table_view_bottom_sheet_view_controller",
     "//ios/chrome/browser/shared/ui/symbols",
@@ -213,12 +221,28 @@
     "save_card_bottom_sheet_mediator.mm",
   ]
   deps = [
+    ":save_card_bottom_sheet_consumer",
     "//base",
     "//ios/chrome/browser/autofill/model/bottom_sheet:save_card_bottom_sheet_model",
+    "//ios/chrome/browser/shared/ui/util",
   ]
   frameworks = [ "UIKit.framework" ]
 }
 
+source_set("save_card_bottom_sheet_mediator_unittest") {
+  testonly = true
+  sources = [ "save_card_bottom_sheet_mediator_unittest.mm" ]
+  deps = [
+    ":save_card_bottom_sheet_consumer",
+    ":save_card_bottom_sheet_mediator",
+    "//base",
+    "//components/autofill/core/browser",
+    "//components/resources:components_scaled_resources_grit",
+    "//ios/chrome/browser/autofill/model/bottom_sheet:save_card_bottom_sheet_model",
+    "//testing/gtest",
+  ]
+}
+
 # Virtual Card Enrollment Bottom Sheet related classes are below:
 
 source_set("virtual_card_enrollment_bottom_sheet_coordinator") {
diff --git a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/payments_suggestion_bottom_sheet_egtest.mm b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/payments_suggestion_bottom_sheet_egtest.mm
index 96618c60..90b3c859 100644
--- a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/payments_suggestion_bottom_sheet_egtest.mm
+++ b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/payments_suggestion_bottom_sheet_egtest.mm
@@ -43,6 +43,24 @@
 const char kFormCardExpirationMonth[] = "CCExpiresMonth";
 const char kFormCardExpirationYear[] = "CCExpiresYear";
 
+// Matcher for the credit card suggestion chip.
+id<GREYMatcher> KeyboardAccessoryCreditCardSuggestionChip() {
+  // Represents the masked server card that was saved.
+  autofill::CreditCard serverCard = autofill::test::GetMaskedServerCard();
+
+  NSString* username = base::SysUTF16ToNSString(serverCard.GetInfo(
+      autofill::CREDIT_CARD_NAME_FULL, l10n_util::GetLocaleOverride()));
+  if ([ChromeEarlGrey isIPadIdiom]) {
+    // On iPad, the suggestion text is an attributed string containing the
+    // obfuscated credit card on the 2nd line.
+    NSString* network = base::SysUTF16ToNSString(
+        serverCard.NetworkAndLastFourDigits(/*obfuscation_length=*/2));
+    return grey_text([NSString stringWithFormat:@"%@\n%@", username, network]);
+  } else {
+    return grey_text(username);
+  }
+}
+
 }  // namespace
 
 @interface PaymentsSuggestionBottomSheetEGTest : ChromeTestCase
@@ -86,6 +104,7 @@
 
 - (AppLaunchConfiguration)appConfigurationForTestCase {
   AppLaunchConfiguration config;
+  config.features_enabled.push_back(kIOSKeyboardAccessoryUpgradeForIPad);
   if ([self isRunningTest:@selector
             (testOpenPaymentsBottomSheetShowDetailsEditNickname)] ||
       [self
@@ -804,13 +823,8 @@
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:
                       manual_fill::FormSuggestionViewMatcher()];
 
-  // Represents the masked server card that was saved.
-  autofill::CreditCard serverCard = autofill::test::GetMaskedServerCard();
-
   // Tap on the card chip in the KA.
-  id<GREYMatcher> serverCardChip =
-      grey_text(base::SysUTF16ToNSString(serverCard.GetInfo(
-          autofill::CREDIT_CARD_NAME_FULL, l10n_util::GetLocaleOverride())));
+  id<GREYMatcher> serverCardChip = KeyboardAccessoryCreditCardSuggestionChip();
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:serverCardChip];
   [[EarlGrey selectElementWithMatcher:serverCardChip] performAction:grey_tap()];
 
@@ -827,7 +841,7 @@
   base::test::ios::SpinRunLoopWithMinDelay(base::Milliseconds(500));
 
   // Verify that the sheet didn't pop up after filling from the KA on the
-  // autofucsed field. Use the continue button of the sheet as a proxy.
+  // autofocused field. Use the continue button of the sheet as a proxy.
   [[EarlGrey selectElementWithMatcher:ContinueButton()]
       assertWithMatcher:grey_nil()];
 }
@@ -864,13 +878,8 @@
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:
                       manual_fill::FormSuggestionViewMatcher()];
 
-  // Represents the masked server card that was saved.
-  autofill::CreditCard serverCard = autofill::test::GetMaskedServerCard();
-
   // Tap on the card chip in the KA.
-  id<GREYMatcher> serverCardChip =
-      grey_text(base::SysUTF16ToNSString(serverCard.GetInfo(
-          autofill::CREDIT_CARD_NAME_FULL, l10n_util::GetLocaleOverride())));
+  id<GREYMatcher> serverCardChip = KeyboardAccessoryCreditCardSuggestionChip();
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:serverCardChip];
   [[EarlGrey selectElementWithMatcher:serverCardChip] performAction:grey_tap()];
 
diff --git a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_consumer.h b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_consumer.h
new file mode 100644
index 0000000..339ca2a
--- /dev/null
+++ b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_consumer.h
@@ -0,0 +1,31 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_AUTOFILL_UI_BUNDLED_BOTTOM_SHEET_SAVE_CARD_BOTTOM_SHEET_CONSUMER_H_
+#define IOS_CHROME_BROWSER_AUTOFILL_UI_BUNDLED_BOTTOM_SHEET_SAVE_CARD_BOTTOM_SHEET_CONSUMER_H_
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+// Consumer interface for updating the save card bottomsheet UI.
+// TODO(crbug.com/406311602): Declare methods to set action button texts and to
+// show loading and confirmation.
+@protocol SaveCardBottomSheetConsumer <NSObject>
+
+// Sets the image to be displayed above the title of the bottomsheet.
+- (void)setAboveTitleImage:(UIImage*)logoImage;
+
+// Sets the accessibility description of the image above the title of the
+// bottomsheet.
+- (void)setAboveTitleImageDescription:(NSString*)description;
+
+// Sets the main title of the bottomsheet.
+- (void)setTitle:(NSString*)title;
+
+// Sets the explanatory text below the main title of the bottomsheet.
+- (void)setSubtitle:(NSString*)subtitle;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_AUTOFILL_UI_BUNDLED_BOTTOM_SHEET_SAVE_CARD_BOTTOM_SHEET_CONSUMER_H_
diff --git a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_coordinator.mm b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_coordinator.mm
index e0df8cd..27685a29 100644
--- a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_coordinator.mm
+++ b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_coordinator.mm
@@ -46,6 +46,7 @@
   _mediator = [[SaveCardBottomSheetMediator alloc]
       initWithUIModel:std::move(_saveCardBottomSheetModel)];
   _viewController = [[SaveCardBottomSheetViewController alloc] init];
+  _mediator.consumer = _viewController;
   [self.baseViewController presentViewController:_viewController
                                         animated:YES
                                       completion:nil];
@@ -55,6 +56,7 @@
   [_viewController dismissViewControllerAnimated:YES completion:nil];
   _viewController = nil;
   [_mediator disconnect];
+  _mediator.consumer = nil;
   _mediator = nil;
 }
 
diff --git a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_mediator.h b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_mediator.h
index c3e19fd..bd1d737 100644
--- a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_mediator.h
+++ b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_mediator.h
@@ -10,11 +10,15 @@
 #import <memory>
 
 #import "ios/chrome/browser/autofill/model/bottom_sheet/save_card_bottom_sheet_model.h"
+#import "ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_consumer.h"
 
 // This mediator tracks SaveCardBottomSheetModel to update the view. It also
 // receives user actions to be communicated to the model.
 @interface SaveCardBottomSheetMediator : NSObject
 
+// Consumer interface for updating the save card bottomsheet.
+@property(nonatomic, weak) id<SaveCardBottomSheetConsumer> consumer;
+
 // Initialize this mediator with the save card bottomsheet model.
 - (instancetype)initWithUIModel:
     (std::unique_ptr<autofill::SaveCardBottomSheetModel>)model;
diff --git a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_mediator.mm b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_mediator.mm
index a7dd0a3e..ae69398 100644
--- a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_mediator.mm
+++ b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_mediator.mm
@@ -7,6 +7,9 @@
 #import <memory>
 #import <utility>
 
+#import "base/strings/sys_string_conversions.h"
+#import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
+
 // TODO(crbug.com/402511942): Implement SaveCardBottomSheetMediator.
 @implementation SaveCardBottomSheetMediator {
   // The model layer component providing resources and callbacks for
@@ -29,4 +32,19 @@
   // TODO:(crbug.com/402511942): Stop observing the model
 }
 
+- (void)setConsumer:(id<SaveCardBottomSheetConsumer>)consumer {
+  _consumer = consumer;
+  [self.consumer
+      setAboveTitleImage:NativeImage(
+                             _saveCardBottomSheetModel->logo_icon_id())];
+  [self.consumer
+      setAboveTitleImageDescription:base::SysUTF16ToNSString(
+                                        _saveCardBottomSheetModel
+                                            ->logo_icon_description())];
+  [self.consumer
+      setTitle:base::SysUTF16ToNSString(_saveCardBottomSheetModel->title())];
+  [self.consumer setSubtitle:base::SysUTF16ToNSString(
+                                 _saveCardBottomSheetModel->subtitle())];
+}
+
 @end
diff --git a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_mediator_unittest.mm b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_mediator_unittest.mm
new file mode 100644
index 0000000..6ee4c4b
--- /dev/null
+++ b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_mediator_unittest.mm
@@ -0,0 +1,71 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_mediator.h"
+
+#import <Foundation/Foundation.h>
+
+#import <string>
+
+#import "base/strings/sys_string_conversions.h"
+#import "components/autofill/core/browser/payments/autofill_save_card_ui_info.h"
+#import "components/autofill/core/browser/payments/payments_autofill_client.h"
+#import "components/grit/components_scaled_resources.h"
+#import "ios/chrome/browser/autofill/model/bottom_sheet/save_card_bottom_sheet_model.h"
+#import "ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_consumer.h"
+#import "testing/gtest_mac.h"
+#import "testing/platform_test.h"
+
+@interface FakeSaveCardBottomSheetConsumer
+    : NSObject <SaveCardBottomSheetConsumer>
+
+@property(nonatomic, strong) UIImage* aboveTitleImage;
+@property(nonatomic, copy) NSString* aboveTitleImageDescription;
+@property(nonatomic, copy) NSString* title;
+@property(nonatomic, copy) NSString* subtitle;
+
+@end
+
+@implementation FakeSaveCardBottomSheetConsumer
+
+@end
+
+class SaveCardBottomSheetMediatorTest : public PlatformTest {
+ public:
+  SaveCardBottomSheetMediatorTest() {
+    autofill::AutofillSaveCardUiInfo ui_info =
+        autofill::AutofillSaveCardUiInfo();
+    ui_info.title_text = std::u16string(u"Title");
+    ui_info.description_text = std::u16string(u"Description Text");
+    ui_info.logo_icon_id = IDR_AUTOFILL_GOOGLE_PAY;
+    ui_info.logo_icon_description = std::u16string(u"Logo description");
+    std::unique_ptr<autofill::SaveCardBottomSheetModel> model =
+        std::make_unique<autofill::SaveCardBottomSheetModel>(
+            std::move(ui_info),
+            std::make_unique<autofill::AutofillSaveCardDelegate>(
+                static_cast<autofill::payments::PaymentsAutofillClient::
+                                UploadSaveCardPromptCallback>(
+                    base::DoNothing()),
+                autofill::payments::PaymentsAutofillClient::
+                    SaveCreditCardOptions{}));
+    model_ = model->GetWeakPtr();
+    mediator_ =
+        [[SaveCardBottomSheetMediator alloc] initWithUIModel:std::move(model)];
+  }
+
+ protected:
+  base::WeakPtr<autofill::SaveCardBottomSheetModel> model_;
+  SaveCardBottomSheetMediator* mediator_ = nil;
+};
+
+TEST_F(SaveCardBottomSheetMediatorTest, SetConsumer) {
+  FakeSaveCardBottomSheetConsumer* consumer =
+      [[FakeSaveCardBottomSheetConsumer alloc] init];
+  mediator_.consumer = consumer;
+  EXPECT_TRUE(consumer.aboveTitleImage);
+  EXPECT_NSEQ(base::SysUTF16ToNSString(model_->logo_icon_description()),
+              consumer.aboveTitleImageDescription);
+  EXPECT_NSEQ(base::SysUTF16ToNSString(model_->title()), consumer.title);
+  EXPECT_NSEQ(base::SysUTF16ToNSString(model_->subtitle()), consumer.subtitle);
+}
diff --git a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_view_controller.h b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_view_controller.h
index 2a06847..ae02f64a 100644
--- a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_view_controller.h
+++ b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_view_controller.h
@@ -5,11 +5,12 @@
 #ifndef IOS_CHROME_BROWSER_AUTOFILL_UI_BUNDLED_BOTTOM_SHEET_SAVE_CARD_BOTTOM_SHEET_VIEW_CONTROLLER_H_
 #define IOS_CHROME_BROWSER_AUTOFILL_UI_BUNDLED_BOTTOM_SHEET_SAVE_CARD_BOTTOM_SHEET_VIEW_CONTROLLER_H_
 
+#import "ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_consumer.h"
 #import "ios/chrome/browser/shared/ui/bottom_sheet/table_view_bottom_sheet_view_controller.h"
 
 // The view controller to configure save card bottomsheet UI.
 @interface SaveCardBottomSheetViewController
-    : TableViewBottomSheetViewController
+    : TableViewBottomSheetViewController <SaveCardBottomSheetConsumer>
 
 @end
 
diff --git a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_view_controller.mm b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_view_controller.mm
index 59d6e2f9..64d9de0 100644
--- a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_view_controller.mm
+++ b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_view_controller.mm
@@ -4,7 +4,63 @@
 
 #import "ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_view_controller.h"
 
+#import "build/branding_buildflags.h"
+#import "ios/chrome/browser/autofill/ui_bundled/bottom_sheet/save_card_bottom_sheet_consumer.h"
+#import "ios/chrome/browser/shared/ui/symbols/symbols.h"
+
+namespace {
+
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+// Height of the Google Pay logo used as the image above the title of the
+// bottomsheet.
+CGFloat const kGooglePayLogoHeight = 32;
+#endif
+
+}  // namespace
+
 // TODO(crbug.com/391366699): Implement SaveCardBottomSheetViewController.
-@implementation SaveCardBottomSheetViewController
+@implementation SaveCardBottomSheetViewController {
+  // Image to be displayed above the title of the bottomsheet.
+  UIImage* _aboveTitleImage;
+}
+
+#pragma mark - SaveCardBottomSheetConsumer
+
+- (void)setAboveTitleImage:(UIImage*)logoImage {
+  _aboveTitleImage = logoImage;
+}
+
+- (void)setAboveTitleImageDescription:(NSString*)description {
+  self.imageViewAccessibilityLabel = description;
+}
+
+- (void)setTitle:(NSString*)title {
+  self.titleString = title;
+}
+
+- (void)setSubtitle:(NSString*)subtitle {
+  self.subtitleString = subtitle;
+}
+
+#pragma mark - UIViewController
+
+- (void)viewDidLoad {
+  self.image = [self aboveTitleImage];
+  [super viewDidLoad];
+}
+
+#pragma mark - Private
+
+// Returns the image to be used above the title of the bottomsheet.
+- (UIImage*)aboveTitleImage {
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+  // iOS-specific symbol is used to get an optimized image with better
+  // resolution.
+  return MakeSymbolMulticolor(
+      CustomSymbolWithPointSize(kGooglePaySymbol, kGooglePayLogoHeight));
+#else
+  return _aboveTitleImage;
+#endif
+}
 
 @end
diff --git a/ios/chrome/browser/autofill/ui_bundled/form_input_accessory/BUILD.gn b/ios/chrome/browser/autofill/ui_bundled/form_input_accessory/BUILD.gn
index 7566731a..41030d17 100644
--- a/ios/chrome/browser/autofill/ui_bundled/form_input_accessory/BUILD.gn
+++ b/ios/chrome/browser/autofill/ui_bundled/form_input_accessory/BUILD.gn
@@ -123,6 +123,7 @@
     ":eg_test_support+eg2",
     "//components/autofill/core/browser:test_support",
     "//components/autofill/ios/common",
+    "//components/password_manager/core/browser",
     "//components/password_manager/core/browser/features:password_features",
     "//components/password_manager/core/common:features",
     "//components/sync/service",
diff --git a/ios/chrome/browser/autofill/ui_bundled/form_input_accessory/form_input_accessory_egtest.mm b/ios/chrome/browser/autofill/ui_bundled/form_input_accessory/form_input_accessory_egtest.mm
index 9b53c6c..4062422d 100644
--- a/ios/chrome/browser/autofill/ui_bundled/form_input_accessory/form_input_accessory_egtest.mm
+++ b/ios/chrome/browser/autofill/ui_bundled/form_input_accessory/form_input_accessory_egtest.mm
@@ -14,6 +14,7 @@
 #import "components/autofill/core/common/autofill_features.h"
 #import "components/autofill/ios/common/features.h"
 #import "components/password_manager/core/browser/features/password_features.h"
+#import "components/password_manager/core/browser/password_ui_utils.h"
 #import "components/password_manager/core/common/password_manager_features.h"
 #import "components/sync/service/sync_prefs.h"
 #import "ios/chrome/browser/autofill/ui_bundled/autofill_app_interface.h"
@@ -59,9 +60,19 @@
 constexpr NSString* kExampleUsername = @"user";
 
 // Matcher for the autofill password suggestion chip in the keyboard accessory.
-id<GREYMatcher> KeyboardAccessoryPasswordSuggestion() {
+id<GREYMatcher> KeyboardAccessoryPasswordSuggestion(
+    net::EmbeddedTestServer* test_server) {
   if ([AutofillAppInterface isKeyboardAccessoryUpgradeEnabled]) {
-    return grey_allOf(grey_text(kExampleUsername),
+    NSString* chip_text = kExampleUsername;
+    if ([ChromeEarlGrey isIPadIdiom]) {
+      // On iPad, the suggestion text is an attributed string containing the
+      // signon realm on the 2nd line.
+      NSString* realm =
+          base::SysUTF8ToNSString(password_manager::GetShownOrigin(
+              url::Origin::Create(test_server->base_url())));
+      chip_text = [NSString stringWithFormat:@"%@\n%@", chip_text, realm];
+    }
+    return grey_allOf(grey_text(chip_text),
                       grey_ancestor(grey_accessibilityID(
                           kFormInputAccessoryViewAccessibilityID)),
                       nil);
@@ -71,6 +82,42 @@
       [NSString stringWithFormat:@"%@ ••••••••", kExampleUsername]);
 }
 
+// Matcher for the credit card suggestion chip.
+id<GREYMatcher> KeyboardAccessoryCreditCardSuggestion() {
+  autofill::CreditCard card = autofill::test::GetCreditCard();
+
+  NSString* username = base::SysUTF16ToNSString(card.GetInfo(
+      autofill::CREDIT_CARD_NAME_FULL, l10n_util::GetLocaleOverride()));
+  if ([AutofillAppInterface isKeyboardAccessoryUpgradeEnabled] &&
+      [ChromeEarlGrey isIPadIdiom]) {
+    // On iPad, the suggestion text is an attributed string containing the
+    // obfuscated credit card on the 2nd line.
+    NSString* network = base::SysUTF16ToNSString(
+        card.NetworkAndLastFourDigits(/*obfuscation_length=*/2));
+    return grey_text([NSString stringWithFormat:@"%@\n%@", username, network]);
+  } else {
+    return grey_text(username);
+  }
+}
+
+// Matcher for the address suggestion chip.
+id<GREYMatcher> KeyboardAccessoryAddressSuggestion() {
+  autofill::AutofillProfile profile = autofill::test::GetFullProfile();
+  NSString* ZIP_code =
+      base::SysUTF16ToNSString(profile.GetRawInfo(autofill::ADDRESS_HOME_ZIP));
+  if ([AutofillAppInterface isKeyboardAccessoryUpgradeEnabled] &&
+      [ChromeEarlGrey isIPadIdiom]) {
+    // On iPad, the suggestion text is an attributed string containing the
+    // street address on the 2nd line.
+    NSString* street_address = base::SysUTF16ToNSString(
+        profile.GetRawInfo(autofill::ADDRESS_HOME_LINE1));
+    return grey_text(
+        [NSString stringWithFormat:@"%@\n%@", ZIP_code, street_address]);
+  } else {
+    return grey_text(ZIP_code);
+  }
+}
+
 // Verifies that the number of accepted address suggestions recorded for the
 // given `suggestion_index` is as expected.
 void CheckAddressAutofillSuggestionAcceptedIndexMetricsCount(
@@ -190,11 +237,7 @@
   AppLaunchConfiguration config;
   config.features_disabled.push_back(
       autofill::features::test::kAutofillServerCommunication);
-  if ([self isRunningTest:@selector(testOpenExpandedManualFillView)] ||
-      [self isRunningTest:@selector
-            (testManualFillButtonTitleIsHiddenInCompactMode)]) {
-    config.features_enabled.push_back(kIOSKeyboardAccessoryUpgradeForIPad);
-  }
+  config.features_enabled.push_back(kIOSKeyboardAccessoryUpgradeForIPad);
   if ([self isRunningTest:@selector(testFillXframeCreditCardForm)] ||
       [self isRunningTest:@selector(testFillXframeCreditCardFormThrottled)]) {
     config.features_enabled.push_back(
@@ -282,7 +325,7 @@
 // Verifies that the field with the `id_attr` attribute in the frame with the
 // `frameId` attribute is filled with `value`. `id_attr` correspond to the HTML
 // element id attribute. Verifies the main frame when `frameId` is empty.
-// Verfies child frames of the main frame when `frameId` is not empty.
+// Verifies child frames of the main frame when `frameId` is not empty.
 - (void)verifyFieldWithIdHasBeenFilled:(std::string)id_attr
                               iframeId:(std::string)frameId
                                  value:(NSString*)value {
@@ -392,7 +435,8 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()]
       performAction:chrome_test_util::TapWebElementWithId(kFormPassword)];
 
-  id<GREYMatcher> user_chip = KeyboardAccessoryPasswordSuggestion();
+  id<GREYMatcher> user_chip =
+      KeyboardAccessoryPasswordSuggestion(self.testServer);
 
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:user_chip];
 
@@ -430,7 +474,8 @@
       performAction:chrome_test_util::TapWebElementWithId(
                         kSigninUffFormUsername)];
 
-  id<GREYMatcher> user_chip = KeyboardAccessoryPasswordSuggestion();
+  id<GREYMatcher> user_chip =
+      KeyboardAccessoryPasswordSuggestion(self.testServer);
 
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:user_chip];
 
@@ -463,7 +508,8 @@
       performAction:chrome_test_util::TapWebElementWithId(
                         kSigninUffFormPassword)];
 
-  id<GREYMatcher> user_chip = KeyboardAccessoryPasswordSuggestion();
+  id<GREYMatcher> user_chip =
+      KeyboardAccessoryPasswordSuggestion(self.testServer);
 
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:user_chip];
 
@@ -499,8 +545,6 @@
   [[EarlGrey selectElementWithMatcher:useKeyboardButton]
       performAction:grey_tap()];
 
-  autofill::CreditCard card = autofill::test::GetCreditCard();
-
   // Wait for the keyboard accessory to appear.
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:
                       manual_fill::FormSuggestionViewMatcher()];
@@ -510,12 +554,11 @@
   [[EarlGrey selectElementWithMatcher:manual_fill::FormSuggestionViewMatcher()]
       performAction:grey_scrollToContentEdge(kGREYContentEdgeRight)];
 
-  id<GREYMatcher> cc_chip = grey_text(base::SysUTF16ToNSString(card.GetInfo(
-      autofill::CREDIT_CARD_NAME_FULL, l10n_util::GetLocaleOverride())));
+  id<GREYMatcher> cc_chip = KeyboardAccessoryCreditCardSuggestion();
   [[EarlGrey selectElementWithMatcher:cc_chip] performAction:grey_tap()];
 
   // Verify that the page is filled properly.
-  [self verifyCreditCardInfosHaveBeenFilled:card];
+  [self verifyCreditCardInfosHaveBeenFilled:autofill::test::GetCreditCard()];
 
   // Verify that the acceptance of the card suggestion at index 1 was correctly
   // recorded.
@@ -608,11 +651,8 @@
   [[EarlGrey selectElementWithMatcher:useKeyboardButton]
       performAction:grey_tap()];
 
-  autofill::CreditCard card = autofill::test::GetCreditCard();
-
   // Tap on the credit card chip.
-  id<GREYMatcher> cc_chip = grey_text(base::SysUTF16ToNSString(card.GetInfo(
-      autofill::CREDIT_CARD_NAME_FULL, l10n_util::GetLocaleOverride())));
+  id<GREYMatcher> cc_chip = KeyboardAccessoryCreditCardSuggestion();
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:cc_chip];
   [[EarlGrey selectElementWithMatcher:cc_chip] performAction:grey_tap()];
 
@@ -628,6 +668,8 @@
           std::make_tuple(autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR,
                           "cc-exp-frame", kFormCardExpirationYear),
   };
+
+  autofill::CreditCard card = autofill::test::GetCreditCard();
   for (const auto& [field_type, frame_id_attr, field_id_attr] :
        fields_to_verify) {
     NSString* value =
@@ -659,11 +701,8 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()]
       performAction:chrome_test_util::TapWebElementWithId(kFormCardName)];
 
-  autofill::CreditCard card = autofill::test::GetCreditCard();
-
   // Tap on the credit card chip.
-  id<GREYMatcher> cc_chip = grey_text(base::SysUTF16ToNSString(card.GetInfo(
-      autofill::CREDIT_CARD_NAME_FULL, l10n_util::GetLocaleOverride())));
+  id<GREYMatcher> cc_chip = KeyboardAccessoryCreditCardSuggestion();
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:cc_chip];
   [[EarlGrey selectElementWithMatcher:cc_chip] performAction:grey_tap()];
 
@@ -676,6 +715,7 @@
 
   // Verify that the cardholder name field on the main frame was filled which
   // doesn't require the frame tree.
+  autofill::CreditCard card = autofill::test::GetCreditCard();
   [self verifyFieldWithIdHasBeenFilled:kFormCardName
                               iframeId:""
                                  value:base::SysUTF16ToNSString(card.GetInfo(
@@ -713,17 +753,14 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()]
       performAction:chrome_test_util::TapWebElementWithId(kFormZip)];
 
-  autofill::AutofillProfile profile = autofill::test::GetFullProfile();
-
-  id<GREYMatcher> address_chip = grey_text(
-      base::SysUTF16ToNSString(profile.GetRawInfo(autofill::ADDRESS_HOME_ZIP)));
+  id<GREYMatcher> address_chip = KeyboardAccessoryAddressSuggestion();
 
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:address_chip];
 
   [[EarlGrey selectElementWithMatcher:address_chip] performAction:grey_tap()];
 
   // Verify that the page is filled properly.
-  [self verifyAddressInfosHaveBeenFilled:profile];
+  [self verifyAddressInfosHaveBeenFilled:autofill::test::GetFullProfile()];
 
   // Verify that the acceptance of the address suggestion at index 0 was
   // correctly recorded.
diff --git a/ios/chrome/browser/browser_container/ui_bundled/BUILD.gn b/ios/chrome/browser/browser_container/ui_bundled/BUILD.gn
index 54f8fada..b7e1e10 100644
--- a/ios/chrome/browser/browser_container/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/browser_container/ui_bundled/BUILD.gn
@@ -18,7 +18,9 @@
     "//base",
     "//components/search_engines",
     "//ios/chrome/app/strings",
+    "//ios/chrome/browser/explain_with_gemini/coordinator",
     "//ios/chrome/browser/fullscreen/ui_bundled",
+    "//ios/chrome/browser/intelligence/features",
     "//ios/chrome/browser/link_to_text/model",
     "//ios/chrome/browser/link_to_text/ui_bundled",
     "//ios/chrome/browser/main/model",
@@ -62,6 +64,7 @@
     "//base",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/browser_container/model",
+    "//ios/chrome/browser/explain_with_gemini/coordinator",
     "//ios/chrome/browser/link_to_text/ui_bundled",
     "//ios/chrome/browser/partial_translate/ui_bundled",
     "//ios/chrome/browser/search_with/ui_bundled",
@@ -81,7 +84,10 @@
     "browser_edit_menu_utils.h",
     "browser_edit_menu_utils.mm",
   ]
-  deps = [ "//base" ]
+  deps = [
+    "//base",
+    "//ios/chrome/browser/intelligence/features",
+  ]
 }
 
 source_set("edit_menu_alert_delegate") {
diff --git a/ios/chrome/browser/browser_container/ui_bundled/DEPS b/ios/chrome/browser/browser_container/ui_bundled/DEPS
index 1a2374c..a0f54e2 100644
--- a/ios/chrome/browser/browser_container/ui_bundled/DEPS
+++ b/ios/chrome/browser/browser_container/ui_bundled/DEPS
@@ -2,6 +2,7 @@
   "+ios/chrome/browser/fullscreen/ui_bundled",
   "+ios/chrome/browser/partial_translate/ui_bundled",
   "+ios/chrome/browser/search_with/ui_bundled",
+  "+ios/chrome/browser/explain_with_gemini/coordinator",
   "+ios/chrome/browser/link_to_text/model/link_to_text_payload.h",
   "+ios/chrome/browser/link_to_text/ui_bundled",
   "+ios/chrome/browser/overlays/model/public",
@@ -9,4 +10,5 @@
   "+ios/chrome/browser/screen_time/model",
   "+ios/chrome/browser/screen_time/ui_bundled/screen_time_coordinator.h",
   "+ios/chrome/browser/search_engines/model/template_url_service_factory.h",
+  "+ios/chrome/browser/intelligence/features/features.h"
 ]
diff --git a/ios/chrome/browser/browser_container/ui_bundled/browser_container_coordinator.mm b/ios/chrome/browser/browser_container/ui_bundled/browser_container_coordinator.mm
index 75bc2345..8062f4b1 100644
--- a/ios/chrome/browser/browser_container/ui_bundled/browser_container_coordinator.mm
+++ b/ios/chrome/browser/browser_container/ui_bundled/browser_container_coordinator.mm
@@ -12,7 +12,9 @@
 #import "ios/chrome/browser/browser_container/ui_bundled/browser_container_view_controller.h"
 #import "ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_handler.h"
 #import "ios/chrome/browser/browser_container/ui_bundled/edit_menu_alert_delegate.h"
+#import "ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_mediator.h"
 #import "ios/chrome/browser/fullscreen/ui_bundled/fullscreen_controller.h"
+#import "ios/chrome/browser/intelligence/features/features.h"
 #import "ios/chrome/browser/link_to_text/model/link_to_text_payload.h"
 #import "ios/chrome/browser/link_to_text/ui_bundled/link_to_text_mediator.h"
 #import "ios/chrome/browser/overlays/model/public/overlay_presenter.h"
@@ -64,6 +66,8 @@
   BrowserContainerMediator* _mediator;
   // The mediator used for the Link to Text feature.
   LinkToTextMediator* _linkToTextMediator;
+  // The mediator used for the Explain With Gemini feature.
+  ExplainWithGeminiMediator* _explainWithGeminiMediator;
 }
 
 #pragma mark - ChromeCoordinator
@@ -121,12 +125,27 @@
       [[SearchWithMediator alloc] initWithWebStateList:webStateList
                                     templateURLService:templateURLService
                                              incognito:incognito];
+
   id<ApplicationCommands> applicationCommandsHandler =
       HandlerForProtocol(dispatcher, ApplicationCommands);
+
   _searchWithMediator.applicationCommandHandler = applicationCommandsHandler;
   self.browserEditMenuHandler.searchWithDelegate = _searchWithMediator;
 
+  if (ExplainGeminiEditMenuPosition() !=
+          PositionForExplainGeminiEditMenu::kDisabled &&
+      !incognito) {
+    _explainWithGeminiMediator =
+        [[ExplainWithGeminiMediator alloc] initWithWebStateList:webStateList];
+
+    _explainWithGeminiMediator.applicationCommandHandler =
+        applicationCommandsHandler;
+    self.browserEditMenuHandler.explainWithGeminiDelegate =
+        _explainWithGeminiMediator;
+  }
+
   [_webContentAreaOverlayContainerCoordinator start];
+
   self.viewController.webContentsOverlayContainerViewController =
       _webContentAreaOverlayContainerCoordinator.viewController;
   OverlayPresenter* overlayPresenter =
diff --git a/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_constants.h b/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_constants.h
index 733dcd4..2f3ae6d 100644
--- a/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_constants.h
+++ b/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_constants.h
@@ -11,6 +11,8 @@
 
 // The ID for the Chrome menu.
 extern NSString* const kBrowserEditMenuChromeMenuId;
+// The ID for the Chrome secondary menu used for Explain With Gemini.
+extern NSString* const kBrowserEditMenuSecondaryMenuId;
 
 }  // namespace edit_menu
 
diff --git a/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_constants.mm b/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_constants.mm
index 038af18..df87622 100644
--- a/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_constants.mm
+++ b/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_constants.mm
@@ -6,7 +6,8 @@
 
 namespace edit_menu {
 
-// The ID for the Chrome menu.
 NSString* const kBrowserEditMenuChromeMenuId = @"chromecommand.menu";
+NSString* const kBrowserEditMenuSecondaryMenuId =
+    @"chromecommand.secondary.menu";
 
 }  // namespace edit_menu
diff --git a/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_handler.h b/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_handler.h
index 72997028..4d5008c 100644
--- a/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_handler.h
+++ b/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_handler.h
@@ -9,6 +9,8 @@
 
 #import "ios/chrome/browser/browser_container/model/edit_menu_builder.h"
 
+// TODO(crbug.com/408229821): Reverse dependencies.
+@protocol ExplainWithGeminiDelegate;
 @protocol LinkToTextDelegate;
 @protocol PartialTranslateDelegate;
 @protocol SearchWithDelegate;
@@ -17,6 +19,10 @@
 // This class is in charge of customising the menu and executing the commands.
 @interface BrowserEditMenuHandler : NSObject <EditMenuBuilder>
 
+// The delegate to handle Explain With Gemini button selection.
+@property(nonatomic, weak) id<ExplainWithGeminiDelegate>
+    explainWithGeminiDelegate;
+
 // The delegate to handle link to text button selection.
 @property(nonatomic, weak) id<LinkToTextDelegate> linkToTextDelegate;
 
diff --git a/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_handler.mm b/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_handler.mm
index 531587a..e17524b 100644
--- a/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_handler.mm
+++ b/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_handler.mm
@@ -4,6 +4,7 @@
 
 #import "ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_handler.h"
 
+#import "ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_delegate.h"
 #import "ios/chrome/browser/link_to_text/ui_bundled/link_to_text_delegate.h"
 #import "ios/chrome/browser/partial_translate/ui_bundled/partial_translate_delegate.h"
 #import "ios/chrome/browser/search_with/ui_bundled/search_with_delegate.h"
@@ -13,6 +14,7 @@
 - (void)buildEditMenuWithBuilder:(id<UIMenuBuilder>)builder {
   [self.linkToTextDelegate buildMenuWithBuilder:builder];
   [self.searchWithDelegate buildMenuWithBuilder:builder];
+  [self.explainWithGeminiDelegate buildMenuWithBuilder:builder];
   [self.partialTranslateDelegate buildMenuWithBuilder:builder];
 }
 
diff --git a/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_utils.h b/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_utils.h
index 9840ac8c..dfaae05 100644
--- a/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_utils.h
+++ b/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_utils.h
@@ -11,7 +11,9 @@
 
 // Adds an element at the end of the Chrome menu.
 // Chrome menu is added between format menu and lookup menu.
-void AddElementToChromeMenu(id<UIMenuBuilder> builder, UIMenuElement* element);
+void AddElementToChromeMenu(id<UIMenuBuilder> builder,
+                            UIMenuElement* element,
+                            BOOL is_primary_menu);
 
 }  // namespace edit_menu
 
diff --git a/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_utils.mm b/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_utils.mm
index 2f2c0c2af..532daaa6 100644
--- a/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_utils.mm
+++ b/ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_utils.mm
@@ -5,6 +5,7 @@
 #import "ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_utils.h"
 
 #import "ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_constants.h"
+#import "ios/chrome/browser/intelligence/features/features.h"
 
 namespace {
 // Creates the Chrome sub menu if needed.
@@ -38,15 +39,40 @@
 
   // Last possibility, put the menu first
   [builder insertChildMenu:chrome_menu atStartOfMenuForIdentifier:UIMenuRoot];
-  return;
+}
+
+void EnsureChromeSecondaryMenuCreated(id<UIMenuBuilder> builder) {
+  UIMenu* chrome_secondary_menu =
+      [builder menuForIdentifier:edit_menu::kBrowserEditMenuSecondaryMenuId];
+  if (chrome_secondary_menu) {
+    return;
+  }
+  UIMenu* explainWithGeminiMenu =
+      [UIMenu menuWithTitle:@""
+                      image:nil
+                 identifier:edit_menu::kBrowserEditMenuSecondaryMenuId
+                    options:UIMenuOptionsDisplayInline
+                   children:@[]];
+
+  [builder insertChildMenu:explainWithGeminiMenu
+      atEndOfMenuForIdentifier:UIMenuStandardEdit];
 }
 }  // namespace
 
 namespace edit_menu {
 
-void AddElementToChromeMenu(id<UIMenuBuilder> builder, UIMenuElement* element) {
-  EnsureChromeMenuCreated(builder);
-  [builder replaceChildrenOfMenuForIdentifier:kBrowserEditMenuChromeMenuId
+void AddElementToChromeMenu(id<UIMenuBuilder> builder,
+                            UIMenuElement* element,
+                            BOOL is_primary_menu) {
+  NSString* identifier;
+  if (is_primary_menu) {
+    EnsureChromeMenuCreated(builder);
+    identifier = kBrowserEditMenuChromeMenuId;
+  } else {
+    EnsureChromeSecondaryMenuCreated(builder);
+    identifier = kBrowserEditMenuSecondaryMenuId;
+  }
+  [builder replaceChildrenOfMenuForIdentifier:identifier
                             fromChildrenBlock:^NSArray<UIMenuElement*>*(
                                 NSArray<UIMenuElement*>* oldElements) {
                               return [oldElements arrayByAddingObject:element];
diff --git a/ios/chrome/browser/bubble/ui_bundled/bubble_presenter.mm b/ios/chrome/browser/bubble/ui_bundled/bubble_presenter.mm
index 7e454c1..07ddb5b 100644
--- a/ios/chrome/browser/bubble/ui_bundled/bubble_presenter.mm
+++ b/ios/chrome/browser/bubble/ui_bundled/bubble_presenter.mm
@@ -933,6 +933,16 @@
   bubbleViewControllerPresenter.customBubbleVisibilityDuration =
       [self bubbleVisibilityDurationForFeature:feature];
 
+  BOOL shouldDisablePanRecognizer =
+      base::FeatureList::IsEnabled(kLensOverlayDisableIPHPanGesture);
+  BOOL isLensOverlayIPH =
+      (feature.name ==
+           feature_engagement::kIPHiOSLensOverlayEscapeHatchTipFeature.name ||
+       feature.name ==
+           feature_engagement::kIPHiOSLensOverlayEntrypointTipFeature.name);
+  bubbleViewControllerPresenter.forceDisablePanGestureRecognizer =
+      shouldDisablePanRecognizer && isLensOverlayIPH;
+
   return bubbleViewControllerPresenter;
 }
 
diff --git a/ios/chrome/browser/bubble/ui_bundled/bubble_view_controller_presenter.h b/ios/chrome/browser/bubble/ui_bundled/bubble_view_controller_presenter.h
index c7fab44..30eaecb5 100644
--- a/ios/chrome/browser/bubble/ui_bundled/bubble_view_controller_presenter.h
+++ b/ios/chrome/browser/bubble/ui_bundled/bubble_view_controller_presenter.h
@@ -62,6 +62,11 @@
 // will be ignored if set to 0 or smaller.
 @property(nonatomic, assign) NSTimeInterval customBubbleVisibilityDuration;
 
+// An override for the pan gesture availability.
+// The default is `NO`. If set, the pan gesture for IPH dismissal will be
+// suppressed, ignoring the pan gesture ablation experiment.
+@property(nonatomic, assign) BOOL forceDisablePanGestureRecognizer;
+
 // Initializes the presenter. `text` is the text displayed by the bubble.
 // `titleString` is the title displayed by the bubble. `arrowDirection` is the
 // direction the bubble's arrow is pointing. `alignment` is the position of the
diff --git a/ios/chrome/browser/bubble/ui_bundled/bubble_view_controller_presenter.mm b/ios/chrome/browser/bubble/ui_bundled/bubble_view_controller_presenter.mm
index 0c210b99..bc65ca1 100644
--- a/ios/chrome/browser/bubble/ui_bundled/bubble_view_controller_presenter.mm
+++ b/ios/chrome/browser/bubble/ui_bundled/bubble_view_controller_presenter.mm
@@ -380,7 +380,10 @@
     [parentView addGestureRecognizer:self.outsideBubbleTapRecognizer];
   }
 
-  if (!IsIPHGestureRecognitionPanAblationEnabled()) {
+  BOOL shouldEnablePanGestureRecognizer =
+      !IsIPHGestureRecognitionPanAblationEnabled() &&
+      !self.forceDisablePanGestureRecognizer;
+  if (shouldEnablePanGestureRecognizer) {
     self.outsideBubblePanRecognizer = [[UIPanGestureRecognizer alloc]
         initWithTarget:self
                 action:@selector(tapOutsideBubbleRecognized:)];
diff --git a/ios/chrome/browser/collaboration/model/BUILD.gn b/ios/chrome/browser/collaboration/model/BUILD.gn
index 164e0231..a8aee652 100644
--- a/ios/chrome/browser/collaboration/model/BUILD.gn
+++ b/ios/chrome/browser/collaboration/model/BUILD.gn
@@ -17,6 +17,7 @@
     "//ios/chrome/browser/saved_tab_groups/favicon/coordinator",
     "//ios/chrome/browser/saved_tab_groups/favicon/ui",
     "//ios/chrome/browser/saved_tab_groups/model",
+    "//ios/chrome/browser/saved_tab_groups/model:tab_group_service",
     "//ios/chrome/browser/share_kit/model",
     "//ios/chrome/browser/share_kit/model:factory",
     "//ios/chrome/browser/share_kit/model:items",
@@ -76,6 +77,7 @@
     "//ios/chrome/browser/favicon/model",
     "//ios/chrome/browser/favicon/model:test_support",
     "//ios/chrome/browser/saved_tab_groups/model",
+    "//ios/chrome/browser/saved_tab_groups/model:tab_group_service",
     "//ios/chrome/browser/share_kit/model:factory",
     "//ios/chrome/browser/share_kit/model:test_support",
     "//ios/chrome/browser/shared/model/application_context",
diff --git a/ios/chrome/browser/collaboration/model/ios_collaboration_controller_delegate.h b/ios/chrome/browser/collaboration/model/ios_collaboration_controller_delegate.h
index 7993dca..34d18150 100644
--- a/ios/chrome/browser/collaboration/model/ios_collaboration_controller_delegate.h
+++ b/ios/chrome/browser/collaboration/model/ios_collaboration_controller_delegate.h
@@ -20,6 +20,7 @@
 @protocol SystemIdentity;
 class TabGroup;
 class TabGroupFaviconsGridConfigurator;
+class TabGroupService;
 
 namespace collaboration {
 
@@ -28,7 +29,8 @@
     : public CollaborationControllerDelegate {
  public:
   IOSCollaborationControllerDelegate(Browser* browser,
-                                     UIViewController* base_view_controller);
+                                     UIViewController* base_view_controller,
+                                     TabGroupService* tab_group_service);
 
   IOSCollaborationControllerDelegate(
       const IOSCollaborationControllerDelegate&) = delete;
@@ -124,9 +126,16 @@
   // something is happening and prevent interaction with the rest of the app.
   UIView* scrim_view_ = nil;
 
+  // The tab group service for this collaboration delegate.
+  raw_ptr<TabGroupService> tab_group_service_;
+
   // Callback that needs to be called to dismiss the join screen.
   base::OnceCallback<void()> dismiss_join_screen_callback_;
 
+  // The tab group id used to register this delegate to the TabGroupService, if
+  // any.
+  std::optional<tab_groups::LocalTabGroupID> tab_group_service_registration_id_;
+
   base::WeakPtrFactory<IOSCollaborationControllerDelegate> weak_ptr_factory_{
       this};
 };
diff --git a/ios/chrome/browser/collaboration/model/ios_collaboration_controller_delegate.mm b/ios/chrome/browser/collaboration/model/ios_collaboration_controller_delegate.mm
index 50730b8..1537ea7e 100644
--- a/ios/chrome/browser/collaboration/model/ios_collaboration_controller_delegate.mm
+++ b/ios/chrome/browser/collaboration/model/ios_collaboration_controller_delegate.mm
@@ -23,6 +23,7 @@
 #import "ios/chrome/browser/saved_tab_groups/favicon/ui/tab_group_favicons_grid.h"
 #import "ios/chrome/browser/saved_tab_groups/model/ios_tab_group_action_context.h"
 #import "ios/chrome/browser/saved_tab_groups/model/ios_tab_group_sync_util.h"
+#import "ios/chrome/browser/saved_tab_groups/model/tab_group_service.h"
 #import "ios/chrome/browser/saved_tab_groups/model/tab_group_sync_service_factory.h"
 #import "ios/chrome/browser/share_kit/model/share_kit_flow_outcome.h"
 #import "ios/chrome/browser/share_kit/model/share_kit_join_configuration.h"
@@ -85,10 +86,15 @@
 
 IOSCollaborationControllerDelegate::IOSCollaborationControllerDelegate(
     Browser* browser,
-    UIViewController* base_view_controller)
-    : browser_(browser), base_view_controller_(base_view_controller) {
+    UIViewController* base_view_controller,
+    TabGroupService* tab_group_service)
+    : browser_(browser),
+      base_view_controller_(base_view_controller),
+      tab_group_service_(tab_group_service) {
   CHECK(browser_);
   CHECK(base_view_controller_);
+  // TODO(crbug.com/399289392): uncomment once downstream is landed.
+  //  CHECK(tab_group_service_);
   ProfileIOS* profile = browser_->GetProfile();
 
   share_kit_service_ = ShareKitServiceFactory::GetForProfile(profile);
@@ -252,6 +258,13 @@
     return;
   }
 
+  tab_group_service_registration_id_ =
+      std::make_optional(tab_group->tab_group_id());
+  // TODO(crbug.com/399289392): uncomment once downstream is landed.
+  //  tab_group_service_->RegisterCollaborationControllerDelegate(
+  //      tab_group_service_registration_id_.value(),
+  //      weak_ptr_factory_.GetWeakPtr());
+
   auto callback = base::BindOnce(
       &IOSCollaborationControllerDelegate::ConfigureAndShareTabGroup,
       weak_ptr_factory_.GetWeakPtr(), either_id, std::move(result), tab_group);
@@ -320,6 +333,11 @@
 }
 
 void IOSCollaborationControllerDelegate::OnFlowFinished() {
+  if (tab_group_service_registration_id_) {
+    // TODO(crbug.com/399289392): uncomment once downstream is landed.
+    //    tab_group_service_->UnregisterCollaborationControllerDelegate(
+    //        tab_group_service_registration_id_.value());
+  }
   if (dismiss_join_screen_callback_) {
     // The dismissal should be handled before the end of the flow.
     NOTREACHED(base::NotFatalUntil::M140);
diff --git a/ios/chrome/browser/collaboration/model/ios_collaboration_controller_delegate_unittest.mm b/ios/chrome/browser/collaboration/model/ios_collaboration_controller_delegate_unittest.mm
index 84a5066e..68afd884 100644
--- a/ios/chrome/browser/collaboration/model/ios_collaboration_controller_delegate_unittest.mm
+++ b/ios/chrome/browser/collaboration/model/ios_collaboration_controller_delegate_unittest.mm
@@ -19,6 +19,8 @@
 #import "ios/chrome/browser/data_sharing/model/data_sharing_service_factory.h"
 #import "ios/chrome/browser/favicon/model/ios_chrome_favicon_loader_factory.h"
 #import "ios/chrome/browser/favicon/model/test_favicon_loader.h"
+#import "ios/chrome/browser/saved_tab_groups/model/tab_group_service.h"
+#import "ios/chrome/browser/saved_tab_groups/model/tab_group_service_factory.h"
 #import "ios/chrome/browser/saved_tab_groups/model/tab_group_sync_service_factory.h"
 #import "ios/chrome/browser/share_kit/model/fake_share_kit_flow_view_controller.h"
 #import "ios/chrome/browser/share_kit/model/share_kit_service_factory.h"
@@ -120,6 +122,9 @@
     test_profile_builder.AddTestingFactory(
         IOSChromeFaviconLoaderFactory::GetInstance(),
         base::BindRepeating(&BuildTestFaviconLoader));
+    test_profile_builder.AddTestingFactory(
+        TabGroupServiceFactory::GetInstance(),
+        TabGroupServiceFactory::GetDefaultFactory());
 
     profile_ = std::move(test_profile_builder).Build();
     browser_ = std::make_unique<TestBrowser>(profile_.get());
@@ -150,6 +155,7 @@
                      forProtocol:@protocol(ApplicationCommands)];
     share_kit_service_ = ShareKitServiceFactory::GetForProfile(profile_.get());
     base_view_controller_ = [[FakeUIViewController alloc] init];
+    tab_group_service_ = TabGroupServiceFactory::GetForProfile(profile_.get());
 
     mock_collaboration_service_ = static_cast<MockCollaborationService*>(
         CollaborationServiceFactory::GetForProfile(profile_.get()));
@@ -160,7 +166,7 @@
   // Init the delegate for a flow.
   void InitDelegate() {
     delegate_ = std::make_unique<IOSCollaborationControllerDelegate>(
-        browser_.get(), base_view_controller_);
+        browser_.get(), base_view_controller_, tab_group_service_);
   }
 
   // Sign in in the authentication service with a fake identity.
@@ -244,6 +250,7 @@
   UIViewController* base_view_controller_;
   raw_ptr<const TabGroup> tab_group_;
   raw_ptr<ShareKitService> share_kit_service_;
+  raw_ptr<TabGroupService> tab_group_service_;
   ServiceStatus collaboration_status_;
 };
 
diff --git a/ios/chrome/browser/commerce/model/push_notification/commerce_push_notification_client.mm b/ios/chrome/browser/commerce/model/push_notification/commerce_push_notification_client.mm
index a36fb60..9a1ad24 100644
--- a/ios/chrome/browser/commerce/model/push_notification/commerce_push_notification_client.mm
+++ b/ios/chrome/browser/commerce/model/push_notification/commerce_push_notification_client.mm
@@ -47,7 +47,8 @@
 }  // namespace
 
 CommercePushNotificationClient::CommercePushNotificationClient()
-    : PushNotificationClient(PushNotificationClientId::kCommerce) {}
+    : PushNotificationClient(PushNotificationClientId::kCommerce,
+                             PushNotificationClientScope::kPerProfile) {}
 
 CommercePushNotificationClient::~CommercePushNotificationClient() = default;
 
diff --git a/ios/chrome/browser/content_notification/model/content_notification_client.mm b/ios/chrome/browser/content_notification/model/content_notification_client.mm
index 69f34a6..c87bfb3 100644
--- a/ios/chrome/browser/content_notification/model/content_notification_client.mm
+++ b/ios/chrome/browser/content_notification/model/content_notification_client.mm
@@ -16,7 +16,8 @@
 #import "url/gurl.h"
 
 ContentNotificationClient::ContentNotificationClient()
-    : PushNotificationClient(PushNotificationClientId::kContent) {}
+    : PushNotificationClient(PushNotificationClientId::kContent,
+                             PushNotificationClientScope::kPerProfile) {}
 
 ContentNotificationClient::~ContentNotificationClient() = default;
 
diff --git a/ios/chrome/browser/data_sharing/model/data_sharing_ui_delegate_ios.h b/ios/chrome/browser/data_sharing/model/data_sharing_ui_delegate_ios.h
index 9080cbd8..8fc8270 100644
--- a/ios/chrome/browser/data_sharing/model/data_sharing_ui_delegate_ios.h
+++ b/ios/chrome/browser/data_sharing/model/data_sharing_ui_delegate_ios.h
@@ -15,15 +15,18 @@
 
 class Browser;
 class ShareKitService;
+class TabGroupService;
 
 namespace data_sharing {
 
 // IOS implementation of DataSharingUIDelegate.
 class DataSharingUIDelegateIOS : public DataSharingUIDelegate {
  public:
+  // TODO(crbug.com/399289392): make tab_group_service nonnull.
   explicit DataSharingUIDelegateIOS(
       ShareKitService* share_kit_service,
-      collaboration::CollaborationService* collaboration_service);
+      collaboration::CollaborationService* collaboration_service,
+      TabGroupService* tab_group_service = nullptr);
   ~DataSharingUIDelegateIOS() override;
 
   DataSharingUIDelegateIOS(const DataSharingUIDelegateIOS&) = delete;
@@ -42,6 +45,7 @@
 
   raw_ptr<ShareKitService> share_kit_service_;
   raw_ptr<collaboration::CollaborationService> collaboration_service_;
+  raw_ptr<TabGroupService> tab_group_service_;
 
   base::WeakPtrFactory<DataSharingUIDelegateIOS> weak_ptr_factory_{this};
 };
diff --git a/ios/chrome/browser/data_sharing/model/data_sharing_ui_delegate_ios.mm b/ios/chrome/browser/data_sharing/model/data_sharing_ui_delegate_ios.mm
index 882e5b3..2474eb8 100644
--- a/ios/chrome/browser/data_sharing/model/data_sharing_ui_delegate_ios.mm
+++ b/ios/chrome/browser/data_sharing/model/data_sharing_ui_delegate_ios.mm
@@ -23,9 +23,11 @@
 
 DataSharingUIDelegateIOS::DataSharingUIDelegateIOS(
     ShareKitService* share_kit_service,
-    collaboration::CollaborationService* collaboration_service)
+    collaboration::CollaborationService* collaboration_service,
+    TabGroupService* tab_group_service)
     : share_kit_service_(share_kit_service),
-      collaboration_service_(collaboration_service) {}
+      collaboration_service_(collaboration_service),
+      tab_group_service_(tab_group_service) {}
 DataSharingUIDelegateIOS::~DataSharingUIDelegateIOS() = default;
 
 void DataSharingUIDelegateIOS::HandleShareURLIntercepted(
@@ -58,7 +60,7 @@
 
   std::unique_ptr<IOSCollaborationControllerDelegate> delegate =
       std::make_unique<IOSCollaborationControllerDelegate>(
-          browser, base_view_controller);
+          browser, base_view_controller, tab_group_service_);
   collaboration_service_->StartJoinFlow(
       std::move(delegate), url,
       collaboration::CollaborationServiceJoinEntryPoint::kUnknown);
diff --git a/ios/chrome/browser/explain_with_gemini/coordinator/BUILD.gn b/ios/chrome/browser/explain_with_gemini/coordinator/BUILD.gn
new file mode 100644
index 0000000..15a8f9b
--- /dev/null
+++ b/ios/chrome/browser/explain_with_gemini/coordinator/BUILD.gn
@@ -0,0 +1,24 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("coordinator") {
+  sources = [
+    "explain_with_gemini_constants.h",
+    "explain_with_gemini_constants.mm",
+    "explain_with_gemini_delegate.h",
+    "explain_with_gemini_mediator.h",
+    "explain_with_gemini_mediator.mm",
+  ]
+  deps = [
+    "//base",
+    "//components/strings",
+    "//ios/chrome/app/strings",
+    "//ios/chrome/browser/browser_container/ui_bundled:edit_menu_utils",
+    "//ios/chrome/browser/intelligence/features",
+    "//ios/chrome/browser/shared/model/web_state_list",
+    "//ios/chrome/browser/shared/public/commands",
+    "//ios/chrome/browser/web_selection/model",
+    "//ios/web/public",
+  ]
+}
diff --git a/ios/chrome/browser/explain_with_gemini/coordinator/DEPS b/ios/chrome/browser/explain_with_gemini/coordinator/DEPS
new file mode 100644
index 0000000..eb0d5be
--- /dev/null
+++ b/ios/chrome/browser/explain_with_gemini/coordinator/DEPS
@@ -0,0 +1,6 @@
+include_rules = [
+  "+ios/chrome/browser/browser_container/ui_bundled",
+  "+ios/chrome/browser/web_selection/model",
+  "+ios/chrome/browser/explain_with_gemini/coordinator",
+  "+ios/chrome/browser/intelligence/features"
+]
diff --git a/ios/chrome/browser/explain_with_gemini/coordinator/OWNERS b/ios/chrome/browser/explain_with_gemini/coordinator/OWNERS
new file mode 100644
index 0000000..fd9def8
--- /dev/null
+++ b/ios/chrome/browser/explain_with_gemini/coordinator/OWNERS
@@ -0,0 +1,2 @@
+prasanaa@google.com
+adamta@google.com
diff --git a/ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_constants.h b/ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_constants.h
new file mode 100644
index 0000000..30d3b3dc
--- /dev/null
+++ b/ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_constants.h
@@ -0,0 +1,17 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_EXPLAIN_WITH_GEMINI_COORDINATOR_EXPLAIN_WITH_GEMINI_CONSTANTS_H_
+#define IOS_CHROME_BROWSER_EXPLAIN_WITH_GEMINI_COORDINATOR_EXPLAIN_WITH_GEMINI_CONSTANTS_H_
+
+#import <Foundation/Foundation.h>
+
+// Constants for Explain With Gemini.
+
+// URL redirecting to Gemini page.
+extern const char kExplainWithGeminiURL[];
+// Header passed to Gemini to track the entrypoint.
+extern NSString* const kExplainWithGeminiHeader;
+
+#endif  // IOS_CHROME_BROWSER_EXPLAIN_WITH_GEMINI_COORDINATOR_EXPLAIN_WITH_GEMINI_CONSTANTS_H_
diff --git a/ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_constants.mm b/ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_constants.mm
new file mode 100644
index 0000000..da6b9c7
--- /dev/null
+++ b/ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_constants.mm
@@ -0,0 +1,11 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_constants.h"
+
+const char kExplainWithGeminiURL[] =
+    "https://gemini.google.com/"
+    "prompt?utm_source=chrome_omnibox&utm_"
+    "medium=owned&utm_campaign=gemini_shortcut";
+NSString* const kExplainWithGeminiHeader = @"X-Chrome-iOS-Gemini";
diff --git a/ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_delegate.h b/ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_delegate.h
new file mode 100644
index 0000000..ad76846
--- /dev/null
+++ b/ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_delegate.h
@@ -0,0 +1,19 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_EXPLAIN_WITH_GEMINI_COORDINATOR_EXPLAIN_WITH_GEMINI_DELEGATE_H_
+#define IOS_CHROME_BROWSER_EXPLAIN_WITH_GEMINI_COORDINATOR_EXPLAIN_WITH_GEMINI_DELEGATE_H_
+
+@protocol UIMenuBuilder;
+
+// Delegate to add an "Explain with Gemini" UIMenu item.
+@protocol ExplainWithGeminiDelegate
+
+// Will be called by `BrowserContainerViewController buildMenuWithBuilder:`
+// to customize its edit menu.
+- (void)buildMenuWithBuilder:(id<UIMenuBuilder>)builder;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_EXPLAIN_WITH_GEMINI_COORDINATOR_EXPLAIN_WITH_GEMINI_DELEGATE_H_
diff --git a/ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_mediator.h b/ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_mediator.h
new file mode 100644
index 0000000..5810a5d
--- /dev/null
+++ b/ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_mediator.h
@@ -0,0 +1,32 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_EXPLAIN_WITH_GEMINI_COORDINATOR_EXPLAIN_WITH_GEMINI_MEDIATOR_H_
+#define IOS_CHROME_BROWSER_EXPLAIN_WITH_GEMINI_COORDINATOR_EXPLAIN_WITH_GEMINI_MEDIATOR_H_
+
+#import <UIKit/UIKit.h>
+
+#import "ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_delegate.h"
+
+@protocol ApplicationCommands;
+
+class WebStateList;
+
+// Mediator that mediates between the browser container views and Explain
+// Gemini.
+@interface ExplainWithGeminiMediator : NSObject <ExplainWithGeminiDelegate>
+
+// The handler for ApplicationCommands commands.
+@property(nonatomic, weak) id<ApplicationCommands> applicationCommandHandler;
+
+// Initializer for a mediator. `webStateList` is the WebStateList for the
+// BrowserContainer that owns this mediator.
+- (instancetype)initWithWebStateList:(WebStateList*)webStateList
+    NS_DESIGNATED_INITIALIZER;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_EXPLAIN_WITH_GEMINI_COORDINATOR_EXPLAIN_WITH_GEMINI_MEDIATOR_H_
diff --git a/ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_mediator.mm b/ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_mediator.mm
new file mode 100644
index 0000000..8f3d6c4
--- /dev/null
+++ b/ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_mediator.mm
@@ -0,0 +1,180 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_mediator.h"
+
+#import "base/apple/foundation_util.h"
+#import "base/ios/ios_util.h"
+#import "base/memory/raw_ptr.h"
+#import "base/memory/weak_ptr.h"
+#import "base/metrics/histogram_functions.h"
+#import "base/strings/sys_string_conversions.h"
+#import "ios/chrome/browser/browser_container/ui_bundled/browser_edit_menu_utils.h"
+#import "ios/chrome/browser/explain_with_gemini/coordinator/explain_with_gemini_constants.h"
+#import "ios/chrome/browser/intelligence/features/features.h"
+#import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h"
+#import "ios/chrome/browser/shared/public/commands/application_commands.h"
+#import "ios/chrome/browser/shared/public/commands/open_new_tab_command.h"
+#import "ios/chrome/browser/web_selection/model/web_selection_response.h"
+#import "ios/chrome/browser/web_selection/model/web_selection_tab_helper.h"
+#import "ios/chrome/grit/ios_strings.h"
+#import "ui/base/l10n/l10n_util_mac.h"
+
+namespace {
+typedef void (^ProceduralBlockWithItemArray)(NSArray<UIMenuElement*>*);
+typedef void (^ProceduralBlockWithBlockWithItemArray)(
+    ProceduralBlockWithItemArray);
+
+}  // namespace
+
+@implementation ExplainWithGeminiMediator {
+  // The Browser's WebStateList.
+  base::WeakPtr<WebStateList> _webStateList;
+}
+
+- (instancetype)initWithWebStateList:(WebStateList*)webStateList {
+  if ((self = [super init])) {
+    CHECK(webStateList);
+    _webStateList = webStateList->AsWeakPtr();
+  }
+  return self;
+}
+
+#pragma mark - Private
+
+// Getter for WebSelectionTabHelper.
+- (WebSelectionTabHelper*)webSelectionTabHelper {
+  web::WebState* webState =
+      _webStateList ? _webStateList->GetActiveWebState() : nullptr;
+  if (!webState) {
+    return nullptr;
+  }
+  WebSelectionTabHelper* helper = WebSelectionTabHelper::FromWebState(webState);
+  return helper;
+}
+
+// Checks if Explain With Gemini can be performed.
+- (BOOL)canPerformExplainWithGemini {
+  // TODO(crbug.com/408000561): Only show for some users.
+  CHECK(ExplainGeminiEditMenuPosition() !=
+        PositionForExplainGeminiEditMenu::kDisabled);
+  WebSelectionTabHelper* tabHelper = [self webSelectionTabHelper];
+  return tabHelper && tabHelper->CanRetrieveSelectedText() &&
+         self.applicationCommandHandler;
+}
+
+// Returns the title of button Explain With Gemini.
+- (NSString*)buttonTitle {
+  return [NSString
+      stringWithFormat:@"✦ %@", l10n_util::GetNSString(
+                                    IDS_IOS_EXPLAIN_GEMINI_EDIT_MENU)];
+}
+
+// Adds Explain With Gemini item to the menu with a completion block.
+- (void)addItemWithCompletion:(ProceduralBlockWithItemArray)completion {
+  WebSelectionTabHelper* tabHelper = [self webSelectionTabHelper];
+  if (!tabHelper) {
+    completion(@[]);
+    return;
+  }
+
+  __weak __typeof(self) weakSelf = self;
+  tabHelper->GetSelectedText(base::BindOnce(^(WebSelectionResponse* response) {
+    if (weakSelf) {
+      [weakSelf addItemWithResponse:response completion:completion];
+      return;
+    }
+    completion(@[]);
+  }));
+}
+
+// Adds Explain With Gemini item to the menu with a web selection response.
+- (void)addItemWithResponse:(WebSelectionResponse*)response
+                 completion:(ProceduralBlockWithItemArray)completion {
+  if (!response.valid || ![self canPerformExplainWithGemini]) {
+    completion(@[]);
+    return;
+  }
+  NSString* text = response.selectedText;
+  NSString* explainWithGeminiMenuTitle = [self buttonTitle];
+  if ([[text
+          stringByTrimmingCharactersInSet:[NSCharacterSet
+                                              whitespaceAndNewlineCharacterSet]]
+          length] == 0) {
+    completion(@[]);
+    return;
+  }
+
+  NSString* explainWithGeminiMenuId = @"chromeAction.explainGemini";
+  __weak __typeof(self) weakSelf = self;
+  UIAction* action =
+      [UIAction actionWithTitle:explainWithGeminiMenuTitle
+                          image:nil
+                     identifier:explainWithGeminiMenuId
+                        handler:^(UIAction* a) {
+                          [weakSelf triggerExplainWithGeminiForText:text];
+                        }];
+  completion(@[ action ]);
+}
+
+// Triggers Explain with Gemini action for the selected text.
+- (void)triggerExplainWithGeminiForText:(NSString*)text {
+  CHECK(ExplainGeminiEditMenuPosition() !=
+        PositionForExplainGeminiEditMenu::kDisabled);
+  if (![self canPerformExplainWithGemini]) {
+    return;
+  }
+
+  const GURL explainWithGeminiURL = GURL(kExplainWithGeminiURL);
+
+  OpenNewTabCommand* command =
+      [[OpenNewTabCommand alloc] initWithURL:explainWithGeminiURL
+                                    referrer:web::Referrer()
+                                 inIncognito:NO
+                                inBackground:NO
+                                    appendTo:OpenPosition::kCurrentTab];
+
+  command.extraHeaders = @{
+    kExplainWithGeminiHeader :
+        [NSString stringWithFormat:@"%@ : %@",
+                                   l10n_util::GetNSString(
+                                       IDS_IOS_EXPLAIN_GEMINI_PROMPT_PREFIX),
+                                   text]
+  };
+  base::UmaHistogramCounts10000("IOS.ExplainWithGemini.CharSelected",
+                                [text length]);
+  [self.applicationCommandHandler openURLInNewTab:command];
+}
+
+#pragma mark - EditMenuProvider
+
+- (void)buildMenuWithBuilder:(id<UIMenuBuilder>)builder {
+  if (![self canPerformExplainWithGemini]) {
+    return;
+  }
+
+  __weak __typeof(self) weakSelf = self;
+  ProceduralBlockWithBlockWithItemArray provider =
+      ^(ProceduralBlockWithItemArray completion) {
+        [weakSelf addItemWithCompletion:completion];
+      };
+  UIDeferredMenuElement* deferredMenuElement =
+      [UIDeferredMenuElement elementWithProvider:provider];
+
+  if (ExplainGeminiEditMenuPosition() ==
+      PositionForExplainGeminiEditMenu::kAfterSearch) {
+    edit_menu::AddElementToChromeMenu(builder, deferredMenuElement,
+                                      /*primary*/ YES);
+    return;
+  }
+  if (ExplainGeminiEditMenuPosition() ==
+      PositionForExplainGeminiEditMenu::kAfterEdit) {
+    edit_menu::AddElementToChromeMenu(builder, deferredMenuElement,
+                                      /*primary*/ NO);
+    return;
+  }
+  NOTREACHED();
+}
+
+@end
diff --git a/ios/chrome/browser/first_run/ui_bundled/BUILD.gn b/ios/chrome/browser/first_run/ui_bundled/BUILD.gn
index e4f7387..cac93f4 100644
--- a/ios/chrome/browser/first_run/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/first_run/ui_bundled/BUILD.gn
@@ -52,6 +52,7 @@
     "//components/signin/public/identity_manager",
     "//ios/chrome/app:tests_hook",
     "//ios/chrome/app/strings",
+    "//ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator",
     "//ios/chrome/browser/authentication/ui_bundled/history_sync",
     "//ios/chrome/browser/authentication/ui_bundled/signin:constants",
     "//ios/chrome/browser/authentication/ui_bundled/signin:interruptible_chrome_coordinator",
@@ -60,7 +61,6 @@
     "//ios/chrome/browser/first_run/ui_bundled/best_features/coordinator",
     "//ios/chrome/browser/first_run/ui_bundled/default_browser",
     "//ios/chrome/browser/first_run/ui_bundled/resources",
-    "//ios/chrome/browser/first_run/ui_bundled/signin",
     "//ios/chrome/browser/first_run/ui_bundled/tos",
     "//ios/chrome/browser/main/model",
     "//ios/chrome/browser/policy/model:policy_util",
diff --git a/ios/chrome/browser/first_run/ui_bundled/DEPS b/ios/chrome/browser/first_run/ui_bundled/DEPS
index d6addac..0b62259 100644
--- a/ios/chrome/browser/first_run/ui_bundled/DEPS
+++ b/ios/chrome/browser/first_run/ui_bundled/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+  "+ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_coordinator.h",
   "+ios/chrome/browser/crash_report/model/crash_helper.h",
   "+ios/chrome/browser/default_browser/model",
   "+ios/chrome/browser/docking_promo/coordinator/docking_promo_coordinator.h",
diff --git a/ios/chrome/browser/first_run/ui_bundled/first_run_coordinator.mm b/ios/chrome/browser/first_run/ui_bundled/first_run_coordinator.mm
index 744ce1a..fc4afba 100644
--- a/ios/chrome/browser/first_run/ui_bundled/first_run_coordinator.mm
+++ b/ios/chrome/browser/first_run/ui_bundled/first_run_coordinator.mm
@@ -13,6 +13,7 @@
 #import "base/time/time.h"
 #import "components/metrics/metrics_service.h"
 #import "components/signin/public/base/signin_metrics.h"
+#import "ios/chrome/browser/authentication/ui_bundled/fullscreen_signin_screen/coordinator/fullscreen_signin_screen_coordinator.h"
 #import "ios/chrome/browser/authentication/ui_bundled/history_sync/history_sync_coordinator.h"
 #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_constants.h"
 #import "ios/chrome/browser/docking_promo/coordinator/docking_promo_coordinator.h"
@@ -22,7 +23,6 @@
 #import "ios/chrome/browser/first_run/ui_bundled/features.h"
 #import "ios/chrome/browser/first_run/ui_bundled/first_run_screen_delegate.h"
 #import "ios/chrome/browser/first_run/ui_bundled/first_run_util.h"
-#import "ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_coordinator.h"
 #import "ios/chrome/browser/screen/ui_bundled/screen_provider.h"
 #import "ios/chrome/browser/screen/ui_bundled/screen_type.h"
 #import "ios/chrome/browser/search_engine_choice/ui_bundled/search_engine_choice_coordinator.h"
@@ -157,7 +157,7 @@
 - (ChromeCoordinator*)createChildCoordinatorWithScreenType:(ScreenType)type {
   switch (type) {
     case kSignIn:
-      return [[SigninScreenCoordinator alloc]
+      return [[FullscreenSigninScreenCoordinator alloc]
           initWithBaseNavigationController:self.navigationController
                                    browser:self.browser
                                   delegate:self
diff --git a/ios/chrome/browser/first_run/ui_bundled/signin/BUILD.gn b/ios/chrome/browser/first_run/ui_bundled/signin/BUILD.gn
deleted file mode 100644
index 2f74c77..0000000
--- a/ios/chrome/browser/first_run/ui_bundled/signin/BUILD.gn
+++ /dev/null
@@ -1,69 +0,0 @@
-# Copyright 2022 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("signin") {
-  sources = [
-    "signin_screen_coordinator.h",
-    "signin_screen_coordinator.mm",
-    "signin_screen_mediator.h",
-    "signin_screen_mediator.mm",
-    "signin_screen_mediator_delegate.h",
-  ]
-  deps = [
-    ":signin_ui",
-    "//components/metrics",
-    "//components/prefs",
-    "//components/signin/public/identity_manager/objc",
-    "//components/web_resource",
-    "//ios/chrome/browser/authentication/ui_bundled",
-    "//ios/chrome/browser/authentication/ui_bundled/authentication_flow",
-    "//ios/chrome/browser/authentication/ui_bundled/enterprise:enterprise_utils",
-    "//ios/chrome/browser/authentication/ui_bundled/identity_chooser",
-    "//ios/chrome/browser/authentication/ui_bundled/signin:signin_headers",
-    "//ios/chrome/browser/authentication/ui_bundled/signin/logging",
-    "//ios/chrome/browser/first_run/model",
-    "//ios/chrome/browser/first_run/ui_bundled:constants",
-    "//ios/chrome/browser/first_run/ui_bundled:screen_delegate",
-    "//ios/chrome/browser/first_run/ui_bundled:utils",
-    "//ios/chrome/browser/first_run/ui_bundled/tos",
-    "//ios/chrome/browser/first_run/ui_bundled/uma",
-    "//ios/chrome/browser/main/model",
-    "//ios/chrome/browser/policy/model:policy_util",
-    "//ios/chrome/browser/shared/model/application_context",
-    "//ios/chrome/browser/shared/public/commands",
-    "//ios/chrome/browser/shared/public/features",
-    "//ios/chrome/browser/signin/model",
-    "//ios/chrome/browser/signin/model:authentication_service",
-    "//ios/chrome/browser/signin/model:authentication_service_factory",
-    "//ios/chrome/browser/signin/model:system_identity",
-    "//ios/chrome/browser/sync/model",
-  ]
-}
-
-source_set("signin_ui") {
-  sources = [
-    "signin_screen_consumer.h",
-    "signin_screen_view_controller.h",
-    "signin_screen_view_controller.mm",
-  ]
-  deps = [
-    "//components/signin/public/base:signin_switches",
-    "//ios/chrome/app/strings",
-    "//ios/chrome/browser/authentication/ui_bundled/views",
-    "//ios/chrome/browser/first_run/ui_bundled:constants",
-    "//ios/chrome/browser/first_run/ui_bundled:field_trial",
-    "//ios/chrome/browser/first_run/ui_bundled:utils",
-    "//ios/chrome/browser/settings/ui_bundled/elements:enterprise_info_popover_view_controller",
-    "//ios/chrome/browser/shared/public/commands",
-    "//ios/chrome/browser/shared/public/features",
-    "//ios/chrome/browser/shared/ui/elements:elements_internal",
-    "//ios/chrome/browser/shared/ui/symbols",
-    "//ios/chrome/common:string_util",
-    "//ios/chrome/common/ui/colors",
-    "//ios/chrome/common/ui/elements:popover_label_view_controller",
-    "//ios/chrome/common/ui/promo_style",
-    "//ios/chrome/common/ui/util",
-    "//ui/base",
-  ]
-}
diff --git a/ios/chrome/browser/first_run/ui_bundled/signin/DEPS b/ios/chrome/browser/first_run/ui_bundled/signin/DEPS
deleted file mode 100644
index 96bbb2ce..0000000
--- a/ios/chrome/browser/first_run/ui_bundled/signin/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-"+ios/chrome/browser/authentication/ui_bundled",
-]
diff --git a/ios/chrome/browser/first_run/ui_bundled/signin/DIR_METADATA b/ios/chrome/browser/first_run/ui_bundled/signin/DIR_METADATA
deleted file mode 100644
index e297220..0000000
--- a/ios/chrome/browser/first_run/ui_bundled/signin/DIR_METADATA
+++ /dev/null
@@ -1,2 +0,0 @@
-mixins: "//components/signin/COMMON_METADATA"
-os: IOS
diff --git a/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_mediator_delegate.h b/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_mediator_delegate.h
deleted file mode 100644
index f9bcfda..0000000
--- a/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_mediator_delegate.h
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_SIGNIN_SIGNIN_SCREEN_MEDIATOR_DELEGATE_H_
-#define IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_SIGNIN_SIGNIN_SCREEN_MEDIATOR_DELEGATE_H_
-
-@class SigninScreenMediator;
-
-@protocol SigninScreenMediatorDelegate <NSObject>
-
-// Let the coordinator know the sing-in ended successfully.
-- (void)signinScreenMediatorDidFinishSignin:(SigninScreenMediator*)mediator;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_SIGNIN_SIGNIN_SCREEN_MEDIATOR_DELEGATE_H_
diff --git a/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_view_controller.h b/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_view_controller.h
deleted file mode 100644
index 1909625..0000000
--- a/ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_view_controller.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_SIGNIN_SIGNIN_SCREEN_VIEW_CONTROLLER_H_
-#define IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_SIGNIN_SIGNIN_SCREEN_VIEW_CONTROLLER_H_
-
-#import <UIKit/UIKit.h>
-
-#import "ios/chrome/browser/first_run/ui_bundled/signin/signin_screen_consumer.h"
-#import "ios/chrome/common/ui/promo_style/promo_style_view_controller.h"
-
-@protocol TOSCommands;
-
-// Delegate of sign-in screen view controller.
-@protocol SigninScreenViewControllerDelegate <PromoStyleViewControllerDelegate>
-
-// Called when the user taps to see the account picker.
-- (void)showAccountPickerFromPoint:(CGPoint)point;
-
-@end
-
-// View controller of sign-in screen.
-@interface SigninScreenViewController
-    : PromoStyleViewController <SigninScreenConsumer>
-
-// Handler to open the terms of service dialog.
-@property(nonatomic, weak) id<TOSCommands> TOSHandler;
-@property(nonatomic, weak) id<SigninScreenViewControllerDelegate> delegate;
-
-@end
-
-#endif  // IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_SIGNIN_SIGNIN_SCREEN_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index 9afec862..272fdbb2 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -1395,14 +1395,14 @@
      nullptr},
 };
 
-const FeatureEntry::FeatureParam kBeforeSearchExplainGeminiEditMenu[] = {
+const FeatureEntry::FeatureParam kAfterEditExplainGeminiEditMenu[] = {
     {kExplainGeminiEditMenuParams, "1"}};
 const FeatureEntry::FeatureParam kAfterSearchExplainGeminiEditMenu[] = {
     {kExplainGeminiEditMenuParams, "2"}};
 
 const FeatureEntry::FeatureVariation kExplainGeminiEditMenuVariations[] = {
-    {"Before Search Gemini Edit Menu", kBeforeSearchExplainGeminiEditMenu,
-     std::size(kBeforeSearchExplainGeminiEditMenu), nullptr},
+    {"After Edit Gemini Edit Menu", kAfterEditExplainGeminiEditMenu,
+     std::size(kAfterEditExplainGeminiEditMenu), nullptr},
     {"After Search Gemini Edit Menu", kAfterSearchExplainGeminiEditMenu,
      std::size(kAfterSearchExplainGeminiEditMenu), nullptr}};
 
@@ -2303,6 +2303,10 @@
      flag_descriptions::kLensOverlayEnableLVFEscapeHatchName,
      flag_descriptions::kLensOverlayEnableLVFEscapeHatchDescription,
      flags_ui::kOsIos, FEATURE_VALUE_TYPE(kLensOverlayEnableLVFEscapeHatch)},
+    {"lens-overlay-disable-iph-pan-gesture",
+     flag_descriptions::kLensOverlayDisableIPHPanGestureName,
+     flag_descriptions::kLensOverlayDisableIPHPanGestureDescription,
+     flags_ui::kOsIos, FEATURE_VALUE_TYPE(kLensOverlayDisableIPHPanGesture)},
     {"lens-overlay-disable-price-insights",
      flag_descriptions::kLensOverlayDisablePriceInsightsName,
      flag_descriptions::kLensOverlayDisablePriceInsightsDescription,
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index 66c43c9..63249f32b 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -750,6 +750,12 @@
     "Selects which lens overlay onboarding/entrypoint treatment is active. "
     "No-op if lens overlay is off.";
 
+extern const char kLensOverlayDisableIPHPanGestureName[] =
+    "Disable Lens Overlay IPH Pan Dismissal";
+extern const char kLensOverlayDisableIPHPanGestureDescription[] =
+    "Disable the pan gesture that dismisses Lens Overlay IPH. The IPH can "
+    "still be dismissed with a tap.";
+
 extern const char kLensOverlayDisablePriceInsightsName[] =
     "Allow Lens overlay to disable price insights";
 extern const char kLensOverlayDisablePriceInsightsDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index e528371..beb0737b 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -440,6 +440,9 @@
 extern const char kLensOverlayAlternativeOnboardingName[];
 extern const char kLensOverlayAlternativeOnboardingDescription[];
 
+extern const char kLensOverlayDisableIPHPanGestureName[];
+extern const char kLensOverlayDisableIPHPanGestureDescription[];
+
 extern const char kLensOverlayDisablePriceInsightsName[];
 extern const char kLensOverlayDisablePriceInsightsDescription[];
 
diff --git a/ios/chrome/browser/intelligence/features/features.h b/ios/chrome/browser/intelligence/features/features.h
index 639a5bcc..bcdda6c 100644
--- a/ios/chrome/browser/intelligence/features/features.h
+++ b/ios/chrome/browser/intelligence/features/features.h
@@ -22,14 +22,14 @@
 extern const char kExplainGeminiEditMenuParams[];
 
 // Holds the position of Explain Gemini button in the EditMenu.
-enum class ExplainGeminiEditMenuPosition {
+enum class PositionForExplainGeminiEditMenu {
   kDisabled = 0,
-  kBeforeSearch = 1,
+  kAfterEdit = 1,
   kAfterSearch = 2,
 };
 
 // Returns the position of Explain Gemini in the EditMenu.
-ExplainGeminiEditMenuPosition ExplainGeminiEditMenuPositionParam();
+PositionForExplainGeminiEditMenu ExplainGeminiEditMenuPosition();
 
 // Feature flag to enable Explain Gemini in Edit Menu.
 BASE_DECLARE_FEATURE(kExplainGeminiEditMenu);
diff --git a/ios/chrome/browser/intelligence/features/features.mm b/ios/chrome/browser/intelligence/features/features.mm
index bcb9a02..e57bf6fa 100644
--- a/ios/chrome/browser/intelligence/features/features.mm
+++ b/ios/chrome/browser/intelligence/features/features.mm
@@ -22,18 +22,18 @@
   return base::FeatureList::IsEnabled(kPageActionMenu);
 }
 
-const char kExplainGeminiEditMenuParams[] = "ExplainGeminiEditMenuPosition";
+const char kExplainGeminiEditMenuParams[] = "PositionForExplainGeminiEditMenu";
 
-ExplainGeminiEditMenuPosition ExplainGeminiEditMenuPositionParam() {
+PositionForExplainGeminiEditMenu ExplainGeminiEditMenuPosition() {
   int param = base::GetFieldTrialParamByFeatureAsInt(
       kExplainGeminiEditMenu, kExplainGeminiEditMenuParams, 0);
   if (param == 1) {
-    return ExplainGeminiEditMenuPosition::kBeforeSearch;
+    return PositionForExplainGeminiEditMenu::kAfterEdit;
   }
   if (param == 2) {
-    return ExplainGeminiEditMenuPosition::kAfterSearch;
+    return PositionForExplainGeminiEditMenu::kAfterSearch;
   }
-  return ExplainGeminiEditMenuPosition::kDisabled;
+  return PositionForExplainGeminiEditMenu::kDisabled;
 }
 
 BASE_FEATURE(kExplainGeminiEditMenu,
diff --git a/ios/chrome/browser/lens_overlay/ui/BUILD.gn b/ios/chrome/browser/lens_overlay/ui/BUILD.gn
index 0687780..17478e23 100644
--- a/ios/chrome/browser/lens_overlay/ui/BUILD.gn
+++ b/ios/chrome/browser/lens_overlay/ui/BUILD.gn
@@ -41,6 +41,7 @@
     "//base",
     "//ios/chrome/browser/lens_overlay/model",
     "//ios/chrome/browser/shared/coordinator/scene:scene_state_header",
+    "//ios/chrome/common/ui/colors:colors",
     "//ui/base",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/lens_overlay/ui/lens_overlay_results_page_presenter.mm b/ios/chrome/browser/lens_overlay/ui/lens_overlay_results_page_presenter.mm
index 4eee46d..2ac86572 100644
--- a/ios/chrome/browser/lens_overlay/ui/lens_overlay_results_page_presenter.mm
+++ b/ios/chrome/browser/lens_overlay/ui/lens_overlay_results_page_presenter.mm
@@ -14,6 +14,7 @@
 #import "ios/chrome/browser/lens_overlay/ui/lens_overlay_results_page_presenter_delegate.h"
 #import "ios/chrome/browser/lens_overlay/ui/lens_result_page_view_controller.h"
 #import "ios/chrome/browser/shared/coordinator/scene/scene_state.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 namespace {
 
@@ -218,6 +219,9 @@
   _presentingAnimationInProgress = YES;
   [self monitorResultsBottomSheetPosition];
 
+  _presentationNavigationController.view.backgroundColor =
+      [UIColor colorNamed:kPrimaryBackgroundColor];
+
   __weak __typeof(self) weakSelf = self;
   [_baseViewController
       presentViewController:_presentationNavigationController
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.mm
index d08c294..41b9d04 100644
--- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.mm
+++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.mm
@@ -634,9 +634,6 @@
   self.logoVendor = ios::provider::CreateLogoVendor(browser, self.webState);
   self.NTPViewController = [componentFactory NTPViewController];
   self.headerViewController = [componentFactory headerViewController];
-  [self.headerViewController
-      setUserSignedIn:self.authService && self.authService->HasPrimaryIdentity(
-                                              signin::ConsentLevel::kSignin)];
   self.NTPMediator =
       [componentFactory NTPMediatorForBrowser:browser
                      identityDiscImageUpdater:self.headerViewController];
@@ -1464,10 +1461,6 @@
   }
   signin::PrimaryAccountChangeEvent::Type eventType =
       event.GetEventTypeFor(signin::ConsentLevel::kSignin);
-  [self.headerViewController
-      setUserSignedIn:eventType ==
-                      signin::PrimaryAccountChangeEvent::Type::kSet];
-
   switch (eventType) {
     case signin::PrimaryAccountChangeEvent::Type::kSet:
     case signin::PrimaryAccountChangeEvent::Type::kCleared: {
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.h b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.h
index a2c86d9..28e8bb8 100644
--- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.h
+++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.h
@@ -133,9 +133,6 @@
 // Sets the tabgroupIndicatorView.
 - (void)setTabGroupIndicatorView:(TabGroupIndicatorView*)view;
 
-// Sets the user signed-in status
-- (void)setUserSignedIn:(BOOL)signedIn;
-
 @end
 
 #endif  // IOS_CHROME_BROWSER_NTP_UI_BUNDLED_NEW_TAB_PAGE_HEADER_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.mm
index 403a0078..aba56e2 100644
--- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.mm
+++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.mm
@@ -97,11 +97,13 @@
 @property(nonatomic, strong) NSLayoutConstraint* fakeOmniboxHeightConstraint;
 @property(nonatomic, strong) NSLayoutConstraint* fakeOmniboxTopMarginConstraint;
 @property(nonatomic, strong) NSLayoutConstraint* headerViewHeightConstraint;
-@property(nonatomic, assign) BOOL logoFetched;
 
 // Whether the Google logo or doodle is being shown.
 @property(nonatomic, assign) BOOL logoIsShowing;
 
+// Whether or not the user is signed in.
+@property(nonatomic, assign) BOOL isSignedIn;
+
 @end
 
 @implementation NewTabPageHeaderViewController {
@@ -112,8 +114,6 @@
   NSLayoutConstraint* _identityDiscWidthConstraint;
   // Trailing Anchor for the identity disc button.
   NSLayoutConstraint* _identityDiscTrailingConstraint;
-  // Whether or not the user is signed in
-  BOOL _isSignedIn;
 }
 
 - (instancetype)initWithUseNewBadgeForLensButton:(BOOL)useNewBadgeForLensButton
@@ -372,14 +372,6 @@
   self.headerView.tabGroupIndicatorView = view;
 }
 
-- (void)setUserSignedIn:(BOOL)signedIn {
-  _isSignedIn = signedIn;
-  if (self.identityDiscButton) {
-    [self updateIdentityDiscConstraints];
-    [self updateIdentityDiscState];
-  }
-}
-
 #pragma mark - FakeboxButtonsSnapshotProvider
 
 - (UIView*)fakeboxButtonsSnapshot {
@@ -564,7 +556,7 @@
   DCHECK(self.identityDiscImage);
   DCHECK(self.identityDiscAccessibilityLabel);
 
-  if (!IsSignInButtonNoAvatarEnabled() || _isSignedIn) {
+  if (!IsSignInButtonNoAvatarEnabled() || self.isSignedIn) {
     [self.identityDiscButton setTitle:nil forState:UIControlStateNormal];
     [self.identityDiscButton setTitleColor:nil forState:UIControlStateNormal];
     [self.identityDiscButton setAttributedTitle:nil
@@ -863,6 +855,8 @@
   self.identityDiscImage = DefaultSymbolTemplateWithPointSize(
       kPersonCropCircleSymbol, ntp_home::kSignedOutIdentityIconSize);
 
+  self.isSignedIn = NO;
+
   self.identityDiscAccessibilityLabel = l10n_util::GetNSString(
       IDS_IOS_IDENTITY_DISC_SIGNED_OUT_ACCESSIBILITY_LABEL);
 
@@ -883,6 +877,8 @@
 
   self.identityDiscImage = image;
 
+  self.isSignedIn = YES;
+
   [self updateIdentityDiscAccessibilityLabelWithName:name email:email];
 }
 
@@ -929,11 +925,25 @@
 
 #pragma mark - Private
 
+- (void)setIsSignedIn:(BOOL)isSignedIn {
+  BOOL wasSignedIn = _isSignedIn;
+  _isSignedIn = isSignedIn;
+  if (wasSignedIn != _isSignedIn) {
+    [self updateIdentityDiscConstraints];
+    // `self.identityDiscButton` should not be updated if the view has not been
+    // created or initialized yet.
+    if (self.identityDiscButton && self.identityDiscImage &&
+        self.identityDiscAccessibilityLabel) {
+      [self updateIdentityDiscState];
+    }
+  }
+}
+
 // Activates or deactivates the identity disc constraints based on sign-in
 // state.
 - (void)updateIdentityDiscConstraints {
   BOOL showSignInButtonWithoutAvatar =
-      IsSignInButtonNoAvatarEnabled() && !_isSignedIn;
+      IsSignInButtonNoAvatarEnabled() && !self.isSignedIn;
 
   CGFloat dimension = ntp_home::kIdentityAvatarDimension +
                       kMarginMultiplier * ntp_home::kHeaderIconMargin;
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_mediator.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_mediator.mm
index 4cc50a1..5369514 100644
--- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_mediator.mm
+++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_mediator.mm
@@ -234,7 +234,8 @@
   if (info.gaia != GaiaId(_signedInIdentity.gaiaID)) {
     return;
   }
-  [self handleIdentityUpdated];
+  [self updateAccountImage];
+  [self updateAccountErrorBadge];
 }
 
 #pragma mark - PrefObserverDelegate
@@ -349,9 +350,4 @@
                              email:_signedInIdentity.userEmail];
 }
 
-- (void)handleIdentityUpdated {
-  [self updateAccountImage];
-  [self updateAccountErrorBadge];
-}
-
 @end
diff --git a/ios/chrome/browser/omnibox/model/BUILD.gn b/ios/chrome/browser/omnibox/model/BUILD.gn
index 3614d3f..8c00c25 100644
--- a/ios/chrome/browser/omnibox/model/BUILD.gn
+++ b/ios/chrome/browser/omnibox/model/BUILD.gn
@@ -16,15 +16,20 @@
     "omnibox_autocomplete_controller_debugger_delegate.h",
     "omnibox_autocomplete_controller_delegate.h",
     "omnibox_controller.h",
+    "omnibox_icon_formatter.h",
     "omnibox_image_fetcher.h",
     "omnibox_pedal.h",
     "omnibox_pedal_annotator.h",
     "omnibox_text_controller.h",
     "omnibox_text_controller_delegate.h",
     "pedal_section_extractor.h",
+    "pedal_suggestion_wrapper.h",
+    "suggest_action.h",
   ]
   deps = [
+    "//components/omnibox/browser",
     "//ios/chrome/browser/favicon/model",
+    "//ios/chrome/browser/omnibox/ui_bundled/popup:popup_icon",
     "//ios/chrome/browser/omnibox/ui_bundled/popup:popup_ui_protocols",
     "//ui/base:types",
   ]
@@ -37,10 +42,13 @@
     "autocomplete_suggestion_group_impl.mm",
     "omnibox_autocomplete_controller.mm",
     "omnibox_controller.mm",
+    "omnibox_icon_formatter.mm",
     "omnibox_image_fetcher.mm",
     "omnibox_pedal_annotator.mm",
     "omnibox_text_controller.mm",
     "pedal_section_extractor.mm",
+    "pedal_suggestion_wrapper.mm",
+    "suggest_action.mm",
   ]
   deps = [
     "//base",
@@ -57,7 +65,7 @@
     "//ios/chrome/browser/omnibox/ui_bundled:model_interface",
     "//ios/chrome/browser/omnibox/ui_bundled:omnibox_util",
     "//ios/chrome/browser/omnibox/ui_bundled/popup",
-    "//ios/chrome/browser/omnibox/ui_bundled/popup:popup_internal",
+    "//ios/chrome/browser/omnibox/ui_bundled/popup:popup_accessibility_identifier_constants",
     "//ios/chrome/browser/omnibox/ui_bundled/popup:popup_swift",
     "//ios/chrome/browser/omnibox/ui_bundled/popup:popup_ui_protocols",
     "//ios/chrome/browser/omnibox/ui_bundled/popup/row/actions",
@@ -101,7 +109,6 @@
     "//components/search_engines",
     "//components/search_engines:test_support",
     "//ios/chrome/browser/omnibox/ui_bundled/popup",
-    "//ios/chrome/browser/omnibox/ui_bundled/popup:popup_internal",
     "//ios/chrome/browser/omnibox/ui_bundled/popup:popup_swift",
     "//ios/chrome/browser/omnibox/ui_bundled/popup:popup_ui_protocols",
     "//ios/chrome/browser/search_engines/model:template_url_service_factory",
diff --git a/ios/chrome/browser/omnibox/model/autocomplete_match_formatter.mm b/ios/chrome/browser/omnibox/model/autocomplete_match_formatter.mm
index 560010b..98ec2ec 100644
--- a/ios/chrome/browser/omnibox/model/autocomplete_match_formatter.mm
+++ b/ios/chrome/browser/omnibox/model/autocomplete_match_formatter.mm
@@ -19,11 +19,11 @@
 #import "components/omnibox/browser/suggestion_answer.h"
 #import "components/omnibox/common/omnibox_feature_configs.h"
 #import "ios/chrome/browser/net/model/crurl.h"
+#import "ios/chrome/browser/omnibox/model/omnibox_icon_formatter.h"
+#import "ios/chrome/browser/omnibox/model/suggest_action.h"
 #import "ios/chrome/browser/omnibox/public/omnibox_ui_features.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/omnibox_util.h"
-#import "ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_icon_formatter.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/popup_swift.h"
-#import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/suggest_action.h"
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
 #import "ios/chrome/common/ui/colors/semantic_color_names.h"
diff --git a/ios/chrome/browser/omnibox/model/autocomplete_result_wrapper.mm b/ios/chrome/browser/omnibox/model/autocomplete_result_wrapper.mm
index 3fbbb75..d668922e 100644
--- a/ios/chrome/browser/omnibox/model/autocomplete_result_wrapper.mm
+++ b/ios/chrome/browser/omnibox/model/autocomplete_result_wrapper.mm
@@ -17,7 +17,7 @@
 #import "ios/chrome/browser/omnibox/model/autocomplete_suggestion_group_impl.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_pedal_annotator.h"
 #import "ios/chrome/browser/omnibox/model/pedal_section_extractor.h"
-#import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/suggest_action.h"
+#import "ios/chrome/browser/omnibox/model/suggest_action.h"
 #import "ios/chrome/browser/search_engines/model/search_engine_observer_bridge.h"
 #import "net/base/apple/url_conversions.h"
 
diff --git a/ios/chrome/browser/omnibox/model/autocomplete_result_wrapper_unittest.mm b/ios/chrome/browser/omnibox/model/autocomplete_result_wrapper_unittest.mm
index eb43574..a12ddc1 100644
--- a/ios/chrome/browser/omnibox/model/autocomplete_result_wrapper_unittest.mm
+++ b/ios/chrome/browser/omnibox/model/autocomplete_result_wrapper_unittest.mm
@@ -16,7 +16,7 @@
 #import "ios/chrome/browser/omnibox/model/autocomplete_match_formatter.h"
 #import "ios/chrome/browser/omnibox/model/autocomplete_result_wrapper_delegate.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_pedal_annotator.h"
-#import "ios/chrome/browser/omnibox/ui_bundled/popup/pedal_suggestion_wrapper.h"
+#import "ios/chrome/browser/omnibox/model/pedal_suggestion_wrapper.h"
 #import "ios/chrome/browser/search_engines/model/template_url_service_factory.h"
 #import "ios/chrome/browser/shared/model/profile/test/test_profile_ios.h"
 #import "ios/web/public/test/web_task_environment.h"
diff --git a/ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_icon_formatter.h b/ios/chrome/browser/omnibox/model/omnibox_icon_formatter.h
similarity index 62%
rename from ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_icon_formatter.h
rename to ios/chrome/browser/omnibox/model/omnibox_icon_formatter.h
index db1702aa..3a74abf 100644
--- a/ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_icon_formatter.h
+++ b/ios/chrome/browser/omnibox/model/omnibox_icon_formatter.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_OMNIBOX_UI_BUNDLED_POPUP_OMNIBOX_ICON_FORMATTER_H_
-#define IOS_CHROME_BROWSER_OMNIBOX_UI_BUNDLED_POPUP_OMNIBOX_ICON_FORMATTER_H_
+#ifndef IOS_CHROME_BROWSER_OMNIBOX_MODEL_OMNIBOX_ICON_FORMATTER_H_
+#define IOS_CHROME_BROWSER_OMNIBOX_MODEL_OMNIBOX_ICON_FORMATTER_H_
 
 #import <UIKit/UIKit.h>
 
@@ -17,4 +17,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_OMNIBOX_UI_BUNDLED_POPUP_OMNIBOX_ICON_FORMATTER_H_
+#endif  // IOS_CHROME_BROWSER_OMNIBOX_MODEL_OMNIBOX_ICON_FORMATTER_H_
diff --git a/ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_icon_formatter.mm b/ios/chrome/browser/omnibox/model/omnibox_icon_formatter.mm
similarity index 97%
rename from ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_icon_formatter.mm
rename to ios/chrome/browser/omnibox/model/omnibox_icon_formatter.mm
index a192272..7e7b876 100644
--- a/ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_icon_formatter.mm
+++ b/ios/chrome/browser/omnibox/model/omnibox_icon_formatter.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_icon_formatter.h"
+#import "ios/chrome/browser/omnibox/model/omnibox_icon_formatter.h"
 
 #import "base/notreached.h"
 #import "components/omnibox/browser/autocomplete_match.h"
diff --git a/ios/chrome/browser/omnibox/model/pedal_section_extractor.mm b/ios/chrome/browser/omnibox/model/pedal_section_extractor.mm
index f84cebe6..7dbc5a01 100644
--- a/ios/chrome/browser/omnibox/model/pedal_section_extractor.mm
+++ b/ios/chrome/browser/omnibox/model/pedal_section_extractor.mm
@@ -11,7 +11,7 @@
 #import "ios/chrome/browser/omnibox/model/autocomplete_suggestion.h"
 #import "ios/chrome/browser/omnibox/model/autocomplete_suggestion_group_impl.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_pedal.h"
-#import "ios/chrome/browser/omnibox/ui_bundled/popup/pedal_suggestion_wrapper.h"
+#import "ios/chrome/browser/omnibox/model/pedal_suggestion_wrapper.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/popup_match_preview_delegate.h"
 
 namespace {
diff --git a/ios/chrome/browser/omnibox/ui_bundled/popup/pedal_suggestion_wrapper.h b/ios/chrome/browser/omnibox/model/pedal_suggestion_wrapper.h
similarity index 70%
rename from ios/chrome/browser/omnibox/ui_bundled/popup/pedal_suggestion_wrapper.h
rename to ios/chrome/browser/omnibox/model/pedal_suggestion_wrapper.h
index a5d7918..b2e5875a 100644
--- a/ios/chrome/browser/omnibox/ui_bundled/popup/pedal_suggestion_wrapper.h
+++ b/ios/chrome/browser/omnibox/model/pedal_suggestion_wrapper.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_OMNIBOX_UI_BUNDLED_POPUP_PEDAL_SUGGESTION_WRAPPER_H_
-#define IOS_CHROME_BROWSER_OMNIBOX_UI_BUNDLED_POPUP_PEDAL_SUGGESTION_WRAPPER_H_
+#ifndef IOS_CHROME_BROWSER_OMNIBOX_MODEL_PEDAL_SUGGESTION_WRAPPER_H_
+#define IOS_CHROME_BROWSER_OMNIBOX_MODEL_PEDAL_SUGGESTION_WRAPPER_H_
 
 #import <UIKit/UIKit.h>
 
@@ -18,4 +18,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_OMNIBOX_UI_BUNDLED_POPUP_PEDAL_SUGGESTION_WRAPPER_H_
+#endif  // IOS_CHROME_BROWSER_OMNIBOX_MODEL_PEDAL_SUGGESTION_WRAPPER_H_
diff --git a/ios/chrome/browser/omnibox/ui_bundled/popup/pedal_suggestion_wrapper.mm b/ios/chrome/browser/omnibox/model/pedal_suggestion_wrapper.mm
similarity index 95%
rename from ios/chrome/browser/omnibox/ui_bundled/popup/pedal_suggestion_wrapper.mm
rename to ios/chrome/browser/omnibox/model/pedal_suggestion_wrapper.mm
index 6cec3d0d..8e64bd3 100644
--- a/ios/chrome/browser/omnibox/ui_bundled/popup/pedal_suggestion_wrapper.mm
+++ b/ios/chrome/browser/omnibox/model/pedal_suggestion_wrapper.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/omnibox/ui_bundled/popup/pedal_suggestion_wrapper.h"
+#import "ios/chrome/browser/omnibox/model/pedal_suggestion_wrapper.h"
 
 #import "base/notreached.h"
 #import "ios/chrome/common/ui/colors/semantic_color_names.h"
diff --git a/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/suggest_action.h b/ios/chrome/browser/omnibox/model/suggest_action.h
similarity index 84%
rename from ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/suggest_action.h
rename to ios/chrome/browser/omnibox/model/suggest_action.h
index f8d04d52..9490d601 100644
--- a/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/suggest_action.h
+++ b/ios/chrome/browser/omnibox/model/suggest_action.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_OMNIBOX_UI_BUNDLED_POPUP_ROW_ACTIONS_SUGGEST_ACTION_H_
-#define IOS_CHROME_BROWSER_OMNIBOX_UI_BUNDLED_POPUP_ROW_ACTIONS_SUGGEST_ACTION_H_
+#ifndef IOS_CHROME_BROWSER_OMNIBOX_MODEL_SUGGEST_ACTION_H_
+#define IOS_CHROME_BROWSER_OMNIBOX_MODEL_SUGGEST_ACTION_H_
 
 #import <UIKit/UIKit.h>
 
@@ -44,4 +44,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_OMNIBOX_UI_BUNDLED_POPUP_ROW_ACTIONS_SUGGEST_ACTION_H_
+#endif  // IOS_CHROME_BROWSER_OMNIBOX_MODEL_SUGGEST_ACTION_H_
diff --git a/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/suggest_action.mm b/ios/chrome/browser/omnibox/model/suggest_action.mm
similarity index 96%
rename from ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/suggest_action.mm
rename to ios/chrome/browser/omnibox/model/suggest_action.mm
index ec8b35f80..de1eef3 100644
--- a/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/suggest_action.mm
+++ b/ios/chrome/browser/omnibox/model/suggest_action.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/suggest_action.h"
+#import "ios/chrome/browser/omnibox/model/suggest_action.h"
 
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_popup_accessibility_identifier_constants.h"
 #import "ios/chrome/browser/shared/ui/symbols/symbols.h"
diff --git a/ios/chrome/browser/omnibox/ui_bundled/popup/BUILD.gn b/ios/chrome/browser/omnibox/ui_bundled/popup/BUILD.gn
index 070e1e3..03ddb96e 100644
--- a/ios/chrome/browser/omnibox/ui_bundled/popup/BUILD.gn
+++ b/ios/chrome/browser/omnibox/ui_bundled/popup/BUILD.gn
@@ -37,12 +37,9 @@
     "omnibox_popup_provider.h",
     "omnibox_popup_view_ios.h",
     "omnibox_popup_view_ios.mm",
-    "pedal_suggestion_wrapper.h",
-    "pedal_suggestion_wrapper.mm",
   ]
   deps = [
     ":popup_icon",
-    ":popup_internal",
     ":popup_swift",
     ":popup_ui",
     ":popup_ui_protocols",
@@ -181,29 +178,6 @@
   ]
 }
 
-source_set("popup_internal") {
-  sources = [
-    "omnibox_icon_formatter.h",
-    "omnibox_icon_formatter.mm",
-  ]
-  deps = [
-    ":popup_icon",
-    ":popup_swift",
-    ":popup_ui",
-    ":popup_ui_protocols",
-    "//base",
-    "//components/omnibox/browser",
-    "//ios/chrome/browser/net/model:crurl",
-    "//ios/chrome/browser/omnibox/public:features",
-    "//ios/chrome/browser/omnibox/ui_bundled:omnibox_util",
-    "//ios/chrome/browser/omnibox/ui_bundled/popup/row/actions",
-    "//ios/chrome/browser/shared/model/application_context",
-    "//ios/chrome/browser/shared/public/features",
-    "//ios/chrome/common/ui/colors",
-    "//ios/third_party/material_components_ios",
-  ]
-}
-
 source_set("popup_ui_protocols") {
   sources = [
     "autocomplete_result_consumer.h",
@@ -223,7 +197,6 @@
     ":popup",
     ":popup_accessibility_identifier_constants",
     ":popup_icon",
-    ":popup_internal",
     ":popup_swift",
     ":popup_ui",
     ":popup_ui_protocols",
diff --git a/ios/chrome/browser/omnibox/ui_bundled/popup/debugger/BUILD.gn b/ios/chrome/browser/omnibox/ui_bundled/popup/debugger/BUILD.gn
index e5a80d8..a57bef3 100644
--- a/ios/chrome/browser/omnibox/ui_bundled/popup/debugger/BUILD.gn
+++ b/ios/chrome/browser/omnibox/ui_bundled/popup/debugger/BUILD.gn
@@ -24,7 +24,6 @@
     "//components/omnibox/browser",
     "//components/variations",
     "//ios/chrome/browser/omnibox/model:ui_bundled_interface",
-    "//ios/chrome/browser/omnibox/ui_bundled/popup:popup_internal",
     "//ios/chrome/browser/shared/public/features:system_flags",
   ]
 }
@@ -46,7 +45,6 @@
     "//components/omnibox/browser",
     "//components/variations",
     "//ios/chrome/browser/omnibox/model:ui_bundled_interface",
-    "//ios/chrome/browser/omnibox/ui_bundled/popup:popup_internal",
     "//ios/chrome/browser/shared/ui/elements",
     "//ios/chrome/browser/shared/ui/symbols",
     "//ios/chrome/common/ui/util",
diff --git a/ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_popup_mediator.mm b/ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_popup_mediator.mm
index bc30d74..beb621b 100644
--- a/ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_popup_mediator.mm
+++ b/ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_popup_mediator.mm
@@ -36,12 +36,12 @@
 #import "ios/chrome/browser/omnibox/model/autocomplete_suggestion_group_impl.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_autocomplete_controller.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_image_fetcher.h"
+#import "ios/chrome/browser/omnibox/model/suggest_action.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/carousel/carousel_item.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/carousel/carousel_item_menu_provider.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_popup_mediator+Testing.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_popup_presenter.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/popup_swift.h"
-#import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/suggest_action.h"
 #import "ios/chrome/browser/shared/public/commands/application_commands.h"
 #import "ios/chrome/browser/shared/public/commands/open_new_tab_command.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
diff --git a/ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_popup_mediator_unittest.mm b/ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_popup_mediator_unittest.mm
index 1203622..7eb74f6 100644
--- a/ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_popup_mediator_unittest.mm
+++ b/ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_popup_mediator_unittest.mm
@@ -32,12 +32,12 @@
 #import "ios/chrome/browser/omnibox/model/autocomplete_suggestion_group_impl.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_image_fetcher.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_pedal.h"
+#import "ios/chrome/browser/omnibox/model/suggest_action.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/autocomplete_result_consumer.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/favicon_retriever.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/image_retriever.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_popup_mediator+Testing.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/popup_swift.h"
-#import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/suggest_action.h"
 #import "ios/chrome/browser/shared/model/profile/test/test_profile_ios.h"
 #import "ios/chrome/browser/shared/model/profile/test/test_profile_manager_ios.h"
 #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h"
diff --git a/ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_popup_view_controller.mm b/ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_popup_view_controller.mm
index 2d42633..5ef66b6 100644
--- a/ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_popup_view_controller.mm
+++ b/ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_popup_view_controller.mm
@@ -14,6 +14,7 @@
 #import "ios/chrome/browser/favicon/ui_bundled/favicon_attributes_with_payload.h"
 #import "ios/chrome/browser/net/model/crurl.h"
 #import "ios/chrome/browser/omnibox/model/autocomplete_suggestion.h"
+#import "ios/chrome/browser/omnibox/model/suggest_action.h"
 #import "ios/chrome/browser/omnibox/public/omnibox_ui_features.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/omnibox_constants.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/carousel/carousel_item.h"
@@ -23,7 +24,6 @@
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/popup_match_preview_delegate.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/omnibox_popup_actions_row_content_configuration.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/omnibox_popup_actions_row_delegate.h"
-#import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/suggest_action.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/row/omnibox_popup_row_content_configuration.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/row/omnibox_popup_row_delegate.h"
 #import "ios/chrome/browser/shared/public/features/system_flags.h"
diff --git a/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/BUILD.gn b/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/BUILD.gn
index 439bda1e..584d7e7 100644
--- a/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/BUILD.gn
+++ b/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/BUILD.gn
@@ -11,8 +11,6 @@
     "omnibox_popup_actions_row_content_view.h",
     "omnibox_popup_actions_row_content_view.mm",
     "omnibox_popup_actions_row_delegate.h",
-    "suggest_action.h",
-    "suggest_action.mm",
   ]
   deps = [
     "//components/omnibox/browser",
diff --git a/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/actions_view.mm b/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/actions_view.mm
index a0d3565a..b502556 100644
--- a/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/actions_view.mm
+++ b/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/actions_view.mm
@@ -4,9 +4,9 @@
 // found in the LICENSE file.
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/actions_view.h"
 
+#import "ios/chrome/browser/omnibox/model/suggest_action.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/omnibox_popup_actions_row_content_configuration.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/omnibox_popup_actions_row_delegate.h"
-#import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/suggest_action.h"
 #import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #import "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/omnibox_popup_actions_row_content_configuration.mm b/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/omnibox_popup_actions_row_content_configuration.mm
index 3e502b5..3b76e826 100644
--- a/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/omnibox_popup_actions_row_content_configuration.mm
+++ b/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/omnibox_popup_actions_row_content_configuration.mm
@@ -5,9 +5,9 @@
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/omnibox_popup_actions_row_content_configuration.h"
 
 #import "ios/chrome/browser/omnibox/model/autocomplete_suggestion.h"
+#import "ios/chrome/browser/omnibox/model/suggest_action.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/omnibox_popup_actions_row_content_view.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/omnibox_popup_actions_row_delegate.h"
-#import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/suggest_action.h"
 #import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "net/base/apple/url_conversions.h"
 
diff --git a/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/omnibox_popup_actions_row_content_view.mm b/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/omnibox_popup_actions_row_content_view.mm
index dd9ef92c..1a06555 100644
--- a/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/omnibox_popup_actions_row_content_view.mm
+++ b/ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/omnibox_popup_actions_row_content_view.mm
@@ -6,10 +6,10 @@
 
 #import "base/check.h"
 #import "base/metrics/histogram_functions.h"
+#import "ios/chrome/browser/omnibox/model/suggest_action.h"
 #import "ios/chrome/browser/omnibox/public/omnibox_ui_features.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/omnibox_icon_view.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/actions_view.h"
-#import "ios/chrome/browser/omnibox/ui_bundled/popup/row/actions/suggest_action.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/row/omnibox_popup_row_delegate.h"
 #import "ios/chrome/browser/omnibox/ui_bundled/popup/row/omnibox_popup_row_util.h"
 #import "ios/chrome/browser/shared/ui/elements/extended_touch_target_button.h"
diff --git a/ios/chrome/browser/partial_translate/ui_bundled/partial_translate_mediator.mm b/ios/chrome/browser/partial_translate/ui_bundled/partial_translate_mediator.mm
index 091fc25..d2b1e071 100644
--- a/ios/chrome/browser/partial_translate/ui_bundled/partial_translate_mediator.mm
+++ b/ios/chrome/browser/partial_translate/ui_bundled/partial_translate_mediator.mm
@@ -329,7 +329,8 @@
   // selection and updated on selection change.
   UIDeferredMenuElement* deferredMenuElement =
       [UIDeferredMenuElement elementWithProvider:provider];
-  edit_menu::AddElementToChromeMenu(builder, deferredMenuElement);
+  edit_menu::AddElementToChromeMenu(builder, deferredMenuElement,
+                                    /*primary*/ YES);
 
   auto childrenTransformBlock =
       ^NSArray<UIMenuElement*>*(NSArray<UIMenuElement*>* oldElements) {
diff --git a/ios/chrome/browser/policy/model/policy_watcher_browser_agent.mm b/ios/chrome/browser/policy/model/policy_watcher_browser_agent.mm
index 309b5a52..1d8cc0fb 100644
--- a/ios/chrome/browser/policy/model/policy_watcher_browser_agent.mm
+++ b/ios/chrome/browser/policy/model/policy_watcher_browser_agent.mm
@@ -114,14 +114,10 @@
       sign_out_in_progress_ = true;
       base::UmaHistogramBoolean("Enterprise.BrowserSigninIOS.SignedOutByPolicy",
                                 true);
-      base::WeakPtr<PolicyWatcherBrowserAgent> weak_ptr =
-          weak_factory_.GetWeakPtr();
-      signin::MultiProfileSignOut(
-          browser_, signin_metrics::ProfileSignout::kPrefChanged,
-          /*force_snackbar_over_toolbar=*/false, /*snackbar_message=*/nil,
-          ^{
-          },
-          /*should_record_metrics=*/false);
+      signin::ProfileSignoutRequest(
+          signin_metrics::ProfileSignout::kPrefChanged)
+          .SetShouldRecordMetrics(false)
+          .Run(browser_);
     }
   }
 }
diff --git a/ios/chrome/browser/push_notification/model/BUILD.gn b/ios/chrome/browser/push_notification/model/BUILD.gn
index aa83654..06b6ddd1 100644
--- a/ios/chrome/browser/push_notification/model/BUILD.gn
+++ b/ios/chrome/browser/push_notification/model/BUILD.gn
@@ -37,6 +37,7 @@
     "//ios/chrome/browser/commerce/model/push_notification",
     "//ios/chrome/browser/shared/model/profile",
     "//ios/chrome/browser/shared/model/profile:profile_keyed_service_factory",
+    "//ios/chrome/browser/shared/public/features",
     "//ios/chrome/browser/signin/model",
   ]
 }
@@ -65,6 +66,49 @@
   ]
 }
 
+source_set("push_notification_delegate") {
+  sources = [
+    "push_notification_delegate.h",
+    "push_notification_delegate.mm",
+  ]
+  deps = [
+    ":constants",
+    ":profile_service",
+    ":profile_service_factory",
+    ":push_notification_client_id",
+    ":push_notification_service",
+    ":push_notification_service_header",
+    ":push_notification_settings_util_header",
+    ":push_notification_util",
+    "//base",
+    "//components/prefs",
+    "//components/search_engines",
+    "//components/send_tab_to_self",
+    "//components/sync_device_info",
+    "//google_apis",
+    "//ios/chrome/app/application_delegate:app_state",
+    "//ios/chrome/app/profile",
+    "//ios/chrome/app/startup:startup_basic",
+    "//ios/chrome/browser/content_notification/model:content_notification_nau_configuration",
+    "//ios/chrome/browser/content_notification/model:content_notification_service",
+    "//ios/chrome/browser/content_notification/model:content_notification_service_factory",
+    "//ios/chrome/browser/content_notification/model:util",
+    "//ios/chrome/browser/shared/coordinator/scene:scene_state_header",
+    "//ios/chrome/browser/shared/coordinator/scene:scene_state_observer",
+    "//ios/chrome/browser/shared/model/application_context",
+    "//ios/chrome/browser/shared/model/browser",
+    "//ios/chrome/browser/shared/model/prefs:pref_names",
+    "//ios/chrome/browser/shared/model/profile",
+    "//ios/chrome/browser/shared/model/utils",
+    "//ios/chrome/browser/shared/public/commands",
+    "//ios/chrome/browser/shared/public/features",
+    "//ios/chrome/browser/signin/model:authentication_service",
+    "//ios/chrome/browser/signin/model:authentication_service_factory",
+    "//ios/chrome/browser/sync/model:device_info_sync_service_factory",
+    "//ios/chrome/common/app_group",
+  ]
+}
+
 source_set("push_notification_service") {
   sources = [
     "provisional_push_notification_util.h",
@@ -75,8 +119,6 @@
     "push_notification_client_manager.mm",
     "push_notification_configuration.h",
     "push_notification_configuration.mm",
-    "push_notification_delegate.h",
-    "push_notification_delegate.mm",
     "push_notification_service.mm",
     "push_notification_settings_util.mm",
   ]
diff --git a/ios/chrome/browser/push_notification/model/constants.h b/ios/chrome/browser/push_notification/model/constants.h
index ad4dc434..1212219 100644
--- a/ios/chrome/browser/push_notification/model/constants.h
+++ b/ios/chrome/browser/push_notification/model/constants.h
@@ -43,6 +43,42 @@
 };
 // LINT.ThenChange(/tools/metrics/histograms/metadata/ios/enums.xml)
 
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+// LINT.IfChange(PushNotificationClientManagerFailurePoint)
+enum class PushNotificationClientManagerFailurePoint {
+  // Failed to get Profile-based `PushNotificationClientManager` when handling
+  // foreground presentation.
+  kWillPresentNotification = 0,
+  // Failed to get Profile-based `PushNotificationClientManager` during APNS
+  // registration.
+  kDidRegisterWithAPNS = 1,
+  // Failed to get Profile-based `PushNotificationClientManager` when the app
+  // entered foreground.
+  kAppDidEnterForeground = 2,
+  // Failed to get Profile-based `PushNotificationClientManager` when handling a
+  // user interaction response.
+  kHandleNotificationResponse = 3,
+  // Failed to get Profile-based `PushNotificationClientManager` when processing
+  // an incoming remote notification
+  // in the background.
+  kWillProcessIncomingRemoteNotification = 4,
+  // Failed inside GetClientManagerForProfile because the input ProfileIOS* was
+  // nullptr.
+  kGetClientManagerNullProfileInput = 5,
+  // Failed inside GetClientManagerForProfile because the
+  // PushNotificationProfileService couldn't be retrieved.
+  kGetClientManagerMissingProfileService = 6,
+  // Failed inside GetClientManagerForUserInfo because the Profile name key was
+  // missing from user info dictionary.
+  kGetClientManagerMissingProfileNameInUserInfo = 7,
+  // Failed inside GetClientManagerForUserInfo because the Profile couldn't be
+  // found using the name from user info.
+  kGetClientManagerProfileNotFoundByName = 8,
+  kMaxValue = kGetClientManagerProfileNotFoundByName,
+};
+// LINT.ThenChange(/tools/metrics/histograms/metadata/ios/enums.xml:PushNotificationClientManagerFailurePoint)
+
 // Enum for the NAU implementation for Content notifications. Change
 // NotificationActionType enum when this one changes.
 typedef NS_ENUM(NSInteger, NAUActionType) {
@@ -135,4 +171,9 @@
 // for Send Tab notifications.
 extern NSString* const kPushNotificationClientIdKey;
 
+// Key used in UNNotificationContent.userInfo to store the Profile name that
+// originated the local notification. Used for mapping local notifications to
+// the correct Profile on the device.
+extern NSString* const kOriginatingProfileNameKey;
+
 #endif  // IOS_CHROME_BROWSER_PUSH_NOTIFICATION_MODEL_CONSTANTS_H_
diff --git a/ios/chrome/browser/push_notification/model/constants.mm b/ios/chrome/browser/push_notification/model/constants.mm
index d79929e..38768ba 100644
--- a/ios/chrome/browser/push_notification/model/constants.mm
+++ b/ios/chrome/browser/push_notification/model/constants.mm
@@ -33,3 +33,5 @@
 const int kDeliveredNAUMaxSendsPerSession = 30;
 
 NSString* const kPushNotificationClientIdKey = @"push_notification_client_id";
+
+NSString* const kOriginatingProfileNameKey = @"originating_profile_name";
diff --git a/ios/chrome/browser/push_notification/model/push_notification_client.h b/ios/chrome/browser/push_notification/model/push_notification_client.h
index b4cbd2a0..67673f43 100644
--- a/ios/chrome/browser/push_notification/model/push_notification_client.h
+++ b/ios/chrome/browser/push_notification/model/push_notification_client.h
@@ -31,12 +31,10 @@
 // framework for implementing push notification support. Feature teams that
 // intend to support push notifications should create a class that inherits from
 // the PushNotificationClient class.
-// TODO(crbug.com/325254943): Update this class and subclasses to accept an
-// injected ProfileIOS* and not internally fetch a profile via
-// GetlastUsedProfile. Update tests as well.
 class PushNotificationClient {
  public:
-  PushNotificationClient(PushNotificationClientId client_id);
+  PushNotificationClient(PushNotificationClientId client_id,
+                         PushNotificationClientScope scope);
   virtual ~PushNotificationClient() = 0;
 
   // When the user interacts with a push notification, this function is called
@@ -69,7 +67,10 @@
   virtual void OnSceneActiveForegroundBrowserReady();
 
   // Returns the feature's `client_id_`.
-  PushNotificationClientId GetClientId();
+  PushNotificationClientId GetClientId() const;
+
+  // Returns the feature's `client_scope_`.
+  PushNotificationClientScope GetClientScope() const;
 
   // Loads a url in a new tab once an active browser is ready.
   // TODO(crbug.com/41497027): This API should includes an identifier of the
@@ -101,7 +102,11 @@
   // their destination feature. This identifier must match the identifier
   // used inside the notification's payload when sending the notification to the
   // push notification server.
-  PushNotificationClientId client_id_;
+  const PushNotificationClientId client_id_;
+
+  // The operational scope of this client, indicating whether it's app-wide
+  // or per-Profile.
+  const PushNotificationClientScope client_scope_;
 
   // Returns an arbitrary profile amongst the currently loaded profile. This
   // means that this API is not safe when there are multiple profiles. Instead
@@ -115,6 +120,13 @@
   // SceneActivationLevelForegroundActive.
   Browser* GetSceneLevelForegroundActiveBrowser();
 
+  // Similar to `GetSceneLevelForegroundActiveBrowser()`, but specifically
+  // searches for a browser associated with the provided `profile`. Returns the
+  // first matching browser with scene level
+  // `SceneActivationLevelForegroundActive`, or `nullptr` if none exists for
+  // this profile.
+  Browser* GetSceneLevelForegroundActiveBrowserForProfile(ProfileIOS* profile);
+
  private:
   friend class ::CommercePushNotificationClientTest;
   std::vector<std::pair<GURL, base::OnceCallback<void(Browser*)>>>
diff --git a/ios/chrome/browser/push_notification/model/push_notification_client.mm b/ios/chrome/browser/push_notification/model/push_notification_client.mm
index f58a3cf3..5c6d58ba 100644
--- a/ios/chrome/browser/push_notification/model/push_notification_client.mm
+++ b/ios/chrome/browser/push_notification/model/push_notification_client.mm
@@ -22,15 +22,20 @@
 #import "ios/public/provider/chrome/browser/user_feedback/user_feedback_sender.h"
 
 PushNotificationClient::PushNotificationClient(
-    PushNotificationClientId client_id)
-    : client_id_(client_id) {}
+    PushNotificationClientId client_id,
+    PushNotificationClientScope client_scope)
+    : client_id_(client_id), client_scope_(client_scope) {}
 
 PushNotificationClient::~PushNotificationClient() = default;
 
-PushNotificationClientId PushNotificationClient::GetClientId() {
+PushNotificationClientId PushNotificationClient::GetClientId() const {
   return client_id_;
 }
 
+PushNotificationClientScope PushNotificationClient::GetClientScope() const {
+  return client_scope_;
+}
+
 void PushNotificationClient::OnSceneActiveForegroundBrowserReady() {
   if (!urls_delayed_for_loading_.size() && !feedback_presentation_delayed_) {
     return;
@@ -74,11 +79,18 @@
   }
 }
 
-// TODO(crbug.com/41497027): Current implementation returns any Scene. Instead
-// the notification should includes some way to identify the associated profile
-// to use (maybe by including the gaia id of the associated profile).
 Browser* PushNotificationClient::GetSceneLevelForegroundActiveBrowser() {
   ProfileIOS* profile = GetAnyProfile();
+
+  if (!profile) {
+    return nullptr;
+  }
+
+  return GetSceneLevelForegroundActiveBrowserForProfile(profile);
+}
+
+Browser* PushNotificationClient::GetSceneLevelForegroundActiveBrowserForProfile(
+    ProfileIOS* profile) {
   if (!profile) {
     return nullptr;
   }
@@ -93,6 +105,7 @@
       return browser;
     }
   }
+
   return nullptr;
 }
 
diff --git a/ios/chrome/browser/push_notification/model/push_notification_client_id.h b/ios/chrome/browser/push_notification/model/push_notification_client_id.h
index f0ed81e88..fbe3d40 100644
--- a/ios/chrome/browser/push_notification/model/push_notification_client_id.h
+++ b/ios/chrome/browser/push_notification/model/push_notification_client_id.h
@@ -29,4 +29,11 @@
 };
 // LINT.ThenChange(/tools/metrics/histograms/metadata/ios/enums.xml:PushNotificationClientId)
 
+// Specifies whether a push notification client (via PushNotificationClientId)
+// operates at the application level or is tied to a specific user Profile.
+enum class PushNotificationClientScope {
+  kAppWide,
+  kPerProfile,
+};
+
 #endif  // IOS_CHROME_BROWSER_PUSH_NOTIFICATION_MODEL_PUSH_NOTIFICATION_CLIENT_ID_H_
diff --git a/ios/chrome/browser/push_notification/model/push_notification_client_manager.h b/ios/chrome/browser/push_notification/model/push_notification_client_manager.h
index 8e1ce31..6b64b720c 100644
--- a/ios/chrome/browser/push_notification/model/push_notification_client_manager.h
+++ b/ios/chrome/browser/push_notification/model/push_notification_client_manager.h
@@ -11,11 +11,13 @@
 #import <memory>
 #import <unordered_map>
 
+#import "base/memory/raw_ptr.h"
 #import "base/memory/scoped_refptr.h"
 #import "base/task/sequenced_task_runner.h"
 #import "ios/chrome/browser/push_notification/model/push_notification_client.h"
 #import "ios/chrome/browser/push_notification/model/push_notification_client_id.h"
 
+class ProfileIOS;
 class PushNotificationClient;
 
 // A PushNotificationClientManager maintains a list of push notification enabled
@@ -24,9 +26,15 @@
 // the notification. The PushNotificationClientManager routes each notification
 // to its appropriate PushNotificationClient based on the incoming
 // notification's `push_notification_client_id` property.
-// TODO(crbug.com/325254943): Inject a profile to pass in to clients.
 class PushNotificationClientManager {
  public:
+  // Creates a Profile-scoped PushNotificationClientManager for notification
+  // clients that require a Profile-specific context.
+  explicit PushNotificationClientManager(
+      scoped_refptr<base::SequencedTaskRunner> task_runner,
+      ProfileIOS* profile);
+  // Creates an app-scoped PushNotificationClientManager for notification
+  // clients that operate independently of any specific Profile context.
   explicit PushNotificationClientManager(
       scoped_refptr<base::SequencedTaskRunner> task_runner);
   ~PushNotificationClientManager();
@@ -85,8 +93,25 @@
   void OnSceneActiveForegroundBrowserReady();
 
  private:
+  // Initializes and adds push notification clients that operate per-Profile
+  // (scope kPerProfile). Requires `profile_` to be non-null. Called during
+  // construction of per-Profile manager instances. Considers feature flags
+  // to determine which specific per-Profile clients to add.
+  void AddPerProfilePushNotificationClients();
+
+  // Initializes and adds push notification clients that operate app-wide
+  // (scope kAppWide). Requires `profile_` to be null. Called during
+  // construction of the app-wide manager instance. Considers feature flags
+  // to determine which specific app-wide clients to add.
+  void AddAppWidePushNotificationClients();
+
+  // Task runner used for scheduling asynchronous tasks.
   const scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
+  // Profile associated with this client manager, used to provide context
+  // for notification clients that require profile-specific data.
+  raw_ptr<ProfileIOS> profile_ = nullptr;
+
   using ClientMap = std::unordered_map<PushNotificationClientId,
                                        std::unique_ptr<PushNotificationClient>>;
   // A map of client ids to the features that support push notifications.
diff --git a/ios/chrome/browser/push_notification/model/push_notification_client_manager.mm b/ios/chrome/browser/push_notification/model/push_notification_client_manager.mm
index aa900bb7..4c300b90 100644
--- a/ios/chrome/browser/push_notification/model/push_notification_client_manager.mm
+++ b/ios/chrome/browser/push_notification/model/push_notification_client_manager.mm
@@ -10,7 +10,6 @@
 #import <vector>
 
 #import "base/feature_list.h"
-#import "base/task/sequenced_task_runner.h"
 #import "components/optimization_guide/core/optimization_guide_features.h"
 #import "components/send_tab_to_self/features.h"
 #import "ios/chrome/browser/commerce/model/push_notification/commerce_push_notification_client.h"
@@ -22,6 +21,7 @@
 #import "ios/chrome/browser/safety_check_notifications/model/safety_check_notification_client.h"
 #import "ios/chrome/browser/send_tab_to_self/model/send_tab_push_notification_client.h"
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
+#import "ios/chrome/browser/shared/model/profile/profile_ios.h"
 #import "ios/chrome/browser/shared/model/utils/first_run_util.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
 #import "ios/chrome/browser/tips_notifications/model/tips_notification_client.h"
@@ -29,42 +29,28 @@
 using send_tab_to_self::IsSendTabIOSPushNotificationsEnabledWithTabReminders;
 
 PushNotificationClientManager::PushNotificationClientManager(
+    scoped_refptr<base::SequencedTaskRunner> task_runner,
+    ProfileIOS* profile)
+    : task_runner_(std::move(task_runner)), profile_(profile) {
+  CHECK(task_runner_);
+  CHECK(profile_);
+  CHECK(IsIOSMultiProfilePushNotificationHandlingEnabled());
+
+  AddPerProfilePushNotificationClients();
+}
+
+PushNotificationClientManager::PushNotificationClientManager(
     scoped_refptr<base::SequencedTaskRunner> task_runner)
-    : task_runner_(task_runner) {
+    : task_runner_(std::move(task_runner)), profile_(nullptr) {
   CHECK(task_runner_);
 
-  if (optimization_guide::features::IsPushNotificationsEnabled()) {
-    AddPushNotificationClient(
-        std::make_unique<CommercePushNotificationClient>());
-  }
+  AddAppWidePushNotificationClients();
 
-  if (IsIOSTipsNotificationsEnabled() ||
-      (IsFirstRunRecent(base::Days(28)) &&
-       IsIOSReactivationNotificationsEnabled())) {
-    AddPushNotificationClient(std::make_unique<TipsNotificationClient>());
-  }
-
-  if (IsContentNotificationExperimentEnabled()) {
-    AddPushNotificationClient(std::make_unique<ContentNotificationClient>());
-  }
-
-  if (IsSafetyCheckNotificationsEnabled()) {
-    AddPushNotificationClient(std::make_unique<SafetyCheckNotificationClient>(
-        base::SequencedTaskRunner::GetCurrentDefault()));
-  }
-
-  if (base::FeatureList::IsEnabled(
-          send_tab_to_self::kSendTabToSelfIOSPushNotifications)) {
-    AddPushNotificationClient(
-        std::make_unique<SendTabPushNotificationClient>());
-    if (IsSendTabIOSPushNotificationsEnabledWithTabReminders()) {
-      ProfileManagerIOS* profile_manager =
-          GetApplicationContext()->GetProfileManager();
-      AddPushNotificationClient(
-          std::make_unique<ReminderNotificationClient>(profile_manager));
-    }
+  if (!IsIOSMultiProfilePushNotificationHandlingEnabled()) {
+    AddPerProfilePushNotificationClients();
   }
 }
+
 PushNotificationClientManager::~PushNotificationClientManager() = default;
 
 void PushNotificationClientManager::AddPushNotificationClient(
@@ -195,3 +181,69 @@
       return kReminderNotificationKey;
   }
 }
+
+// Adds clients that operate on a per-Profile basis.
+void PushNotificationClientManager::AddPerProfilePushNotificationClients() {
+  if (optimization_guide::features::IsPushNotificationsEnabled()) {
+    auto client = std::make_unique<CommercePushNotificationClient>();
+    CHECK_EQ(client->GetClientScope(),
+             PushNotificationClientScope::kPerProfile);
+    AddPushNotificationClient(std::move(client));
+  }
+
+  if (IsContentNotificationExperimentEnabled()) {
+    auto client = std::make_unique<ContentNotificationClient>();
+    CHECK_EQ(client->GetClientScope(),
+             PushNotificationClientScope::kPerProfile);
+    AddPushNotificationClient(std::move(client));
+  }
+
+  if (IsSafetyCheckNotificationsEnabled()) {
+    if (IsIOSMultiProfilePushNotificationHandlingEnabled() && profile_) {
+      // Pass profile and task runner for multi-profile handling.
+      auto client = std::make_unique<SafetyCheckNotificationClient>(
+          profile_, task_runner_);
+      CHECK_EQ(client->GetClientScope(),
+               PushNotificationClientScope::kPerProfile);
+      AddPushNotificationClient(std::move(client));
+    } else {
+      // Pass only task runner for single-profile or default handling.
+      auto client =
+          std::make_unique<SafetyCheckNotificationClient>(task_runner_);
+      CHECK_EQ(client->GetClientScope(),
+               PushNotificationClientScope::kPerProfile);
+      AddPushNotificationClient(std::move(client));
+    }
+  }
+
+  // Add Send Tab To Self client if its push notifications are enabled.
+  if (base::FeatureList::IsEnabled(
+          send_tab_to_self::kSendTabToSelfIOSPushNotifications)) {
+    auto client = std::make_unique<SendTabPushNotificationClient>();
+    CHECK_EQ(client->GetClientScope(),
+             PushNotificationClientScope::kPerProfile);
+    AddPushNotificationClient(std::move(client));
+
+    // Additionally, add Reminder client if STTS reminders are also enabled.
+    if (IsSendTabIOSPushNotificationsEnabledWithTabReminders()) {
+      ProfileManagerIOS* profile_manager =
+          GetApplicationContext()->GetProfileManager();
+      auto reminder_client =
+          std::make_unique<ReminderNotificationClient>(profile_manager);
+      CHECK_EQ(reminder_client->GetClientScope(),
+               PushNotificationClientScope::kPerProfile);
+      AddPushNotificationClient(std::move(reminder_client));
+    }
+  }
+}
+
+// Adds clients that operate app-wide.
+void PushNotificationClientManager::AddAppWidePushNotificationClients() {
+  if (IsIOSTipsNotificationsEnabled() ||
+      (IsFirstRunRecent(base::Days(28)) &&
+       IsIOSReactivationNotificationsEnabled())) {
+    auto client = std::make_unique<TipsNotificationClient>();
+    CHECK_EQ(client->GetClientScope(), PushNotificationClientScope::kAppWide);
+    AddPushNotificationClient(std::move(client));
+  }
+}
diff --git a/ios/chrome/browser/push_notification/model/push_notification_delegate.mm b/ios/chrome/browser/push_notification/model/push_notification_delegate.mm
index 5d855b66..a63498ca 100644
--- a/ios/chrome/browser/push_notification/model/push_notification_delegate.mm
+++ b/ios/chrome/browser/push_notification/model/push_notification_delegate.mm
@@ -13,9 +13,6 @@
 #import "base/timer/timer.h"
 #import "base/values.h"
 #import "components/prefs/pref_service.h"
-#import "components/search_engines/template_url.h"
-#import "components/search_engines/template_url_prepopulate_data.h"
-#import "components/search_engines/template_url_service.h"
 #import "components/send_tab_to_self/features.h"
 #import "components/sync_device_info/device_info_sync_service.h"
 #import "google_apis/gaia/gaia_id.h"
@@ -36,11 +33,11 @@
 #import "ios/chrome/browser/push_notification/model/push_notification_client_id.h"
 #import "ios/chrome/browser/push_notification/model/push_notification_client_manager.h"
 #import "ios/chrome/browser/push_notification/model/push_notification_configuration.h"
-#import "ios/chrome/browser/push_notification/model/push_notification_delegate.h"
+#import "ios/chrome/browser/push_notification/model/push_notification_profile_service.h"
+#import "ios/chrome/browser/push_notification/model/push_notification_profile_service_factory.h"
 #import "ios/chrome/browser/push_notification/model/push_notification_service.h"
 #import "ios/chrome/browser/push_notification/model/push_notification_settings_util.h"
 #import "ios/chrome/browser/push_notification/model/push_notification_util.h"
-#import "ios/chrome/browser/search_engines/model/template_url_service_factory.h"
 #import "ios/chrome/browser/shared/coordinator/scene/scene_state.h"
 #import "ios/chrome/browser/shared/coordinator/scene/scene_state_observer.h"
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
@@ -167,6 +164,86 @@
       ->SendNAUForConfiguration(config);
 }
 
+// Records a failure to access the PushNotificationClientManager at a specific
+// point.
+void RecordClientManagerAccessFailure(
+    PushNotificationClientManagerFailurePoint failure_point) {
+  base::UmaHistogramEnumeration(
+      "IOS.PushNotification.ClientManagerAccessFailure", failure_point);
+}
+
+// Helper function to get the profile-specific PushNotificationClientManager
+// directly from a ProfileIOS object. Returns nullptr if the manager cannot be
+// retrieved.
+PushNotificationClientManager* GetClientManagerForProfile(ProfileIOS* profile) {
+  CHECK(IsIOSMultiProfilePushNotificationHandlingEnabled());
+
+  if (!profile) {
+    RecordClientManagerAccessFailure(PushNotificationClientManagerFailurePoint::
+                                         kGetClientManagerNullProfileInput);
+
+    return nullptr;
+  }
+
+  PushNotificationProfileService* profile_service =
+      PushNotificationProfileServiceFactory::GetForProfile(profile);
+
+  if (!profile_service) {
+    RecordClientManagerAccessFailure(
+        PushNotificationClientManagerFailurePoint::
+            kGetClientManagerMissingProfileService);
+
+    return nullptr;
+  }
+
+  return profile_service->GetPushNotificationClientManager();
+}
+
+// Helper function to get the profile-specific PushNotificationClientManager
+// using userInfo containing the profile name. Returns nullptr if the profile
+// cannot be found or the manager cannot be retrieved.
+PushNotificationClientManager* GetClientManagerForUserInfo(
+    NSDictionary* user_info) {
+  CHECK(IsIOSMultiProfilePushNotificationHandlingEnabled());
+
+  NSString* profile_name_ns = user_info[kOriginatingProfileNameKey];
+
+  if (!profile_name_ns) {
+    RecordClientManagerAccessFailure(
+        PushNotificationClientManagerFailurePoint::
+            kGetClientManagerMissingProfileNameInUserInfo);
+
+    return nullptr;
+  }
+
+  std::string profile_name = base::SysNSStringToUTF8(profile_name_ns);
+
+  ProfileManagerIOS* profile_manager =
+      GetApplicationContext()->GetProfileManager();
+
+  ProfileIOS* profile = profile_manager->GetProfileWithName(profile_name);
+
+  if (!profile) {
+    // TODO(crbug.com/407999350): Enable PushNotificationClientManager to switch
+    // to potentially unloaded Profiles for proper notification handling.
+    // Replace this nullptr return with Profile loading functionality once
+    // implemented.
+    //
+    // Note: Currently, this metric is logged when the Profile matching
+    // `profile_name` is not already loaded. After the refactor described
+    // in the TODO above (to handle unloaded Profiles), this metric will
+    // signify that the Profile truly could not be found by name.
+    RecordClientManagerAccessFailure(
+        PushNotificationClientManagerFailurePoint::
+            kGetClientManagerProfileNotFoundByName);
+
+    return nullptr;
+  }
+
+  // Now that we have the profile, delegate to the other helper.
+  return GetClientManagerForProfile(profile);
+}
+
 }  // anonymous namespace
 
 @interface PushNotificationDelegate () <AppStateObserver,
@@ -224,15 +301,34 @@
                  completionHandler {
   [self recordLifeCycleEvent:PushNotificationLifecycleEvent::
                                  kNotificationForegroundPresentation];
-  // This method is invoked by iOS to process a notification that arrived while
-  // the app was running in the foreground.
-  auto* clientManager = GetApplicationContext()
-                            ->GetPushNotificationService()
-                            ->GetPushNotificationClientManager();
-  DCHECK(clientManager);
-  clientManager->HandleNotificationReception(
+
+  if (IsIOSMultiProfilePushNotificationHandlingEnabled()) {
+    PushNotificationClientManager* clientManager =
+        GetClientManagerForUserInfo(notification.request.content.userInfo);
+
+    if (clientManager) {
+      clientManager->HandleNotificationReception(
+          notification.request.content.userInfo);
+    } else {
+      RecordClientManagerAccessFailure(
+          PushNotificationClientManagerFailurePoint::kWillPresentNotification);
+    }
+  }
+
+  // This method is invoked by iOS to process a notification that arrived
+  // while the app was running in the foreground.
+  auto* appWideClientManager = GetApplicationContext()
+                                   ->GetPushNotificationService()
+                                   ->GetPushNotificationClientManager();
+  DCHECK(appWideClientManager);
+  appWideClientManager->HandleNotificationReception(
       notification.request.content.userInfo);
 
+  // Per Apple's guidance for delegate methods handling notifications: "You
+  // must execute [completionHandler] at some point…to let the system know that
+  // you are done." Therefore, `completionHandler` is always invoked below, even
+  // if a `PushNotificationClientManager` could not be found for the `Profile`,
+  // to avoid leaving the system in an indeterminate state.
   if (completionHandler) {
     // If the app is foregrounded, Send Tab push notifications should not be
     // displayed.
@@ -240,9 +336,13 @@
             intValue] == static_cast<int>(PushNotificationClientId::kSendTab) &&
         self.foregroundActiveScene) {
       completionHandler(UNNotificationPresentationOptionNone);
+    } else {
+      // TODO(crbug.com/408085973): Add PushNotificationDelegate unittest suite.
+      // Cover critical paths and error cases.
+      completionHandler(UNNotificationPresentationOptionBanner);
     }
-    completionHandler(UNNotificationPresentationOptionBanner);
   }
+
   base::UmaHistogramEnumeration(kAppLaunchSource,
                                 AppLaunchSource::NOTIFICATION);
 }
@@ -264,21 +364,50 @@
 
   double incomingNotificationTime =
       base::Time::Now().InSecondsFSinceUnixEpoch();
-  auto* clientManager = GetApplicationContext()
-                            ->GetPushNotificationService()
-                            ->GetPushNotificationClientManager();
-  DCHECK(clientManager);
+
+  UIBackgroundFetchResult profileResult = UIBackgroundFetchResultFailed;
+  UIBackgroundFetchResult appWideResult = UIBackgroundFetchResultFailed;
+  bool profileManagerCalledAndSuccessful = false;
+
+  if (IsIOSMultiProfilePushNotificationHandlingEnabled()) {
+    PushNotificationClientManager* clientManager =
+        GetClientManagerForUserInfo(userInfo);
+
+    if (clientManager) {
+      profileResult = clientManager->HandleNotificationReception(userInfo);
+
+      profileManagerCalledAndSuccessful = true;
+    } else {
+      RecordClientManagerAccessFailure(
+          PushNotificationClientManagerFailurePoint::
+              kWillProcessIncomingRemoteNotification);
+    }
+  }
+
+  // Always notify the app-wide client manager.
+  PushNotificationClientManager* appWideClientManager =
+      GetApplicationContext()
+          ->GetPushNotificationService()
+          ->GetPushNotificationClientManager();
+  DCHECK(appWideClientManager);
+  appWideResult = appWideClientManager->HandleNotificationReception(userInfo);
+
+  // Determine the final result to return.
+  // Prioritize the profile manager's result if it was found and called.
+  // Otherwise, use the app-wide manager's result.
   UIBackgroundFetchResult result =
-      clientManager->HandleNotificationReception(userInfo);
+      profileManagerCalledAndSuccessful ? profileResult : appWideResult;
 
   double processingTime =
       base::Time::Now().InSecondsFSinceUnixEpoch() - incomingNotificationTime;
+
   UmaHistogramCustomTimes(
       "IOS.PushNotification.IncomingNotificationProcessingTime",
       base::Milliseconds(processingTime),
       kTimeRangeIncomingNotificationHistogramMin,
       kTimeRangeIncomingNotificationHistogramMax,
       kTimeRangeHistogramBucketCount);
+
   return result;
 }
 
@@ -292,13 +421,30 @@
     return;
   }
 
+  if (IsIOSMultiProfilePushNotificationHandlingEnabled()) {
+    PushNotificationClientManager* clientManager =
+        GetClientManagerForProfile(profile);
+
+    // Gracefully handle the case where a clientManager couldn't be retrieved
+    // (e.g., if the Profile is `nullptr` or its service isn't available).
+    if (clientManager) {
+      // Registers Chrome's PushNotificationClients' Actionable Notifications
+      // with iOS.
+      clientManager->RegisterActionableNotifications();
+    } else {
+      RecordClientManagerAccessFailure(
+          PushNotificationClientManagerFailurePoint::kDidRegisterWithAPNS);
+    }
+  }
+
   PushNotificationService* notificationService =
       GetApplicationContext()->GetPushNotificationService();
 
   // Registers Chrome's PushNotificationClients' Actionable Notifications with
   // iOS.
-  notificationService->GetPushNotificationClientManager()
-      ->RegisterActionableNotifications();
+  PushNotificationClientManager* appWideClientManager =
+      notificationService->GetPushNotificationClientManager();
+  appWideClientManager->RegisterActionableNotifications();
 
   PushNotificationConfiguration* config =
       [[PushNotificationConfiguration alloc] init];
@@ -411,12 +557,25 @@
 
 // Notifies the client manager that the scene is "foreground active".
 - (void)appDidEnterForeground:(SceneState*)sceneState {
-  PushNotificationClientManager* clientManager =
+  if (IsIOSMultiProfilePushNotificationHandlingEnabled()) {
+    PushNotificationClientManager* clientManager =
+        GetClientManagerForProfile(sceneState.profileState.profile);
+
+    if (clientManager) {
+      clientManager->OnSceneActiveForegroundBrowserReady();
+    } else {
+      RecordClientManagerAccessFailure(
+          PushNotificationClientManagerFailurePoint::kAppDidEnterForeground);
+    }
+  }
+
+  PushNotificationClientManager* appWideClientManager =
       GetApplicationContext()
           ->GetPushNotificationService()
           ->GetPushNotificationClientManager();
-  DCHECK(clientManager);
-  clientManager->OnSceneActiveForegroundBrowserReady();
+  DCHECK(appWideClientManager);
+  appWideClientManager->OnSceneActiveForegroundBrowserReady();
+
   for (ProceduralBlock block in _runAfterForeground) {
     block();
   }
@@ -588,11 +747,25 @@
 - (void)handleNotificationResponse:(UNNotificationResponse*)response {
   DCHECK_GE(_appState.initStage,
             AppInitStage::kBrowserObjectsForBackgroundHandlers);
-  PushNotificationClientManager* clientManager =
+
+  if (IsIOSMultiProfilePushNotificationHandlingEnabled()) {
+    PushNotificationClientManager* clientManager = GetClientManagerForUserInfo(
+        response.notification.request.content.userInfo);
+
+    if (clientManager) {
+      clientManager->HandleNotificationInteraction(response);
+    } else {
+      RecordClientManagerAccessFailure(
+          PushNotificationClientManagerFailurePoint::
+              kHandleNotificationResponse);
+    }
+  }
+
+  PushNotificationClientManager* appWideClientManager =
       GetApplicationContext()
           ->GetPushNotificationService()
           ->GetPushNotificationClientManager();
-  clientManager->HandleNotificationInteraction(response);
+  appWideClientManager->HandleNotificationInteraction(response);
 }
 
 // Shows the app's notification settings in the first foreground active
diff --git a/ios/chrome/browser/push_notification/model/push_notification_profile_service.h b/ios/chrome/browser/push_notification/model/push_notification_profile_service.h
index 4bb8d78..d1f78fec 100644
--- a/ios/chrome/browser/push_notification/model/push_notification_profile_service.h
+++ b/ios/chrome/browser/push_notification/model/push_notification_profile_service.h
@@ -5,24 +5,33 @@
 #ifndef IOS_CHROME_BROWSER_PUSH_NOTIFICATION_MODEL_PUSH_NOTIFICATION_PROFILE_SERVICE_H_
 #define IOS_CHROME_BROWSER_PUSH_NOTIFICATION_MODEL_PUSH_NOTIFICATION_PROFILE_SERVICE_H_
 
+#import <memory>
+
 #import "base/files/file_path.h"
 #import "base/memory/raw_ptr.h"
 #import "components/keyed_service/core/keyed_service.h"
 #import "components/signin/public/identity_manager/identity_manager.h"
 
+class PushNotificationClientManager;
+
 // This is a KeyedService that encapsulates the push notification functionality
 // that is coupled with a user profile.
 class PushNotificationProfileService
     : public KeyedService,
       public signin::IdentityManager::Observer {
  public:
-  PushNotificationProfileService(signin::IdentityManager* identity_manager,
-                                 base::FilePath profile_state_path);
+  PushNotificationProfileService(
+      signin::IdentityManager* identity_manager,
+      std::unique_ptr<PushNotificationClientManager> client_manager,
+      base::FilePath profile_state_path);
   ~PushNotificationProfileService() override;
 
   // KeyedService
   void Shutdown() override;
 
+  // Returns PushNotificationProfileService's PushNotificationClientManager.
+  PushNotificationClientManager* GetPushNotificationClientManager();
+
   // signin::IdentityManager::Observer:
   void OnPrimaryAccountChanged(
       const signin::PrimaryAccountChangeEvent& event) override;
@@ -32,6 +41,10 @@
   // signout events.
   const raw_ptr<signin::IdentityManager> identity_manager_;
 
+  // The PushNotificationClientManager manages all interactions between the
+  // system and push notification enabled features.
+  std::unique_ptr<PushNotificationClientManager> client_manager_;
+
   // The path of the profile with which the PushNotificationProfileService
   // instance is associated.
   const base::FilePath profile_state_path_;
diff --git a/ios/chrome/browser/push_notification/model/push_notification_profile_service.mm b/ios/chrome/browser/push_notification/model/push_notification_profile_service.mm
index d5cd4b16..685f996 100644
--- a/ios/chrome/browser/push_notification/model/push_notification_profile_service.mm
+++ b/ios/chrome/browser/push_notification/model/push_notification_profile_service.mm
@@ -9,6 +9,7 @@
 #import "components/signin/public/identity_manager/primary_account_change_event.h"
 #import "ios/chrome/browser/commerce/model/price_alert_util.h"
 #import "ios/chrome/browser/push_notification/model/push_notification_account_context_manager.h"
+#import "ios/chrome/browser/push_notification/model/push_notification_client_manager.h"
 #import "ios/chrome/browser/push_notification/model/push_notification_service.h"
 #import "ios/chrome/browser/push_notification/model/push_notification_util.h"
 #import "ios/chrome/browser/shared/model/application_context/application_context.h"
@@ -42,8 +43,10 @@
 
 PushNotificationProfileService::PushNotificationProfileService(
     signin::IdentityManager* identity_manager,
+    std::unique_ptr<PushNotificationClientManager> client_manager,
     base::FilePath profile_state_path)
     : identity_manager_(identity_manager),
+      client_manager_(std::move(client_manager)),
       profile_state_path_(profile_state_path) {
   identity_manager->AddObserver(this);
 }
@@ -54,6 +57,11 @@
   identity_manager_->RemoveObserver(this);
 }
 
+PushNotificationClientManager*
+PushNotificationProfileService::GetPushNotificationClientManager() {
+  return client_manager_.get();
+}
+
 void PushNotificationProfileService::OnPrimaryAccountChanged(
     const signin::PrimaryAccountChangeEvent& event) {
   // This check prevents registering/unregistering accounts with the
diff --git a/ios/chrome/browser/push_notification/model/push_notification_profile_service_factory.mm b/ios/chrome/browser/push_notification/model/push_notification_profile_service_factory.mm
index 4086c25..9efae47a 100644
--- a/ios/chrome/browser/push_notification/model/push_notification_profile_service_factory.mm
+++ b/ios/chrome/browser/push_notification/model/push_notification_profile_service_factory.mm
@@ -4,11 +4,15 @@
 
 #import "ios/chrome/browser/push_notification/model/push_notification_profile_service_factory.h"
 
+#import "base/memory/scoped_refptr.h"
+#import "base/task/sequenced_task_runner.h"
 #import "ios/chrome/browser/commerce/model/price_alert_util.h"
 #import "ios/chrome/browser/commerce/model/push_notification/push_notification_feature.h"
+#import "ios/chrome/browser/push_notification/model/push_notification_client_manager.h"
 #import "ios/chrome/browser/push_notification/model/push_notification_profile_service.h"
 #import "ios/chrome/browser/push_notification/model/push_notification_service.h"
 #import "ios/chrome/browser/shared/model/profile/profile_ios.h"
+#import "ios/chrome/browser/shared/public/features/features.h"
 #import "ios/chrome/browser/signin/model/identity_manager_factory.h"
 
 // static
@@ -39,6 +43,17 @@
 PushNotificationProfileServiceFactory::BuildServiceInstanceFor(
     web::BrowserState* context) const {
   ProfileIOS* profile = ProfileIOS::FromBrowserState(context);
+
+  const scoped_refptr<base::SequencedTaskRunner> task_runner =
+      base::SequencedTaskRunner::GetCurrentDefault();
+
+  std::unique_ptr<PushNotificationClientManager> client_manager =
+      IsIOSMultiProfilePushNotificationHandlingEnabled()
+          ? std::make_unique<PushNotificationClientManager>(task_runner,
+                                                            profile)
+          : nullptr;
+
   return std::make_unique<PushNotificationProfileService>(
-      IdentityManagerFactory::GetForProfile(profile), profile->GetStatePath());
+      IdentityManagerFactory::GetForProfile(profile), std::move(client_manager),
+      profile->GetStatePath());
 }
diff --git a/ios/chrome/browser/push_notification/model/test_push_notification_client.mm b/ios/chrome/browser/push_notification/model/test_push_notification_client.mm
index 548985e..2ba892d 100644
--- a/ios/chrome/browser/push_notification/model/test_push_notification_client.mm
+++ b/ios/chrome/browser/push_notification/model/test_push_notification_client.mm
@@ -7,8 +7,8 @@
 #import "ios/chrome/browser/push_notification/model/push_notification_client_id.h"
 
 TestPushNotificationClient::TestPushNotificationClient(size_t client_id)
-    : PushNotificationClient(static_cast<PushNotificationClientId>(client_id)) {
-}
+    : PushNotificationClient(static_cast<PushNotificationClientId>(client_id),
+                             PushNotificationClientScope::kPerProfile) {}
 TestPushNotificationClient::~TestPushNotificationClient() = default;
 
 bool TestPushNotificationClient::HandleNotificationInteraction(
diff --git a/ios/chrome/browser/reader_mode/model/BUILD.gn b/ios/chrome/browser/reader_mode/model/BUILD.gn
index cb6fcf6..e464879 100644
--- a/ios/chrome/browser/reader_mode/model/BUILD.gn
+++ b/ios/chrome/browser/reader_mode/model/BUILD.gn
@@ -22,6 +22,7 @@
     "//components/ukm/ios:ukm_url_recorder",
     "//ios/chrome/browser/shared/model/profile",
     "//ios/chrome/browser/shared/model/url",
+    "//ios/chrome/browser/shared/public/features:system_flags",
     "//ios/web/public",
     "//ios/web/public/js_messaging",
     "//services/metrics/public/cpp:ukm_builders",
diff --git a/ios/chrome/browser/reader_mode/model/reader_mode_tab_helper.h b/ios/chrome/browser/reader_mode/model/reader_mode_tab_helper.h
index b22f1d8..970f366 100644
--- a/ios/chrome/browser/reader_mode/model/reader_mode_tab_helper.h
+++ b/ios/chrome/browser/reader_mode/model/reader_mode_tab_helper.h
@@ -41,6 +41,10 @@
  private:
   friend class web::WebStateUserData<ReaderModeTabHelper>;
 
+  // Determine if the page load is eligible for triggering the reader mode
+  // heuristic.
+  bool CanTriggerReaderModeHeuristic();
+
   // Trigger the heuristic to determine reader mode eligibility.
   void TriggerReaderModeHeuristic();
 
@@ -51,6 +55,7 @@
 
   raw_ptr<web::WebState> web_state_ = nullptr;
   base::OneShotTimer trigger_reader_mode_timer_;
+  GURL overridden_url_for_debug_;
   base::WeakPtrFactory<ReaderModeTabHelper> weak_ptr_factory_{this};
 
   WEB_STATE_USER_DATA_KEY_DECL();
diff --git a/ios/chrome/browser/reader_mode/model/reader_mode_tab_helper.mm b/ios/chrome/browser/reader_mode/model/reader_mode_tab_helper.mm
index 932aafd..3cbcf60f 100644
--- a/ios/chrome/browser/reader_mode/model/reader_mode_tab_helper.mm
+++ b/ios/chrome/browser/reader_mode/model/reader_mode_tab_helper.mm
@@ -5,6 +5,7 @@
 #import "ios/chrome/browser/reader_mode/model/reader_mode_tab_helper.h"
 
 #import "base/metrics/histogram_macros.h"
+#import "base/strings/sys_string_conversions.h"
 #import "base/strings/utf_string_conversions.h"
 #import "base/time/time.h"
 #import "components/dom_distiller/core/extraction_utils.h"
@@ -14,6 +15,7 @@
 #import "ios/chrome/browser/reader_mode/model/features.h"
 #import "ios/chrome/browser/reader_mode/model/reader_mode_java_script_feature.h"
 #import "ios/chrome/browser/shared/model/profile/profile_ios.h"
+#import "ios/chrome/browser/shared/public/features/system_flags.h"
 #import "ios/web/public/js_messaging/web_frames_manager.h"
 #import "ios/web/public/navigation/navigation_context.h"
 #import "services/metrics/public/cpp/ukm_builders.h"
@@ -22,23 +24,6 @@
 
 namespace {
 
-// Determine if the page load is eligible for triggering the reader mode
-// heuristic.
-bool CanTriggerReaderModeHeuristic() {
-  if (!base::FeatureList::IsEnabled(kEnableReaderModeDistillerHeuristic)) {
-    return false;
-  }
-  const double page_load_probability =
-      kReaderModeDistillerPageLoadProbability.Get();
-  if (page_load_probability <= 0.0 || page_load_probability > 1.0) {
-    // Invalid probability range. Disable the Reader Mode feature.
-    return false;
-  }
-
-  const double rand_double = base::RandDouble();
-  return rand_double < page_load_probability;
-}
-
 // Records the classification accuracy of the Reader Mode heuristic by
 // comparing the distillation of the page to the heuristic result.
 void RecordReaderModeHeuristicClassification(bool is_distillable_page,
@@ -146,6 +131,10 @@
     web::PageLoadCompletionStatus load_completion_status) {
   CHECK_EQ(web_state, web_state_);
   if (load_completion_status == web::PageLoadCompletionStatus::SUCCESS) {
+    // Reset the overridden URL state if there is a new navigation.
+    if (web_state_->GetVisibleURL() != overridden_url_for_debug_) {
+      overridden_url_for_debug_ = GURL();
+    }
     // Guarantee that there is only one trigger heuristic running at a time.
     if (trigger_reader_mode_timer_.IsRunning()) {
       trigger_reader_mode_timer_.Stop();
@@ -233,6 +222,27 @@
   }
 }
 
+bool ReaderModeTabHelper::CanTriggerReaderModeHeuristic() {
+  if (!base::FeatureList::IsEnabled(kEnableReaderModeDistillerHeuristic)) {
+    return false;
+  }
+  // If the Reader Mode HTML has already been overridden for this page, do not
+  // trigger the heuristic again.
+  if (experimental_flags::ShouldForceReaderModeDebugHTMLOverride() &&
+      overridden_url_for_debug_.spec() == web_state_->GetVisibleURL().spec()) {
+    return false;
+  }
+  const double page_load_probability =
+      kReaderModeDistillerPageLoadProbability.Get();
+  if (page_load_probability <= 0.0 || page_load_probability > 1.0) {
+    // Invalid probability range. Disable the Reader Mode feature.
+    return false;
+  }
+
+  const double rand_double = base::RandDouble();
+  return rand_double < page_load_probability;
+}
+
 void ReaderModeTabHelper::TriggerReaderModeHeuristic() {
   if (!CanTriggerReaderModeHeuristic()) {
     return;
@@ -282,6 +292,14 @@
   RecordReaderModeHeuristicClassification(is_distillable_page,
                                           heuristic_result);
   RecordReaderModeForAmpDistill(is_distillable_page, web_state_);
+
+  if (is_distillable_page &&
+      experimental_flags::ShouldForceReaderModeDebugHTMLOverride()) {
+    overridden_url_for_debug_ = web_state_->GetVisibleURL();
+    web_state_->LoadSimulatedRequest(
+        web_state_->GetVisibleURL(),
+        base::SysUTF8ToNSString(distiller_result->distilled_content().html()));
+  }
 }
 
 WEB_STATE_USER_DATA_KEY_IMPL(ReaderModeTabHelper)
diff --git a/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.mm b/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.mm
index 889a7e7..9422229 100644
--- a/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.mm
+++ b/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.mm
@@ -9,7 +9,8 @@
 
 ReminderNotificationClient::ReminderNotificationClient(
     ProfileManagerIOS* profile_manager)
-    : PushNotificationClient(PushNotificationClientId::kReminders) {
+    : PushNotificationClient(PushNotificationClientId::kReminders,
+                             PushNotificationClientScope::kPerProfile) {
   CHECK(profile_manager);
   profile_manager_observation_.Observe(profile_manager);
 }
diff --git a/ios/chrome/browser/safety_check_notifications/model/safety_check_notification_client.h b/ios/chrome/browser/safety_check_notifications/model/safety_check_notification_client.h
index fcc5bd03..0461340 100644
--- a/ios/chrome/browser/safety_check_notifications/model/safety_check_notification_client.h
+++ b/ios/chrome/browser/safety_check_notifications/model/safety_check_notification_client.h
@@ -9,6 +9,7 @@
 #import <UserNotifications/UserNotifications.h>
 
 #import "base/functional/callback_forward.h"
+#import "base/memory/raw_ptr.h"
 #import "base/memory/scoped_refptr.h"
 #import "base/memory/weak_ptr.h"
 #import "base/sequence_checker.h"
@@ -19,6 +20,7 @@
 #import "ios/chrome/browser/safety_check/model/ios_chrome_safety_check_manager_constants.h"
 
 class Browser;
+class ProfileIOS;
 
 // A push notification client for managing Safety Check-related notifications.
 // Observes Safety Check state changes to ensure notifications are accurate, and
@@ -27,8 +29,17 @@
     : public PushNotificationClient,
       public IOSChromeSafetyCheckManagerObserver {
  public:
+  // Constructs a SafetyCheckNotificationClient without specific Profile
+  // context. Use this when multi-Profile push notification handling
+  // (kIOSPushNotificationMultiProfile) is disabled (legacy behavior).
   explicit SafetyCheckNotificationClient(
       const scoped_refptr<base::SequencedTaskRunner> task_runner);
+  // Constructs a Profile-aware SafetyCheckNotificationClient. Use this when
+  // multi-Profile push notification handling (kIOSPushNotificationMultiProfile)
+  // is enabled, providing the associated `profile`.
+  explicit SafetyCheckNotificationClient(
+      ProfileIOS* profile,
+      const scoped_refptr<base::SequencedTaskRunner> task_runner);
   ~SafetyCheckNotificationClient() override;
 
   // `PushNotificationClient` overrides.
@@ -64,6 +75,13 @@
   void GetPendingRequests(NSArray<NSString*>* identifiers,
                           GetPendingRequestsCallback completion);
 
+  // Returns the active foreground browser relevant to this client's context.
+  // If multi-Profile handling is enabled, attempts to
+  // return the browser associated specifically with `profile_`. Otherwise,
+  // falls back to finding any active foreground browser. Returns nullptr if
+  // no suitable browser is found.
+  Browser* GetActiveForegroundBrowser();
+
   // Returns true if the user has enabled Safety Check notifications, either in
   // the Notifications Settings UI or through an opt-in prompt (e.g., Magic
   // Stack, Safety Check page, Password Checkup page).
@@ -153,6 +171,9 @@
   // be handled when there is a foreground scene.
   NSDictionary* interacted_notification_metadata_;
 
+  // The profile associated with this notification client.
+  raw_ptr<ProfileIOS> profile_ = nullptr;
+
   // Validates asynchronous `PushNotificationClient` events are evaluated on the
   // same sequence that `SafetyCheckNotificationClient` was created on.
   SEQUENCE_CHECKER(sequence_checker_);
diff --git a/ios/chrome/browser/safety_check_notifications/model/safety_check_notification_client.mm b/ios/chrome/browser/safety_check_notifications/model/safety_check_notification_client.mm
index 335e210..c7129b49 100644
--- a/ios/chrome/browser/safety_check_notifications/model/safety_check_notification_client.mm
+++ b/ios/chrome/browser/safety_check_notifications/model/safety_check_notification_client.mm
@@ -107,9 +107,23 @@
 
 SafetyCheckNotificationClient::SafetyCheckNotificationClient(
     const scoped_refptr<base::SequencedTaskRunner> task_runner)
-    : PushNotificationClient(PushNotificationClientId::kSafetyCheck),
+    : PushNotificationClient(PushNotificationClientId::kSafetyCheck,
+                             PushNotificationClientScope::kPerProfile),
       task_runner_(task_runner) {
   CHECK(task_runner);
+  CHECK(!IsIOSMultiProfilePushNotificationHandlingEnabled());
+}
+
+SafetyCheckNotificationClient::SafetyCheckNotificationClient(
+    ProfileIOS* profile,
+    const scoped_refptr<base::SequencedTaskRunner> task_runner)
+    : PushNotificationClient(PushNotificationClientId::kSafetyCheck,
+                             PushNotificationClientScope::kPerProfile),
+      profile_(profile),
+      task_runner_(task_runner) {
+  CHECK(profile_);
+  CHECK(task_runner);
+  CHECK(IsIOSMultiProfilePushNotificationHandlingEnabled());
 }
 
 SafetyCheckNotificationClient::~SafetyCheckNotificationClient() = default;
@@ -183,7 +197,7 @@
   // `IOSChromeSafetyCheckManager` before registering itself as an observer for
   // Safety Check updates.
   if (!IOSChromeSafetyCheckManagerObserver::IsInObserverList()) {
-    Browser* browser = GetSceneLevelForegroundActiveBrowser();
+    Browser* browser = GetActiveForegroundBrowser();
 
     if (!browser) {
       std::move(completion).Run();
@@ -304,6 +318,20 @@
       getPendingNotificationRequestsWithCompletionHandler:callback];
 }
 
+Browser* SafetyCheckNotificationClient::GetActiveForegroundBrowser() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  if (IsIOSMultiProfilePushNotificationHandlingEnabled()) {
+    // When multi-Profile handling is enabled, `profile_` should be set.
+    // This invariant is checked in the constructor used for this mode.
+    CHECK(profile_);
+
+    return GetSceneLevelForegroundActiveBrowserForProfile(profile_);
+  } else {
+    return GetSceneLevelForegroundActiveBrowser();
+  }
+}
+
 bool SafetyCheckNotificationClient::IsPermitted() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
@@ -328,7 +356,7 @@
 bool SafetyCheckNotificationClient::IsSceneLevelForegroundActive() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  return GetSceneLevelForegroundActiveBrowser() != nullptr;
+  return GetActiveForegroundBrowser() != nullptr;
 }
 
 void SafetyCheckNotificationClient::OnNotificationsCleared(
@@ -451,7 +479,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if ([interacted_notification_metadata_ count]) {
-    Browser* browser = GetSceneLevelForegroundActiveBrowser();
+    Browser* browser = GetActiveForegroundBrowser();
 
     if (browser) {
       [HandlerForProtocol(browser->GetCommandDispatcher(), ApplicationCommands)
@@ -481,6 +509,7 @@
     base::WeakPtr<Browser> weak_browser) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   Browser* browser = weak_browser.get();
+
   if (!browser) {
     // The Scene has been closed while preparing to present the notification.
     return;
diff --git a/ios/chrome/browser/saved_tab_groups/model/BUILD.gn b/ios/chrome/browser/saved_tab_groups/model/BUILD.gn
index cd39237..f9ba8ade 100644
--- a/ios/chrome/browser/saved_tab_groups/model/BUILD.gn
+++ b/ios/chrome/browser/saved_tab_groups/model/BUILD.gn
@@ -63,6 +63,7 @@
     ":model",
     "//base",
     "//components/keyed_service/core",
+    "//components/saved_tab_groups/public",
     "//ios/chrome/browser/collaboration/model:features",
     "//ios/chrome/browser/ntp/model",
     "//ios/chrome/browser/shared/model/profile",
diff --git a/ios/chrome/browser/saved_tab_groups/model/tab_group_service.h b/ios/chrome/browser/saved_tab_groups/model/tab_group_service.h
index 75e8850..dd064e109 100644
--- a/ios/chrome/browser/saved_tab_groups/model/tab_group_service.h
+++ b/ios/chrome/browser/saved_tab_groups/model/tab_group_service.h
@@ -5,14 +5,22 @@
 #ifndef IOS_CHROME_BROWSER_SAVED_TAB_GROUPS_MODEL_TAB_GROUP_SERVICE_H_
 #define IOS_CHROME_BROWSER_SAVED_TAB_GROUPS_MODEL_TAB_GROUP_SERVICE_H_
 
+#import <map>
+
 #import "base/memory/raw_ptr.h"
+#import "base/memory/weak_ptr.h"
 #import "components/keyed_service/core/keyed_service.h"
+#import "components/saved_tab_groups/public/types.h"
 #import "ios/chrome/browser/shared/model/web_state_list/web_state_list_groups_delegate.h"
 
 class ProfileIOS;
 class ShareKitService;
 class TabGroup;
 
+namespace collaboration {
+class IOSCollaborationControllerDelegate;
+}
+
 namespace tab_groups {
 class TabGroupSyncService;
 }  // namespace tab_groups
@@ -21,7 +29,7 @@
 class WebState;
 }  // namespace web
 
-// Service that manages models required to support
+// Service that manages all tab group-related functions.
 class TabGroupService : public KeyedService, public WebStateListGroupsDelegate {
  public:
   explicit TabGroupService(
@@ -36,6 +44,23 @@
   bool ShouldDeleteGroup(const TabGroup* group) override;
   std::unique_ptr<web::WebState> WebStateToAddToEmptyGroup() override;
 
+  // Registers a collaboration controller delegate for future access. Not all
+  // delegates will be registered. It is an error to register two delegate for
+  // the same group.
+  void RegisterCollaborationControllerDelegate(
+      tab_groups::LocalTabGroupID tab_group_id,
+      base::WeakPtr<collaboration::IOSCollaborationControllerDelegate>
+          controller_delegate);
+
+  // Unregisters a collaboration controller delegate. Registered delegate should
+  // call this at the end of their flow.
+  void UnregisterCollaborationControllerDelegate(
+      tab_groups::LocalTabGroupID tab_group_id);
+
+  // Returns the registered collaboration controller delegate, if any.
+  collaboration::IOSCollaborationControllerDelegate* GetDelegateForGroup(
+      tab_groups::LocalTabGroupID tab_group_id);
+
  private:
   // true if the group is shared.
   bool IsSharedGroup(const TabGroup* group);
@@ -48,6 +73,12 @@
 
   // The share kit service.
   raw_ptr<ShareKitService> share_kit_service_;
+
+  // The map holding the collaboration controller delegate with their associated
+  // tab group id.
+  std::map<tab_groups::LocalTabGroupID,
+           base::WeakPtr<collaboration::IOSCollaborationControllerDelegate>>
+      group_to_controller_delegate_;
 };
 
 #endif  // IOS_CHROME_BROWSER_SAVED_TAB_GROUPS_MODEL_TAB_GROUP_SERVICE_H_
diff --git a/ios/chrome/browser/saved_tab_groups/model/tab_group_service.mm b/ios/chrome/browser/saved_tab_groups/model/tab_group_service.mm
index 464552a..9d88b898 100644
--- a/ios/chrome/browser/saved_tab_groups/model/tab_group_service.mm
+++ b/ios/chrome/browser/saved_tab_groups/model/tab_group_service.mm
@@ -50,6 +50,25 @@
   return web_state;
 }
 
+void TabGroupService::RegisterCollaborationControllerDelegate(
+    tab_groups::LocalTabGroupID tab_group_id,
+    base::WeakPtr<collaboration::IOSCollaborationControllerDelegate>
+        controller_delegate) {
+  CHECK(!group_to_controller_delegate_.contains(tab_group_id),
+        base::NotFatalUntil::M142);
+  group_to_controller_delegate_[tab_group_id] = controller_delegate;
+}
+
+void TabGroupService::UnregisterCollaborationControllerDelegate(
+    tab_groups::LocalTabGroupID tab_group_id) {
+  group_to_controller_delegate_.erase(tab_group_id);
+}
+
+collaboration::IOSCollaborationControllerDelegate*
+TabGroupService::GetDelegateForGroup(tab_groups::LocalTabGroupID tab_group_id) {
+  return group_to_controller_delegate_[tab_group_id].get();
+}
+
 bool TabGroupService::IsSharedGroup(const TabGroup* group) {
   CHECK(group);
   return tab_groups::utils::IsTabGroupShared(group, tab_group_sync_service_);
diff --git a/ios/chrome/browser/saved_tab_groups/model/tab_group_service_factory.h b/ios/chrome/browser/saved_tab_groups/model/tab_group_service_factory.h
index 4ea85d4..7c7958f6 100644
--- a/ios/chrome/browser/saved_tab_groups/model/tab_group_service_factory.h
+++ b/ios/chrome/browser/saved_tab_groups/model/tab_group_service_factory.h
@@ -17,6 +17,8 @@
  public:
   static TabGroupServiceFactory* GetInstance();
   static TabGroupService* GetForProfile(ProfileIOS* profile);
+  // Returns the default factory, useful in tests where it's null by default.
+  static TestingFactory GetDefaultFactory();
 
  private:
   friend class base::NoDestructor<TabGroupServiceFactory>;
diff --git a/ios/chrome/browser/saved_tab_groups/model/tab_group_service_factory.mm b/ios/chrome/browser/saved_tab_groups/model/tab_group_service_factory.mm
index 59b800d..4862943 100644
--- a/ios/chrome/browser/saved_tab_groups/model/tab_group_service_factory.mm
+++ b/ios/chrome/browser/saved_tab_groups/model/tab_group_service_factory.mm
@@ -9,6 +9,24 @@
 #import "ios/chrome/browser/saved_tab_groups/model/tab_group_sync_service_factory.h"
 #import "ios/chrome/browser/shared/model/profile/profile_ios.h"
 
+namespace {
+
+// Creates the TabGroupService from `context`.
+std::unique_ptr<KeyedService> CreateService(web::BrowserState* context) {
+  ProfileIOS* profile = ProfileIOS::FromBrowserState(context);
+
+  if (!IsSharedTabGroupsJoinEnabled(profile) &&
+      !IsSharedTabGroupsCreateEnabled(profile)) {
+    return nullptr;
+  }
+
+  tab_groups::TabGroupSyncService* tab_group_sync_service =
+      tab_groups::TabGroupSyncServiceFactory::GetForProfile(profile);
+  return std::make_unique<TabGroupService>(profile, tab_group_sync_service);
+}
+
+}  // namespace
+
 // static
 TabGroupServiceFactory* TabGroupServiceFactory::GetInstance() {
   static base::NoDestructor<TabGroupServiceFactory> instance;
@@ -21,6 +39,12 @@
       profile, /*create=*/true);
 }
 
+// static
+BrowserStateKeyedServiceFactory::TestingFactory
+TabGroupServiceFactory::GetDefaultFactory() {
+  return base::BindRepeating(&CreateService);
+}
+
 TabGroupServiceFactory::TabGroupServiceFactory()
     : ProfileKeyedServiceFactoryIOS("TabGroupService",
                                     ServiceCreation::kCreateLazily,
@@ -32,14 +56,5 @@
 
 std::unique_ptr<KeyedService> TabGroupServiceFactory::BuildServiceInstanceFor(
     web::BrowserState* context) const {
-  ProfileIOS* profile = ProfileIOS::FromBrowserState(context);
-
-  if (!IsSharedTabGroupsJoinEnabled(profile) &&
-      !IsSharedTabGroupsCreateEnabled(profile)) {
-    return nullptr;
-  }
-
-  tab_groups::TabGroupSyncService* tab_group_sync_service =
-      tab_groups::TabGroupSyncServiceFactory::GetForProfile(profile);
-  return std::make_unique<TabGroupService>(profile, tab_group_sync_service);
+  return CreateService(context);
 }
diff --git a/ios/chrome/browser/search_with/ui_bundled/search_with_mediator.mm b/ios/chrome/browser/search_with/ui_bundled/search_with_mediator.mm
index 561b3027..a4524fc0 100644
--- a/ios/chrome/browser/search_with/ui_bundled/search_with_mediator.mm
+++ b/ios/chrome/browser/search_with/ui_bundled/search_with_mediator.mm
@@ -9,7 +9,6 @@
 #import "base/memory/raw_ptr.h"
 #import "base/memory/weak_ptr.h"
 #import "base/metrics/histogram_functions.h"
-#import "base/metrics/histogram_macros.h"
 #import "base/strings/sys_string_conversions.h"
 #import "components/search_engines/template_url.h"
 #import "components/search_engines/template_url_service.h"
@@ -57,7 +56,7 @@
 
 // Log the number of characters selected.
 void LogSelectedNumberChar(NSUInteger textLength) {
-  UMA_HISTOGRAM_COUNTS_1000("IOS.SearchWith.CharSelected", textLength);
+  base::UmaHistogramCounts1000("IOS.SearchWith.CharSelected", textLength);
 }
 
 }  // namespace
@@ -212,7 +211,8 @@
       };
   UIDeferredMenuElement* deferredMenuElement =
       [UIDeferredMenuElement elementWithProvider:provider];
-  edit_menu::AddElementToChromeMenu(builder, deferredMenuElement);
+  edit_menu::AddElementToChromeMenu(builder, deferredMenuElement,
+                                    /*primary*/ YES);
 }
 
 @end
diff --git a/ios/chrome/browser/send_tab_to_self/model/send_tab_push_notification_client.mm b/ios/chrome/browser/send_tab_to_self/model/send_tab_push_notification_client.mm
index bdba528..acf14789 100644
--- a/ios/chrome/browser/send_tab_to_self/model/send_tab_push_notification_client.mm
+++ b/ios/chrome/browser/send_tab_to_self/model/send_tab_push_notification_client.mm
@@ -39,7 +39,8 @@
 }  // namespace
 
 SendTabPushNotificationClient::SendTabPushNotificationClient()
-    : PushNotificationClient(PushNotificationClientId::kSendTab) {}
+    : PushNotificationClient(PushNotificationClientId::kSendTab,
+                             PushNotificationClientScope::kPerProfile) {}
 
 SendTabPushNotificationClient::~SendTabPushNotificationClient() = default;
 
diff --git a/ios/chrome/browser/settings/ui_bundled/clear_browsing_data/clear_browsing_data_table_view_controller.mm b/ios/chrome/browser/settings/ui_bundled/clear_browsing_data/clear_browsing_data_table_view_controller.mm
index 917c99b4..83070c9 100644
--- a/ios/chrome/browser/settings/ui_bundled/clear_browsing_data/clear_browsing_data_table_view_controller.mm
+++ b/ios/chrome/browser/settings/ui_bundled/clear_browsing_data/clear_browsing_data_table_view_controller.mm
@@ -679,7 +679,7 @@
                             view:itemView
         forceSnackbarOverToolbar:NO
                       withSource:signout_source_metric
-                      completion:^(BOOL success) {
+                      completion:^(BOOL success, SceneState* scene_state) {
                         [weakSelf handleAuthenticationOperationDidFinish];
                       }];
   _signoutCoordinator.showUnavailableFeatureDialogHeader = YES;
diff --git a/ios/chrome/browser/settings/ui_bundled/clear_browsing_data/quick_delete_browsing_data_coordinator.mm b/ios/chrome/browser/settings/ui_bundled/clear_browsing_data/quick_delete_browsing_data_coordinator.mm
index d30aabe3..8a39d3f 100644
--- a/ios/chrome/browser/settings/ui_bundled/clear_browsing_data/quick_delete_browsing_data_coordinator.mm
+++ b/ios/chrome/browser/settings/ui_bundled/clear_browsing_data/quick_delete_browsing_data_coordinator.mm
@@ -132,7 +132,7 @@
                             view:_viewController.view
         forceSnackbarOverToolbar:NO
                       withSource:signout_source_metric
-                      completion:^(BOOL success) {
+                      completion:^(BOOL success, SceneState* scene_state) {
                         [weakSelf handleAuthenticationOperationDidFinish];
                       }];
   _signoutCoordinator.showUnavailableFeatureDialogHeader = YES;
diff --git a/ios/chrome/browser/settings/ui_bundled/downloads/save_to_photos/save_to_photos_settings_mediator.mm b/ios/chrome/browser/settings/ui_bundled/downloads/save_to_photos/save_to_photos_settings_mediator.mm
index 47548af..3ce926c 100644
--- a/ios/chrome/browser/settings/ui_bundled/downloads/save_to_photos/save_to_photos_settings_mediator.mm
+++ b/ios/chrome/browser/settings/ui_bundled/downloads/save_to_photos/save_to_photos_settings_mediator.mm
@@ -138,23 +138,15 @@
 }
 
 - (void)onAccountsOnDeviceChanged {
-  [self handleIdentityListChanged];
+  [self updateConsumers];
 }
 
 - (void)onExtendedAccountInfoUpdated:(const AccountInfo&)info {
-  [self handleIdentityUpdated];
+  [self updateConsumers];
 }
 
 #pragma mark - Private
 
-- (void)handleIdentityListChanged {
-  [self updateConsumers];
-}
-
-- (void)handleIdentityUpdated {
-  [self updateConsumers];
-}
-
 // The Save to Photos settings UI will be displayed or removed depending on
 // whether the application's current state is configured to support Save to
 // Photos functionality.
diff --git a/ios/chrome/browser/settings/ui_bundled/google_services/google_services_settings_coordinator.mm b/ios/chrome/browser/settings/ui_bundled/google_services/google_services_settings_coordinator.mm
index 5be8584..1f7a621 100644
--- a/ios/chrome/browser/settings/ui_bundled/google_services/google_services_settings_coordinator.mm
+++ b/ios/chrome/browser/settings/ui_bundled/google_services/google_services_settings_coordinator.mm
@@ -194,7 +194,7 @@
   [self.signOutCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_CANCEL)
                                      action:^{
                                        [weakSelf dismissSignoutCoordinator];
-                                       completion(NO);
+                                       completion(NO, nil);
                                      }
                                       style:UIAlertActionStyleCancel];
   [self.signOutCoordinator start];
@@ -205,13 +205,13 @@
   DCHECK(completion);
   [self.googleServicesSettingsViewController preventUserInteraction];
   __weak GoogleServicesSettingsCoordinator* weakSelf = self;
-  signin::MultiProfileSignOut(
-      self.browser,
-      signin_metrics::ProfileSignout::kUserDisabledAllowChromeSignIn,
-      /*force_snackbar_over_toolbar=*/false, nil, ^{
+  signin::ProfileSignoutRequest(
+      signin_metrics::ProfileSignout::kUserDisabledAllowChromeSignIn)
+      .SetCompletionCallback(base::BindOnce(^(SceneState* scene_state) {
         [weakSelf.googleServicesSettingsViewController allowUserInteraction];
-        completion(YES);
-      });
+        completion(YES, scene_state);
+      }))
+      .Run(self.browser);
 }
 
 #pragma mark - GoogleServicesSettingsViewControllerPresentationDelegate
diff --git a/ios/chrome/browser/settings/ui_bundled/google_services/google_services_settings_mediator.mm b/ios/chrome/browser/settings/ui_bundled/google_services/google_services_settings_mediator.mm
index 0865a7e..bdef80e 100644
--- a/ios/chrome/browser/settings/ui_bundled/google_services/google_services_settings_mediator.mm
+++ b/ios/chrome/browser/settings/ui_bundled/google_services/google_services_settings_mediator.mm
@@ -465,7 +465,7 @@
         __weak GoogleServicesSettingsMediator* weakSelf = self;
         [self.commandHandler
             showSignOutFromTargetRect:targetRect
-                           completion:^(BOOL success) {
+                           completion:^(BOOL success, SceneState* scene_state) {
                              weakSelf.allowChromeSigninPreference.value =
                                  success ? value : !value;
                              [weakSelf
diff --git a/ios/chrome/browser/settings/ui_bundled/google_services/manage_accounts/legacy_accounts_table_egtest.mm b/ios/chrome/browser/settings/ui_bundled/google_services/manage_accounts/legacy_accounts_table_egtest.mm
index e5f5851..5d763b7 100644
--- a/ios/chrome/browser/settings/ui_bundled/google_services/manage_accounts/legacy_accounts_table_egtest.mm
+++ b/ios/chrome/browser/settings/ui_bundled/google_services/manage_accounts/legacy_accounts_table_egtest.mm
@@ -75,6 +75,7 @@
   AppLaunchConfiguration config = [super appConfigurationForTestCase];
 
   config.features_disabled.push_back(kIdentityDiscAccountMenu);
+  config.features_disabled.push_back(kSeparateProfilesForManagedAccounts);
 
   return config;
 }
diff --git a/ios/chrome/browser/settings/ui_bundled/google_services/manage_accounts/legacy_accounts_table_view_controller.mm b/ios/chrome/browser/settings/ui_bundled/google_services/manage_accounts/legacy_accounts_table_view_controller.mm
index 4ed92bf..67eb965b 100644
--- a/ios/chrome/browser/settings/ui_bundled/google_services/manage_accounts/legacy_accounts_table_view_controller.mm
+++ b/ios/chrome/browser/settings/ui_bundled/google_services/manage_accounts/legacy_accounts_table_view_controller.mm
@@ -602,7 +602,7 @@
                             view:itemView
         forceSnackbarOverToolbar:NO
                       withSource:metricSignOut
-                      completion:^(BOOL success) {
+                      completion:^(BOOL success, SceneState* scene_state) {
                         [weakSelf handleSignOutCompleted:success];
                       }];
   self.signoutCoordinator.delegate = self;
diff --git a/ios/chrome/browser/settings/ui_bundled/google_services/manage_accounts/manage_accounts_coordinator.mm b/ios/chrome/browser/settings/ui_bundled/google_services/manage_accounts/manage_accounts_coordinator.mm
index e3a1b66..5ed7ebde 100644
--- a/ios/chrome/browser/settings/ui_bundled/google_services/manage_accounts/manage_accounts_coordinator.mm
+++ b/ios/chrome/browser/settings/ui_bundled/google_services/manage_accounts/manage_accounts_coordinator.mm
@@ -292,7 +292,7 @@
                             view:itemView
         forceSnackbarOverToolbar:NO
                       withSource:metricSignOut
-                      completion:^(BOOL success) {
+                      completion:^(BOOL success, SceneState* scene_state) {
                         [weakSelf handleSignOutCompleted:success];
                       }];
   _signoutCoordinator.delegate = self;
diff --git a/ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_coordinator.mm b/ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_coordinator.mm
index 253ab33..4c946b8 100644
--- a/ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_coordinator.mm
+++ b/ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_coordinator.mm
@@ -417,7 +417,7 @@
                             view:self.viewController.view
         forceSnackbarOverToolbar:NO
                       withSource:metricSignOut
-                      completion:^(BOOL success) {
+                      completion:^(BOOL success, SceneState* scene_state) {
                         [weakSelf handleSignOutCompleted:success];
                       }];
   self.signoutActionSheetCoordinator.delegate = self;
diff --git a/ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_mediator.mm b/ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_mediator.mm
index cbda6f6..f7abec4b 100644
--- a/ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_mediator.mm
+++ b/ios/chrome/browser/settings/ui_bundled/google_services/manage_sync_settings_mediator.mm
@@ -753,17 +753,6 @@
 
 #pragma mark - Private
 
-- (void)handleIdentityUpdated:(id<SystemIdentity>)identity {
-  if ([_signedInIdentity isEqual:identity]) {
-    [self updatePrimaryAccountDetails];
-    [self updateSyncItemsNotifyConsumer:YES];
-    [self updateSyncErrorsSection:YES];
-    [self updateBatchUploadSectionWithNotifyConsumer:YES firstLoad:NO];
-    [self updateEncryptionItem:YES];
-    [self fetchLocalDataDescriptionsForBatchUploadWithFirstLoad:NO];
-  }
-}
-
 // Creates a SyncSwitchItem or TableViewInfoButtonItem instance if the item is
 // managed.
 - (TableViewItem*)tableViewItemWithDataType:
@@ -943,7 +932,14 @@
 - (void)onExtendedAccountInfoUpdated:(const AccountInfo&)info {
   id<SystemIdentity> identity =
       _chromeAccountManagerService->GetIdentityOnDeviceWithGaiaID(info.gaia);
-  [self handleIdentityUpdated:identity];
+  if ([_signedInIdentity isEqual:identity]) {
+    [self updatePrimaryAccountDetails];
+    [self updateSyncItemsNotifyConsumer:YES];
+    [self updateSyncErrorsSection:YES];
+    [self updateBatchUploadSectionWithNotifyConsumer:YES firstLoad:NO];
+    [self updateEncryptionItem:YES];
+    [self fetchLocalDataDescriptionsForBatchUploadWithFirstLoad:NO];
+  }
 }
 
 - (void)onPrimaryAccountChanged:
diff --git a/ios/chrome/browser/settings/ui_bundled/settings_table_view_controller.mm b/ios/chrome/browser/settings/ui_bundled/settings_table_view_controller.mm
index d5353f6..942ea0a 100644
--- a/ios/chrome/browser/settings/ui_bundled/settings_table_view_controller.mm
+++ b/ios/chrome/browser/settings/ui_bundled/settings_table_view_controller.mm
@@ -1476,12 +1476,6 @@
   _manageSyncSettingsCoordinator = nil;
 }
 
-- (void)handleIdentityUpdated:(id<SystemIdentity>)identity {
-  if ([_identity isEqual:identity]) {
-    [self reloadAccountCell];
-  }
-}
-
 - (void)showGoogleServices {
   if (_googleServicesSettingsCoordinator &&
       self.navigationController.topViewController != self) {
@@ -2392,7 +2386,9 @@
 - (void)onExtendedAccountInfoUpdated:(const AccountInfo&)info {
   id<SystemIdentity> identity =
       _accountManagerService->GetIdentityOnDeviceWithGaiaID(info.gaia);
-  [self handleIdentityUpdated:identity];
+  if ([_identity isEqual:identity]) {
+    [self reloadAccountCell];
+  }
 }
 
 #pragma mark - UIAdaptivePresentationControllerDelegate
diff --git a/ios/chrome/browser/share_kit/model/BUILD.gn b/ios/chrome/browser/share_kit/model/BUILD.gn
index 925a48ed..b8bf846 100644
--- a/ios/chrome/browser/share_kit/model/BUILD.gn
+++ b/ios/chrome/browser/share_kit/model/BUILD.gn
@@ -53,6 +53,7 @@
     "//ios/chrome/browser/collaboration/model:features",
     "//ios/chrome/browser/data_sharing/model",
     "//ios/chrome/browser/saved_tab_groups/model",
+    "//ios/chrome/browser/saved_tab_groups/model:tab_group_service",
     "//ios/chrome/browser/shared/model/profile",
     "//ios/chrome/browser/shared/model/profile:profile_keyed_service_factory",
     "//ios/chrome/browser/signin/model",
diff --git a/ios/chrome/browser/share_kit/model/share_kit_service_configuration.h b/ios/chrome/browser/share_kit/model/share_kit_service_configuration.h
index 4e3addd..2a60f76 100644
--- a/ios/chrome/browser/share_kit/model/share_kit_service_configuration.h
+++ b/ios/chrome/browser/share_kit/model/share_kit_service_configuration.h
@@ -24,6 +24,7 @@
 }  // namespace tab_groups
 
 class AuthenticationService;
+class TabGroupService;
 
 // Configuration object used by the ShareKitService.
 struct ShareKitServiceConfiguration {
@@ -32,7 +33,8 @@
       raw_ptr<AuthenticationService> authentication_service,
       raw_ptr<data_sharing::DataSharingService> data_sharing_service,
       raw_ptr<collaboration::CollaborationService> collaboration_service,
-      raw_ptr<tab_groups::TabGroupSyncService> sync_service);
+      raw_ptr<tab_groups::TabGroupSyncService> sync_service,
+      raw_ptr<TabGroupService> tab_group_service);
   ShareKitServiceConfiguration(const ShareKitServiceConfiguration&) = delete;
   ShareKitServiceConfiguration& operator=(const ShareKitServiceConfiguration&) =
       delete;
@@ -52,6 +54,9 @@
 
   // The service to handle tab group sync.
   raw_ptr<tab_groups::TabGroupSyncService> sync_service;
+
+  // The service related to tab groups.
+  raw_ptr<TabGroupService> tab_group_service;
 };
 
 #endif  // IOS_CHROME_BROWSER_SHARE_KIT_MODEL_SHARE_KIT_SERVICE_CONFIGURATION_H_
diff --git a/ios/chrome/browser/share_kit/model/share_kit_service_configuration.mm b/ios/chrome/browser/share_kit/model/share_kit_service_configuration.mm
index 559aa49..a2c6891 100644
--- a/ios/chrome/browser/share_kit/model/share_kit_service_configuration.mm
+++ b/ios/chrome/browser/share_kit/model/share_kit_service_configuration.mm
@@ -9,11 +9,13 @@
     raw_ptr<AuthenticationService> authentication_service,
     raw_ptr<data_sharing::DataSharingService> data_sharing_service,
     raw_ptr<collaboration::CollaborationService> collaboration_service,
-    raw_ptr<tab_groups::TabGroupSyncService> sync_service)
+    raw_ptr<tab_groups::TabGroupSyncService> sync_service,
+    raw_ptr<TabGroupService> tab_group_service)
     : identity_manager(identity_manager),
       authentication_service(authentication_service),
       data_sharing_service(data_sharing_service),
       collaboration_service(collaboration_service),
-      sync_service(sync_service) {}
+      sync_service(sync_service),
+      tab_group_service(tab_group_service) {}
 
 ShareKitServiceConfiguration::~ShareKitServiceConfiguration() = default;
diff --git a/ios/chrome/browser/share_kit/model/share_kit_service_factory.mm b/ios/chrome/browser/share_kit/model/share_kit_service_factory.mm
index 75c64aeb..24e24b21 100644
--- a/ios/chrome/browser/share_kit/model/share_kit_service_factory.mm
+++ b/ios/chrome/browser/share_kit/model/share_kit_service_factory.mm
@@ -8,6 +8,7 @@
 #import "ios/chrome/browser/collaboration/model/collaboration_service_factory.h"
 #import "ios/chrome/browser/collaboration/model/features.h"
 #import "ios/chrome/browser/data_sharing/model/data_sharing_service_factory.h"
+#import "ios/chrome/browser/saved_tab_groups/model/tab_group_service_factory.h"
 #import "ios/chrome/browser/saved_tab_groups/model/tab_group_sync_service_factory.h"
 #import "ios/chrome/browser/share_kit/model/share_kit_service.h"
 #import "ios/chrome/browser/share_kit/model/share_kit_service_configuration.h"
@@ -38,6 +39,7 @@
   DependsOn(data_sharing::DataSharingServiceFactory::GetInstance());
   DependsOn(collaboration::CollaborationServiceFactory::GetInstance());
   DependsOn(tab_groups::TabGroupSyncServiceFactory::GetInstance());
+  DependsOn(TabGroupServiceFactory::GetInstance());
 }
 
 ShareKitServiceFactory::~ShareKitServiceFactory() = default;
@@ -57,6 +59,8 @@
       tab_groups::TabGroupSyncServiceFactory::GetForProfile(profile);
   collaboration::CollaborationService* collaboration_service =
       collaboration::CollaborationServiceFactory::GetForProfile(profile);
+  TabGroupService* tab_group_service =
+      TabGroupServiceFactory::GetForProfile(profile);
 
   // Give the opportunity for the test hook to override the service from
   // the provider (allowing EG tests to use a test ShareKitService).
@@ -69,6 +73,7 @@
       std::make_unique<ShareKitServiceConfiguration>(
           IdentityManagerFactory::GetForProfile(profile),
           AuthenticationServiceFactory::GetForProfile(profile),
-          data_sharing_service, collaboration_service, sync_service);
+          data_sharing_service, collaboration_service, sync_service,
+          tab_group_service);
   return ios::provider::CreateShareKitService(std::move(configuration));
 }
diff --git a/ios/chrome/browser/share_kit/model/test_share_kit_service.h b/ios/chrome/browser/share_kit/model/test_share_kit_service.h
index a14965f..a400a077 100644
--- a/ios/chrome/browser/share_kit/model/test_share_kit_service.h
+++ b/ios/chrome/browser/share_kit/model/test_share_kit_service.h
@@ -11,6 +11,7 @@
 
 #import "base/memory/weak_ptr.h"
 #import "components/data_sharing/public/protocol/group_data.pb.h"
+#import "components/saved_tab_groups/public/tab_group_sync_service.h"
 #import "components/saved_tab_groups/public/types.h"
 #import "ios/chrome/browser/share_kit/model/share_kit_service.h"
 
@@ -22,10 +23,6 @@
 class DataSharingService;
 }  // namespace data_sharing
 
-namespace tab_groups {
-class TabGroupSyncService;
-}  // namespace tab_groups
-
 // Test implementation of the ShareKitService.
 class TestShareKitService : public ShareKitService {
  public:
@@ -74,12 +71,22 @@
                                         base::Uuid group_guid,
                                         NSString* collab_id);
 
+  // Used as a callback called when a group `saved_group_guid` is shared.
+  // `result` represents if sharing a group succeeded.
+  void ProcessTabGroupSharingResult(
+      base::Uuid saved_group_guid,
+      tab_groups::TabGroupSyncService::TabGroupSharingResult result);
+
   // Map containing the role of `foo1` identity for each group, based on its
   // collaboration id.
   std::map<std::string, data_sharing_pb::MemberRole> group_to_membership_;
 
   raw_ptr<data_sharing::DataSharingService> data_sharing_service_;
   raw_ptr<tab_groups::TabGroupSyncService> tab_group_sync_service_;
+
+  // The set of group ID that is being shared.
+  std::set<base::Uuid> processing_group_guids_;
+
   base::WeakPtrFactory<TestShareKitService> weak_pointer_factory_{this};
 };
 
diff --git a/ios/chrome/browser/share_kit/model/test_share_kit_service.mm b/ios/chrome/browser/share_kit/model/test_share_kit_service.mm
index f0be374..11efdce 100644
--- a/ios/chrome/browser/share_kit/model/test_share_kit_service.mm
+++ b/ios/chrome/browser/share_kit/model/test_share_kit_service.mm
@@ -10,7 +10,6 @@
 #import "components/data_sharing/public/data_sharing_service.h"
 #import "components/saved_tab_groups/public/collaboration_finder.h"
 #import "components/saved_tab_groups/public/saved_tab_group.h"
-#import "components/saved_tab_groups/public/tab_group_sync_service.h"
 #import "ios/chrome/browser/data_sharing/model/data_sharing_sdk_delegate_ios.h"
 #import "ios/chrome/browser/data_sharing/model/data_sharing_ui_delegate_ios.h"
 #import "ios/chrome/browser/share_kit/model/fake_share_kit_flow_view_controller.h"
@@ -298,10 +297,11 @@
     chrome_test_util::AddCollaborationGroupToFakeServer(
         collaboration_id.value());
     chrome_test_util::TriggerSyncCycle(syncer::COLLABORATION_GROUP);
-    // TODO(crbug.com/382557489): implement the callback.
     tab_group_sync_service_->MakeTabGroupShared(
         tab_group_id, collaboration_id.value(),
-        tab_groups::TabGroupSyncService::TabGroupSharingCallback());
+        base::BindOnce(&TestShareKitService::ProcessTabGroupSharingResult,
+                       weak_pointer_factory_.GetWeakPtr(),
+                       saved_group.value().saved_guid()));
   }
 }
 
@@ -318,6 +318,29 @@
   }
 }
 
+void TestShareKitService::ProcessTabGroupSharingResult(
+    base::Uuid saved_group_guid,
+    tab_groups::TabGroupSyncService::TabGroupSharingResult result) {
+  if (result !=
+      tab_groups::TabGroupSyncService::TabGroupSharingResult::kSuccess) {
+    return;
+  }
+
+  processing_group_guids_.erase(saved_group_guid);
+  if (processing_group_guids_.size() > 0) {
+    // If the process to share a group is still on-going, do not delete
+    // entities.
+    return;
+  }
+
+  // Delete `SAVED_TAB_GROUP` entities after all groups are successfully shared
+  // and keep only `SHARED_TAB_GROUP_DATA` entities in order to fake the
+  // behavior of sharing a group across different accounts. The fake server
+  // doesn't support multiple accounts and a member in a shared group shouldn't
+  // receieve the `SAVED_TAB_GROUP` data.
+  chrome_test_util::DeleteAllEntitiesForDataType(syncer::SAVED_TAB_GROUP);
+}
+
 void TestShareKitService::CreateSharedTabGroupInFakeServer(
     bool owner,
     NSString* collab_id) {
@@ -334,6 +357,9 @@
       CreateGroup(u"shared group", tabs, group_guid));
   chrome_test_util::TriggerSyncCycle(syncer::SAVED_TAB_GROUP);
 
+  // Add `group_guid` to keep the track of which group is being shared.
+  processing_group_guids_.insert(group_guid);
+
   // Post delayed task in order to make sure that `NotifyTabGroupAdded` is
   // called first.
   base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask(
diff --git a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
index e5c6363f..941ac263 100644
--- a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
+++ b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
@@ -1831,6 +1831,7 @@
       UrlLoadParams::InNewTab(command.URL, command.virtualURL);
   params.SetInBackground(command.inBackground);
   params.web_params.referrer = command.referrer;
+  params.web_params.extra_headers = [command.extraHeaders copy];
   params.in_incognito = command.inIncognito;
   params.append_to = command.appendTo;
   params.origin_point = command.originPoint;
diff --git a/ios/chrome/browser/shared/model/prefs/BUILD.gn b/ios/chrome/browser/shared/model/prefs/BUILD.gn
index 70a59c0..ee4f38c 100644
--- a/ios/chrome/browser/shared/model/prefs/BUILD.gn
+++ b/ios/chrome/browser/shared/model/prefs/BUILD.gn
@@ -66,6 +66,7 @@
     "//components/prefs",
     "//components/proxy_config",
     "//components/reading_list/core",
+    "//components/regional_capabilities",
     "//components/safe_browsing/core/common:safe_browsing_prefs",
     "//components/saved_tab_groups/public",
     "//components/search_engines",
diff --git a/ios/chrome/browser/shared/model/prefs/DEPS b/ios/chrome/browser/shared/model/prefs/DEPS
index c9532b5..f19708c 100644
--- a/ios/chrome/browser/shared/model/prefs/DEPS
+++ b/ios/chrome/browser/shared/model/prefs/DEPS
@@ -22,6 +22,7 @@
   "+components/saved_tab_groups/public/pref_names.h",
   "+components/lens/lens_overlay_permission_utils.h",
   "+components/sharing_message/sharing_sync_preference.h",
+  "+components/regional_capabilities/regional_capabilities_prefs.h",
   "+ios/chrome/browser/settings/ui_bundled",
   "+ios/chrome/browser/authentication/ui_bundled",
   "+ios/chrome/browser/download/model/auto_deletion/auto_deletion_service.h",
diff --git a/ios/chrome/browser/shared/model/prefs/browser_prefs.mm b/ios/chrome/browser/shared/model/prefs/browser_prefs.mm
index b00b3ab..0f9585d 100644
--- a/ios/chrome/browser/shared/model/prefs/browser_prefs.mm
+++ b/ios/chrome/browser/shared/model/prefs/browser_prefs.mm
@@ -54,6 +54,7 @@
 #import "components/pref_registry/pref_registry_syncable.h"
 #import "components/prefs/pref_service.h"
 #import "components/proxy_config/pref_proxy_config_tracker_impl.h"
+#import "components/regional_capabilities/regional_capabilities_prefs.h"
 #import "components/safe_browsing/core/common/safe_browsing_prefs.h"
 #import "components/saved_tab_groups/public/pref_names.h"
 #import "components/search_engines/template_url_prepopulate_data.h"
@@ -664,6 +665,7 @@
   PrefProxyConfigTrackerImpl::RegisterProfilePrefs(registry);
   PushNotificationService::RegisterProfilePrefs(registry);
   RegisterPriceTrackingPromoPrefs(registry);
+  regional_capabilities::prefs::RegisterProfilePrefs(registry);
   shop_card_prefs::RegisterPrefs(registry);
   tips_prefs::RegisterPrefs(registry);
   RegisterVoiceSearchBrowserStatePrefs(registry);
diff --git a/ios/chrome/browser/shared/public/commands/open_new_tab_command.h b/ios/chrome/browser/shared/public/commands/open_new_tab_command.h
index 20ef4d6a..266f3e68 100644
--- a/ios/chrome/browser/shared/public/commands/open_new_tab_command.h
+++ b/ios/chrome/browser/shared/public/commands/open_new_tab_command.h
@@ -85,6 +85,9 @@
 // Origin point of the action triggering this command.
 @property(nonatomic, assign) CGPoint originPoint;
 
+// Extra headers.
+@property(nonatomic, copy) NSDictionary<NSString*, NSString*>* extraHeaders;
+
 #pragma mark - ReadOnly properties
 
 // Whether this URL command requests opening in incognito or not.
diff --git a/ios/chrome/browser/shared/public/commands/open_new_tab_command.mm b/ios/chrome/browser/shared/public/commands/open_new_tab_command.mm
index 1f3b464..3f13b91a 100644
--- a/ios/chrome/browser/shared/public/commands/open_new_tab_command.mm
+++ b/ios/chrome/browser/shared/public/commands/open_new_tab_command.mm
@@ -16,6 +16,7 @@
 @synthesize inIncognito = _inIncognito;
 @synthesize inBackground = _inBackground;
 @synthesize originPoint = _originPoint;
+@synthesize extraHeaders = _extraHeaders;
 @synthesize fromChrome = _fromChrome;
 @synthesize appendTo = _appendTo;
 @synthesize userInitiated = _userInitiated;
diff --git a/ios/chrome/browser/shared/public/features/features.h b/ios/chrome/browser/shared/public/features/features.h
index 89913da..d78511e 100644
--- a/ios/chrome/browser/shared/public/features/features.h
+++ b/ios/chrome/browser/shared/public/features/features.h
@@ -969,6 +969,22 @@
 // Helper function returning the status of `kIOSPasskeysM2`.
 bool IOSPasskeysM2Enabled();
 
+// Enables Profile-specific push notification handling logic. When enabled, this
+// routes incoming notifications to the PushNotificationClientManager associated
+// with the current Profile, rather than using a single global manager. This
+// flag is disabled by default while the refactor is ongoing.
+//
+// TODO(crbug.com/407594420): Enable this by default once the
+// multi-Profile push notification refactor is code complete. It will then
+// serve as a killswitch to revert to the legacy (non-Profile-aware) behavior if
+// issues arise.
+BASE_DECLARE_FEATURE(kIOSPushNotificationMultiProfile);
+
+// Returns true if Profile-specific push notification handling logic is
+// enabled via the kIOSPushNotificationMultiProfile feature
+// flag.
+bool IsIOSMultiProfilePushNotificationHandlingEnabled();
+
 extern const char kFullscreenTransitionSlower[];
 extern const char kFullscreenTransitionDefaultSpeed[];
 extern const char kFullscreenTransitionFaster[];
@@ -1002,6 +1018,9 @@
 // Feature that disables all IPH messages.
 BASE_DECLARE_FEATURE(kIPHAblation);
 
+// Feature that disables IPH dismissal pan gesture for lens overlay promos.
+BASE_DECLARE_FEATURE(kLensOverlayDisableIPHPanGesture);
+
 // Returns true if IPH ablation is enabled.
 bool IsIPHAblationEnabled();
 
diff --git a/ios/chrome/browser/shared/public/features/features.mm b/ios/chrome/browser/shared/public/features/features.mm
index a46259a..a68fe480 100644
--- a/ios/chrome/browser/shared/public/features/features.mm
+++ b/ios/chrome/browser/shared/public/features/features.mm
@@ -1151,6 +1151,14 @@
   return base::FeatureList::IsEnabled(kIOSPasskeysM2);
 }
 
+BASE_FEATURE(kIOSPushNotificationMultiProfile,
+             "IOSPushNotificationMultiProfile",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
+bool IsIOSMultiProfilePushNotificationHandlingEnabled() {
+  return base::FeatureList::IsEnabled(kIOSPushNotificationMultiProfile);
+}
+
 const char kFullscreenTransitionSlower[] = "SlowFullscreenTransitionSpeed";
 const char kFullscreenTransitionDefaultSpeed[] =
     "MediumFullscreenTransitionSpeed";
@@ -1192,6 +1200,10 @@
 
 BASE_FEATURE(kIPHAblation, "IPHAblation", base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kLensOverlayDisableIPHPanGesture,
+             "LensOverlayDisableIPHPanGesture",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 bool IsIPHAblationEnabled() {
   return base::FeatureList::IsEnabled(kIPHAblation);
 }
diff --git a/ios/chrome/browser/shared/public/features/system_flags.h b/ios/chrome/browser/shared/public/features/system_flags.h
index 2c679f0b..090447d 100644
--- a/ios/chrome/browser/shared/public/features/system_flags.h
+++ b/ios/chrome/browser/shared/public/features/system_flags.h
@@ -185,6 +185,9 @@
 // Enables the AI menu, which is a tool for debugging LLM queries.
 bool EnableAIPrototypingMenu();
 
+// Forces the Reader Mode HTML override for debugging.
+bool ShouldForceReaderModeDebugHTMLOverride();
+
 }  // namespace experimental_flags
 
 #endif  // IOS_CHROME_BROWSER_SHARED_PUBLIC_FEATURES_SYSTEM_FLAGS_H_
diff --git a/ios/chrome/browser/shared/public/features/system_flags.mm b/ios/chrome/browser/shared/public/features/system_flags.mm
index a6fb3708..b921937 100644
--- a/ios/chrome/browser/shared/public/features/system_flags.mm
+++ b/ios/chrome/browser/shared/public/features/system_flags.mm
@@ -40,6 +40,8 @@
     @"ForceExperienceForDeviceSwitcher";
 NSString* const kForceExperienceForShopperExperimentalSettings =
     @"ForceExperienceForShopper";
+NSString* const kForceReaderModeDebugHTMLOverride =
+    @"ForceReaderModeDebugHTMLOverride";
 NSString* const kSafetyCheckUpdateChromeStateOverride =
     @"SafetyCheckUpdateChromeStateOverride";
 NSString* const kSafetyCheckPasswordStateOverride =
@@ -355,4 +357,9 @@
       boolForKey:@"EnableAIPrototypingMenu"];
 }
 
+bool ShouldForceReaderModeDebugHTMLOverride() {
+  return [[NSUserDefaults standardUserDefaults]
+      boolForKey:@"ForceReaderModeDebugHTMLOverride"];
+}
+
 }  // namespace experimental_flags
diff --git a/ios/chrome/browser/signin/model/account_profile_mapper.mm b/ios/chrome/browser/signin/model/account_profile_mapper.mm
index fb0b22d..0b70041 100644
--- a/ios/chrome/browser/signin/model/account_profile_mapper.mm
+++ b/ios/chrome/browser/signin/model/account_profile_mapper.mm
@@ -590,7 +590,7 @@
   CHECK(is_updating_profile_attributes_storage_);
 
   if (handler_) {
-    [handler_ deleteProfile:name completion:base::DoNothing()];
+    [handler_ deleteProfile:name];
     return;
   }
 
diff --git a/ios/chrome/browser/signin/model/account_profile_mapper_unittest.mm b/ios/chrome/browser/signin/model/account_profile_mapper_unittest.mm
index c2b7baa..08fffca 100644
--- a/ios/chrome/browser/signin/model/account_profile_mapper_unittest.mm
+++ b/ios/chrome/browser/signin/model/account_profile_mapper_unittest.mm
@@ -70,8 +70,7 @@
   NOTREACHED();
 }
 
-- (void)deleteProfile:(std::string_view)profileName
-           completion:(ProfileDeletedCallback)completion {
+- (void)deleteProfile:(std::string_view)profileName {
   _deleteProfileCalled = YES;
   _manager->MarkProfileForDeletion(profileName);
 }
diff --git a/ios/chrome/browser/signin/model/constants.h b/ios/chrome/browser/signin/model/constants.h
index d6d0900..34dcbb8 100644
--- a/ios/chrome/browser/signin/model/constants.h
+++ b/ios/chrome/browser/signin/model/constants.h
@@ -9,6 +9,8 @@
 
 #import "base/containers/enum_set.h"
 
+@class SceneState;
+
 typedef NS_ENUM(NSUInteger, SigninCoordinatorResult);
 
 // The key in the user info dictionary containing the GoogleServiceAuthError
@@ -72,7 +74,8 @@
 
 // Completion callback for a sign-out operation.
 // `success` is YES if the operation was successful.
-using SignoutCompletionCallback = void (^)(BOOL success);
+using SignoutCompletionCallback = void (^)(BOOL success,
+                                           SceneState* scene_state);
 
 }  // namespace signin_ui
 
diff --git a/ios/chrome/browser/snapshots/model/legacy_snapshot_manager.h b/ios/chrome/browser/snapshots/model/legacy_snapshot_manager.h
index 350ebe3..51941cbc 100644
--- a/ios/chrome/browser/snapshots/model/legacy_snapshot_manager.h
+++ b/ios/chrome/browser/snapshots/model/legacy_snapshot_manager.h
@@ -18,13 +18,8 @@
 // written in Swift is used by default.
 @interface LegacySnapshotManager : NSObject
 
-// Strong reference to the snapshot generator which is used to generate
-// snapshots.
-@property(nonatomic, readonly) LegacySnapshotGenerator* snapshotGenerator;
-
-// Weak reference to the snapshot storage which is used to store and retrieve
-// snapshots. SnapshotStorage is owned by SnapshotBrowserAgent.
-@property(nonatomic, weak) SnapshotStorageWrapper* snapshotStorage;
+// The snapshot storage which is used to store and retrieve snapshots.
+@property(nonatomic) SnapshotStorageWrapper* snapshotStorage;
 
 // The snapshot ID.
 @property(nonatomic, readonly) SnapshotID snapshotID;
diff --git a/ios/chrome/browser/snapshots/model/legacy_snapshot_manager.mm b/ios/chrome/browser/snapshots/model/legacy_snapshot_manager.mm
index be09524..b1dbcf7 100644
--- a/ios/chrome/browser/snapshots/model/legacy_snapshot_manager.mm
+++ b/ios/chrome/browser/snapshots/model/legacy_snapshot_manager.mm
@@ -12,6 +12,9 @@
 #import "ios/web/public/thread/web_thread.h"
 
 @implementation LegacySnapshotManager {
+  // The snapshot generator which is used to generate snapshots.
+  LegacySnapshotGenerator* _snapshotGenerator;
+
   // The unique ID for WebState's snapshot.
   SnapshotID _snapshotID;
 
diff --git a/ios/chrome/browser/snapshots/model/snapshot_manager.swift b/ios/chrome/browser/snapshots/model/snapshot_manager.swift
index 75157ee..df4748f 100644
--- a/ios/chrome/browser/snapshots/model/snapshot_manager.swift
+++ b/ios/chrome/browser/snapshots/model/snapshot_manager.swift
@@ -7,12 +7,11 @@
 // A class that takes care of creating, storing and returning snapshots of a tab's web page. This
 // lives on the UI thread.
 @objcMembers public class SnapshotManager: NSObject {
-  // Strong reference to the snapshot generator which is used to generate snapshots.
+  // The snapshot generator which is used to generate snapshots.
   private let snapshotGenerator: SnapshotGenerator
 
-  // Weak reference to the snapshot storage which is used to store and retrieve snapshots.
-  // SnapshotStorage is owned by SnapshotBrowserAgent.
-  weak var snapshotStorage: Optional<SnapshotStorage>
+  // The snapshot storage which is used to store and retrieve snapshots.
+  var snapshotStorage: Optional<SnapshotStorage>
 
   // The unique ID for WebState's snapshot.
   let snapshotID: SnapshotIDWrapper
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/BUILD.gn b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/BUILD.gn
index 7640d3d..1c37c223 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/BUILD.gn
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/BUILD.gn
@@ -55,6 +55,7 @@
     "//ios/chrome/browser/recent_tabs/ui_bundled:coordinator",
     "//ios/chrome/browser/recent_tabs/ui_bundled:ui",
     "//ios/chrome/browser/saved_tab_groups/model",
+    "//ios/chrome/browser/saved_tab_groups/model:tab_group_service",
     "//ios/chrome/browser/search_engines/model:template_url_service_factory",
     "//ios/chrome/browser/sessions/model",
     "//ios/chrome/browser/share_kit/model",
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/grid/regular/regular_grid_view_controller.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/grid/regular/regular_grid_view_controller.mm
index b6b0aef..0858119 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/grid/regular/regular_grid_view_controller.mm
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/grid/regular/regular_grid_view_controller.mm
@@ -188,7 +188,7 @@
   // Register InactiveTabsButtonCell.
   auto configureInactiveTabsButtonCell =
       ^(InactiveTabsButtonCell* cell, NSIndexPath* indexPath, id item) {
-        [weakSelf configureInativeTabsButtonCell:cell];
+        [weakSelf configureInactiveTabsButtonCell:cell];
       };
   _inactiveTabsButtonCellRegistration = [UICollectionViewCellRegistration
       registrationWithCellClass:InactiveTabsButtonCell.class
@@ -215,6 +215,7 @@
 
   GridSnapshot* snapshot = [self.diffableDataSource snapshot];
   [self updateInactiveTabsButtonInSnapshot:snapshot];
+  [self.diffableDataSource applySnapshot:snapshot animatingDifferences:YES];
 }
 
 - (void)updateInactiveTabsDaysThreshold:(NSInteger)daysThreshold {
@@ -225,6 +226,7 @@
 
   GridSnapshot* snapshot = [self.diffableDataSource snapshot];
   [self updateInactiveTabsButtonInSnapshot:snapshot];
+  [self.diffableDataSource applySnapshot:snapshot animatingDifferences:YES];
 }
 
 #pragma mark - Private
@@ -271,7 +273,6 @@
       ]];
     }
   }
-  [self.diffableDataSource applySnapshot:snapshot animatingDifferences:YES];
 }
 
 // Adds the inactive tabs button to `snapshot` if it is not there yet.
@@ -294,7 +295,7 @@
 }
 
 // Configures `cell` according to the current state.
-- (void)configureInativeTabsButtonCell:(InactiveTabsButtonCell*)cell {
+- (void)configureInactiveTabsButtonCell:(InactiveTabsButtonCell*)cell {
   cell.count = _inactiveTabsCount;
   cell.daysThreshold = _inactiveTabsDaysThreshold;
 }
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_grid_coordinator.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_grid_coordinator.mm
index e5a03c5..97e99e5 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_grid_coordinator.mm
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_grid_coordinator.mm
@@ -51,6 +51,7 @@
 #import "ios/chrome/browser/recent_tabs/ui_bundled/recent_tabs_presentation_delegate.h"
 #import "ios/chrome/browser/recent_tabs/ui_bundled/recent_tabs_table_view_controller.h"
 #import "ios/chrome/browser/saved_tab_groups/model/ios_tab_group_sync_util.h"
+#import "ios/chrome/browser/saved_tab_groups/model/tab_group_service_factory.h"
 #import "ios/chrome/browser/saved_tab_groups/model/tab_group_sync_service_factory.h"
 #import "ios/chrome/browser/search_engines/model/template_url_service_factory.h"
 #import "ios/chrome/browser/sessions/model/ios_chrome_tab_restore_service_factory.h"
@@ -820,7 +821,8 @@
 
   std::unique_ptr<collaboration::CollaborationControllerDelegate> delegate =
       std::make_unique<collaboration::IOSCollaborationControllerDelegate>(
-          browser, self.baseViewController);
+          browser, self.baseViewController,
+          TabGroupServiceFactory::GetForProfile(browser->GetProfile()));
   collaborationService->StartShareOrManageFlow(
       std::move(delegate), tabGroup->tab_group_id(),
       collaboration::CollaborationServiceShareOrManageEntryPoint::kUnknown);
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/BUILD.gn b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/BUILD.gn
index 4b7a334..48b42974 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/BUILD.gn
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/BUILD.gn
@@ -47,6 +47,7 @@
     "//ios/chrome/browser/saved_tab_groups/favicon/coordinator",
     "//ios/chrome/browser/saved_tab_groups/favicon/ui",
     "//ios/chrome/browser/saved_tab_groups/model",
+    "//ios/chrome/browser/saved_tab_groups/model:tab_group_service",
     "//ios/chrome/browser/share_kit/model",
     "//ios/chrome/browser/share_kit/model:constants",
     "//ios/chrome/browser/share_kit/model:factory",
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/shared_tab_groups_egtest.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/shared_tab_groups_egtest.mm
index 71f96db..9ac87264 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/shared_tab_groups_egtest.mm
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/shared_tab_groups_egtest.mm
@@ -56,6 +56,7 @@
 using chrome_test_util::TabGridCellAtIndex;
 using chrome_test_util::TabGridDoneButton;
 using chrome_test_util::TabGridGroupCellAtIndex;
+using chrome_test_util::TabGridNewTabButton;
 using chrome_test_util::TabGroupBackButton;
 using chrome_test_util::TabGroupCreationView;
 using chrome_test_util::TabGroupOverflowMenuButton;
@@ -75,6 +76,9 @@
 // keyboard default can differ iPhone vs iPad, simulator vs device.
 NSString* const kGroup1Name = @"1group";
 
+// Constant for timeout while waiting for asynchronous sync operations.
+constexpr base::TimeDelta kSyncOperationTimeout = base::Seconds(10);
+
 // Matcher for the face pile button.
 id<GREYMatcher> FacePileButton() {
   return grey_accessibilityID(kTabGroupFacePileButtonIdentifier);
@@ -577,50 +581,6 @@
       waitForUIElementToDisappearWithMatcher:TabGridGroupCellAtIndex(0)];
 }
 
-// Tests that TabGroupAppInterface creates and deletes shared tab groups
-// correctly.
-- (void)testPreparedSharedGroupsAtStartup {
-  if (@available(iOS 17, *)) {
-  } else if ([ChromeEarlGrey isIPadIdiom]) {
-    EARL_GREY_TEST_SKIPPED(@"Only available on iOS 17+ on iPad.");
-  }
-  [TabGroupAppInterface prepareFakeSharedTabGroups:3 asOwner:NO];
-
-  [ChromeEarlGreyUI openTabGrid];
-
-  GREYAssertEqual(3, [TabGroupAppInterface countOfSavedTabGroups],
-                  @"The number of saved tab groups should be 3.");
-
-  // Verify that 3 shared tab groups created by `+prepareFakeSharedTabGroups:`
-  // exist in the tab grid.
-  [[EarlGrey selectElementWithMatcher:TabGridGroupCellAtIndex(1)]
-      assertWithMatcher:grey_sufficientlyVisible()];
-  [[EarlGrey selectElementWithMatcher:TabGridGroupCellAtIndex(2)]
-      assertWithMatcher:grey_sufficientlyVisible()];
-  [[EarlGrey selectElementWithMatcher:TabGridGroupCellAtIndex(3)]
-      assertWithMatcher:grey_sufficientlyVisible()];
-
-  // Delete the first group.
-  [TabGroupAppInterface removeAtIndex:0];
-
-  // Verify the first shared group is deleted and the position of other 2 shared
-  // groups is shifted.
-  [ChromeEarlGrey
-      waitForUIElementToDisappearWithMatcher:TabGridGroupCellAtIndex(3)];
-  [[EarlGrey selectElementWithMatcher:TabGridGroupCellAtIndex(1)]
-      assertWithMatcher:grey_sufficientlyVisible()];
-  [[EarlGrey selectElementWithMatcher:TabGridGroupCellAtIndex(2)]
-      assertWithMatcher:grey_sufficientlyVisible()];
-
-  // Verify that the context menu offers to Manage button instead of the Share
-  // button.
-  LongPressTabGroupCellAtIndex(1);
-  [[EarlGrey selectElementWithMatcher:ManageGroupButton()]
-      assertWithMatcher:grey_sufficientlyVisible()];
-  [[EarlGrey selectElementWithMatcher:ShareGroupButton()]
-      assertWithMatcher:grey_notVisible()];
-}
-
 // Checks last tab close alert as owner of the group open a new tab and close
 // the last tab, when "Keep Group" is pressed and delete the group when "Delete
 // Group" is pressed.
@@ -858,6 +818,110 @@
       assertWithMatcher:grey_nil()];
 }
 
+// Ensures that adding a tab from another account reflects correctly in a shared
+// group.
+- (void)testAddNewTabFromAnotherAccount {
+  if (@available(iOS 17, *)) {
+  } else if ([ChromeEarlGrey isIPadIdiom]) {
+    EARL_GREY_TEST_SKIPPED(@"Only available on iOS 17+ on iPad.");
+  }
+  AddSharedGroup(/*owner=*/YES);
+  [ChromeEarlGrey waitForMainTabCount:1];
+
+  // Open the group view.
+  [[EarlGrey selectElementWithMatcher:TabGridGroupCellAtIndex(0)]
+      performAction:grey_tap()];
+
+  // Open a first tab and wait until loading is completed.
+  [[EarlGrey selectElementWithMatcher:TabGridCellAtIndex(0)]
+      performAction:grey_tap()];
+  [ChromeEarlGrey waitForPageToFinishLoading];
+
+  // Add a new tab.
+  [ChromeEarlGreyUI openNewTab];
+  [ChromeEarlGrey waitForPageToFinishLoading];
+
+  // Make sure that the second tab exists in the group.
+  [ChromeEarlGreyUI openTabGrid];
+  [[EarlGrey selectElementWithMatcher:TabGridCellAtIndex(1)]
+      assertWithMatcher:grey_notNil()];
+
+  // Sign out from the current identity (FakeIdentity1).
+  [SigninEarlGrey signOut];
+
+  // Open a new tab.
+  [[EarlGrey selectElementWithMatcher:TabGridNewTabButton()]
+      performAction:grey_tap()];
+  [ChromeEarlGreyUI waitForAppToIdle];
+
+  // Sign in with another identity (FakeIdentity2).
+  [SigninEarlGreyUI signinWithFakeIdentity:[FakeSystemIdentity fakeIdentity2]
+                         enableHistorySync:YES];
+  [ChromeEarlGrey
+      waitForSyncTransportStateActiveWithTimeout:kSyncOperationTimeout];
+
+  [ChromeEarlGreyUI openTabGrid];
+  [ChromeEarlGrey waitForMainTabCount:3];
+
+  // Remove a new tab that is automatically created when a user signs in.
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::
+                                          TabGridCloseButtonForCellAtIndex(0)]
+      performAction:grey_tap()];
+
+  // Open the group view.
+  [[EarlGrey selectElementWithMatcher:TabGridGroupCellAtIndex(0)]
+      performAction:grey_tap()];
+
+  // Verify that there are 2 tabs in the group.
+  [[EarlGrey selectElementWithMatcher:TabGridCellAtIndex(0)]
+      assertWithMatcher:grey_notNil()];
+  [[EarlGrey selectElementWithMatcher:TabGridCellAtIndex(1)]
+      assertWithMatcher:grey_notNil()];
+
+  // Open a first tab and wait until loading is completed.
+  [[EarlGrey selectElementWithMatcher:TabGridCellAtIndex(0)]
+      performAction:grey_tap()];
+  [ChromeEarlGrey waitForPageToFinishLoading];
+
+  // Add a new tab.
+  [ChromeEarlGreyUI openNewTab];
+  [ChromeEarlGrey waitForPageToFinishLoading];
+
+  // Sign out from the current identity (FakeIdentity2).
+  [SigninEarlGrey signOut];
+  [ChromeEarlGreyUI waitForAppToIdle];
+
+  [[EarlGrey selectElementWithMatcher:TabGridNewTabButton()]
+      performAction:grey_tap()];
+  [ChromeEarlGreyUI waitForAppToIdle];
+
+  // Sign in with the owner identity again (FakeIdentity1).
+  [SigninEarlGreyUI signinWithFakeIdentity:[FakeSystemIdentity fakeIdentity1]
+                         enableHistorySync:YES];
+  [ChromeEarlGrey
+      waitForSyncTransportStateActiveWithTimeout:kSyncOperationTimeout];
+
+  [ChromeEarlGreyUI openTabGrid];
+  [ChromeEarlGreyUI waitForAppToIdle];
+
+  // Remove a new tab that is automatically created when a user signs in.
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::
+                                          TabGridCloseButtonForCellAtIndex(0)]
+      performAction:grey_tap()];
+
+  // Open the group view.
+  [[EarlGrey selectElementWithMatcher:TabGridGroupCellAtIndex(0)]
+      performAction:grey_tap()];
+
+  // Verify that there are 3 tabs in the group.
+  [[EarlGrey selectElementWithMatcher:TabGridCellAtIndex(0)]
+      assertWithMatcher:grey_notNil()];
+  [[EarlGrey selectElementWithMatcher:TabGridCellAtIndex(1)]
+      assertWithMatcher:grey_notNil()];
+  [[EarlGrey selectElementWithMatcher:TabGridCellAtIndex(2)]
+      assertWithMatcher:grey_notNil()];
+}
+
 @end
 
 // Test Shared Tab Groups feature (with group joining access only.).
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_group_app_interface.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_group_app_interface.mm
index 09ec141..d88b78b 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_group_app_interface.mm
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_group_app_interface.mm
@@ -126,15 +126,17 @@
       GetTabGroupSyncService()->GetAllGroups();
   tab_groups::SavedTabGroup groupToRemove = groups[index];
 
+  chrome_test_util::DeleteTabOrGroupFromFakeServer(groupToRemove.saved_guid());
+  chrome_test_util::TriggerSyncCycle(syncer::SAVED_TAB_GROUP);
+
+  // When a group is shared, the fake server stores the data of the group as
+  // syncer::SAVED_TAB_GROUP and syncer::SHARED_TAB_GROUP_DATA. Remove the both
+  // data from the fake server.
   if (groupToRemove.is_shared_tab_group()) {
     chrome_test_util::DeleteSharedGroupFromFakeServer(
         groupToRemove.saved_guid());
-  } else {
-    chrome_test_util::DeleteTabOrGroupFromFakeServer(
-        groupToRemove.saved_guid());
+    chrome_test_util::TriggerSyncCycle(syncer::SHARED_TAB_GROUP_DATA);
   }
-
-  chrome_test_util::TriggerSyncCycle(syncer::SAVED_TAB_GROUP);
 }
 
 + (void)cleanup {
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_group_coordinator.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_group_coordinator.mm
index fbd331e..a0e6217 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_group_coordinator.mm
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/tab_group_coordinator.mm
@@ -18,6 +18,7 @@
 #import "ios/chrome/browser/collaboration/model/messaging/messaging_backend_service_factory.h"
 #import "ios/chrome/browser/data_sharing/model/data_sharing_service_factory.h"
 #import "ios/chrome/browser/saved_tab_groups/model/ios_tab_group_sync_util.h"
+#import "ios/chrome/browser/saved_tab_groups/model/tab_group_service_factory.h"
 #import "ios/chrome/browser/saved_tab_groups/model/tab_group_sync_service_factory.h"
 #import "ios/chrome/browser/share_kit/model/share_kit_face_pile_configuration.h"
 #import "ios/chrome/browser/share_kit/model/share_kit_manage_configuration.h"
@@ -411,7 +412,8 @@
 
   std::unique_ptr<collaboration::CollaborationControllerDelegate> delegate =
       std::make_unique<collaboration::IOSCollaborationControllerDelegate>(
-          browser, self.baseViewController);
+          browser, self.baseViewController,
+          TabGroupServiceFactory::GetForProfile(self.profile));
   collaborationService->StartShareOrManageFlow(
       std::move(delegate), _tabGroup->tab_group_id(),
       collaboration::CollaborationServiceShareOrManageEntryPoint::kUnknown);
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_strip/coordinator/BUILD.gn b/ios/chrome/browser/tab_switcher/ui_bundled/tab_strip/coordinator/BUILD.gn
index 07bdf34..fb08bd78 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_strip/coordinator/BUILD.gn
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_strip/coordinator/BUILD.gn
@@ -26,6 +26,7 @@
     "//ios/chrome/browser/ntp/model:util",
     "//ios/chrome/browser/policy/model:policy_util",
     "//ios/chrome/browser/saved_tab_groups/model",
+    "//ios/chrome/browser/saved_tab_groups/model:tab_group_service",
     "//ios/chrome/browser/shared/coordinator/alert",
     "//ios/chrome/browser/shared/coordinator/chrome_coordinator",
     "//ios/chrome/browser/shared/coordinator/layout_guide",
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_strip/coordinator/tab_strip_coordinator.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_strip/coordinator/tab_strip_coordinator.mm
index 6766bc2b..9bae115a 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_strip/coordinator/tab_strip_coordinator.mm
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_strip/coordinator/tab_strip_coordinator.mm
@@ -16,6 +16,7 @@
 #import "ios/chrome/browser/collaboration/model/ios_collaboration_controller_delegate.h"
 #import "ios/chrome/browser/collaboration/model/messaging/messaging_backend_service_factory.h"
 #import "ios/chrome/browser/saved_tab_groups/model/ios_tab_group_sync_util.h"
+#import "ios/chrome/browser/saved_tab_groups/model/tab_group_service_factory.h"
 #import "ios/chrome/browser/saved_tab_groups/model/tab_group_sync_service_factory.h"
 #import "ios/chrome/browser/shared/coordinator/alert/alert_coordinator.h"
 #import "ios/chrome/browser/shared/coordinator/layout_guide/layout_guide_util.h"
@@ -450,7 +451,8 @@
 
   std::unique_ptr<collaboration::CollaborationControllerDelegate> delegate =
       std::make_unique<collaboration::IOSCollaborationControllerDelegate>(
-          browser, self.baseViewController);
+          browser, self.baseViewController,
+          TabGroupServiceFactory::GetForProfile(self.profile));
   collaborationService->StartShareOrManageFlow(
       std::move(delegate), tabGroup->tab_group_id(),
       collaboration::CollaborationServiceShareOrManageEntryPoint::kUnknown);
diff --git a/ios/chrome/browser/tips_notifications/model/tips_notification_client.mm b/ios/chrome/browser/tips_notifications/model/tips_notification_client.mm
index 1e22e7b..1efe68e 100644
--- a/ios/chrome/browser/tips_notifications/model/tips_notification_client.mm
+++ b/ios/chrome/browser/tips_notifications/model/tips_notification_client.mm
@@ -127,7 +127,8 @@
 }  // namespace
 
 TipsNotificationClient::TipsNotificationClient()
-    : PushNotificationClient(PushNotificationClientId::kTips) {
+    : PushNotificationClient(PushNotificationClientId::kTips,
+                             PushNotificationClientScope::kAppWide) {
   local_state_ = GetApplicationContext()->GetLocalState();
   pref_change_registrar_.Init(local_state_);
   PrefChangeRegistrar::NamedChangeCallback pref_callback = base::BindRepeating(
diff --git a/ios/chrome/browser/toolbar/ui_bundled/tab_groups/coordinator/BUILD.gn b/ios/chrome/browser/toolbar/ui_bundled/tab_groups/coordinator/BUILD.gn
index febaec23..db90563 100644
--- a/ios/chrome/browser/toolbar/ui_bundled/tab_groups/coordinator/BUILD.gn
+++ b/ios/chrome/browser/toolbar/ui_bundled/tab_groups/coordinator/BUILD.gn
@@ -25,6 +25,7 @@
     "//ios/chrome/browser/data_sharing/model:observer_bridge",
     "//ios/chrome/browser/feature_engagement/model",
     "//ios/chrome/browser/saved_tab_groups/model",
+    "//ios/chrome/browser/saved_tab_groups/model:tab_group_service",
     "//ios/chrome/browser/share_kit/model",
     "//ios/chrome/browser/share_kit/model:constants",
     "//ios/chrome/browser/share_kit/model:factory",
diff --git a/ios/chrome/browser/toolbar/ui_bundled/tab_groups/coordinator/tab_group_indicator_coordinator.mm b/ios/chrome/browser/toolbar/ui_bundled/tab_groups/coordinator/tab_group_indicator_coordinator.mm
index e595dd27..b295bdf 100644
--- a/ios/chrome/browser/toolbar/ui_bundled/tab_groups/coordinator/tab_group_indicator_coordinator.mm
+++ b/ios/chrome/browser/toolbar/ui_bundled/tab_groups/coordinator/tab_group_indicator_coordinator.mm
@@ -16,6 +16,7 @@
 #import "ios/chrome/browser/collaboration/model/ios_collaboration_controller_delegate.h"
 #import "ios/chrome/browser/data_sharing/model/data_sharing_service_factory.h"
 #import "ios/chrome/browser/feature_engagement/model/tracker_factory.h"
+#import "ios/chrome/browser/saved_tab_groups/model/tab_group_service_factory.h"
 #import "ios/chrome/browser/saved_tab_groups/model/tab_group_sync_service_factory.h"
 #import "ios/chrome/browser/share_kit/model/share_kit_service_factory.h"
 #import "ios/chrome/browser/shared/coordinator/scene/scene_state.h"
@@ -241,7 +242,8 @@
 
   std::unique_ptr<collaboration::CollaborationControllerDelegate> delegate =
       std::make_unique<collaboration::IOSCollaborationControllerDelegate>(
-          browser, self.baseViewController);
+          browser, self.baseViewController,
+          TabGroupServiceFactory::GetForProfile(self.profile));
   collaborationService->StartShareOrManageFlow(
       std::move(delegate), tabGroup->tab_group_id(),
       collaboration::CollaborationServiceShareOrManageEntryPoint::kUnknown);
diff --git a/ios/chrome/common/credential_provider/passkey_model_observer_bridge.h b/ios/chrome/common/credential_provider/passkey_model_observer_bridge.h
index aadfc9c..bbedbf9 100644
--- a/ios/chrome/common/credential_provider/passkey_model_observer_bridge.h
+++ b/ios/chrome/common/credential_provider/passkey_model_observer_bridge.h
@@ -9,6 +9,7 @@
 #import "components/webauthn/core/browser/passkey_model.h"
 
 @protocol PasskeyModelObserverDelegate
+- (void)passKeyModelShuttingDown:(webauthn::PasskeyModel*)passkeyModel;
 - (void)passkeyModelIsReady:(webauthn::PasskeyModel*)passkeyModel;
 @end
 
diff --git a/ios/chrome/common/credential_provider/passkey_model_observer_bridge.mm b/ios/chrome/common/credential_provider/passkey_model_observer_bridge.mm
index 78f99ad5..6663b0e 100644
--- a/ios/chrome/common/credential_provider/passkey_model_observer_bridge.mm
+++ b/ios/chrome/common/credential_provider/passkey_model_observer_bridge.mm
@@ -26,6 +26,7 @@
     const std::vector<webauthn::PasskeyModelChange>& changes) {}
 
 void PasskeyModelObserverBridge::OnPasskeyModelShuttingDown() {
+  [observer_ passKeyModelShuttingDown:passkey_model_];
   scoped_observation_.Reset();
 }
 
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ar.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ar.xtb
index 0c716e24..fab73f4 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ar.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ar.xtb
@@ -22,7 +22,7 @@
 <translation id="2240788130418512742">‏يمكنك استخدام كلمات المرور ومفاتيح المرور المحفوظة مع التطبيقات المُثبَّتة على هذا الجهاز. وهي محفوظة في "مدير كلمات المرور في Google" لحساب <ph name="EMAIL" />.</translation>
 <translation id="2320166752086256636">إخفاء لوحة المفاتيح</translation>
 <translation id="2489483078139081050">‏يمكنك استخدام كلمات المرور المحفوظة في التطبيقات الأخرى على جهازك، حيث تُحفظ كلمات المرور هذه في "مدير كلمات المرور في Google" على هذا الجهاز فقط.</translation>
-<translation id="2677128368066534822">‏للوصول إلى كلمات المرور بشكل أسرع، ألغِ اختيار سلسلة مفاتيح iCloud.</translation>
+<translation id="2677128368066534822">‏للوصول إلى كلمات المرور بشكل أسرع، ألغِ اختيار "سلسلة مفاتيح iCloud".</translation>
 <translation id="2712586044587587728">‏ستتوفَّر كلمات المرور في متصفِّح Chrome لاستخدامها في تطبيقات أخرى. ويمكنك إيقاف هذه الميزة في تطبيق "الإعدادات" في أي وقت.</translation>
 <translation id="2734995497016364715">جارٍ الوصول إلى مفاتيح المرور…</translation>
 <translation id="2747003861858887689">الحقل السابق</translation>
diff --git a/ios/chrome/test/app/sync_test_util.h b/ios/chrome/test/app/sync_test_util.h
index ede2d365..082e56f3 100644
--- a/ios/chrome/test/app/sync_test_util.h
+++ b/ios/chrome/test/app/sync_test_util.h
@@ -174,6 +174,10 @@
 // Deletes the shared group with `uuid` on the server.
 void DeleteSharedGroupFromFakeServer(const base::Uuid& uuid);
 
+// Deletes all `data_type` entities from the server without creating
+// tombstones.
+void DeleteAllEntitiesForDataType(syncer::DataType data_type);
+
 }  // namespace chrome_test_util
 
 #endif  // IOS_CHROME_TEST_APP_SYNC_TEST_UTIL_H_
diff --git a/ios/chrome/test/app/sync_test_util.mm b/ios/chrome/test/app/sync_test_util.mm
index 7be20b6..c1e02a3 100644
--- a/ios/chrome/test/app/sync_test_util.mm
+++ b/ios/chrome/test/app/sync_test_util.mm
@@ -611,4 +611,8 @@
   }
 }
 
+void DeleteAllEntitiesForDataType(syncer::DataType data_type) {
+  gSyncFakeServer->DeleteAllEntitiesForDataType(data_type);
+}
+
 }  // namespace chrome_test_util
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ar.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ar.xtb
index 47d49ed2e..c547262 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ar.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ar.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">‏يمكنك البحث في متصفِّح Chrome باستخدام محرك البحث المفضَّل لديك.</translation>
 <translation id="5277852985315196237">‏البحث عن عنوان URL أو إدخاله</translation>
 <translation id="529497070985873480">‏لعبة الديناصور في Chrome</translation>
+<translation id="5325847452011598583">ما مِن حساب</translation>
 <translation id="5683557219437283801">البحث الصوتي</translation>
 <translation id="6179961764474023795">إجراءات سريعة</translation>
 <translation id="6330929932864892436">‏البحث عن عنوان URL أو كتابته</translation>
@@ -39,6 +40,7 @@
 <translation id="8104498668011127805">‏الانتقال إلى لعبة الديناصور في Chrome</translation>
 <translation id="8150601371542319992">‏عدسة Google</translation>
 <translation id="8171952085734471362">البحث في وضع التصفُّح المتخفي</translation>
+<translation id="8310150944719146950">الحساب</translation>
 <translation id="8564942608461410346">‏يمكنك البحث في متصفِّح Chrome باستخدام محرك البحث المفضَّل لديك.</translation>
 <translation id="9175676375569833962">البحث
 عن كلمات المرور</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_cy.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_cy.xtb
index e03a1d7..ad99402 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_cy.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_cy.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">Chwilio yn Chrome gyda'ch hoff beiriant chwilio.</translation>
 <translation id="5277852985315196237">Chwiliwch neu teipiwch URL</translation>
 <translation id="529497070985873480">Deino Chrome</translation>
+<translation id="5325847452011598583">Dim cyfrif</translation>
 <translation id="5683557219437283801">Chwilio â Llais</translation>
 <translation id="6179961764474023795">Camau Gweithredu Cyflym</translation>
 <translation id="6330929932864892436">Chwilio neu Deipio URL</translation>
@@ -39,6 +40,7 @@
 <translation id="8104498668011127805">Neidiwch i mewn i'r Gêm Chrome Dino</translation>
 <translation id="8150601371542319992">Lens</translation>
 <translation id="8171952085734471362">Chwiliad Anhysbys</translation>
+<translation id="8310150944719146950">Cyfrif</translation>
 <translation id="8564942608461410346">Chwiliwch yn Chrome gyda'ch hoff beiriant chwilio.</translation>
 <translation id="9175676375569833962">Chwilio'r
 cyfrineiriau</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_el.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_el.xtb
index f135679b..7974521 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_el.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_el.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">Αναζητήστε στο Chrome με την αγαπημένη σας μηχανή αναζήτησης.</translation>
 <translation id="5277852985315196237">Αναζήτηση ή πληκτρολόγηση URL</translation>
 <translation id="529497070985873480">Chrome Dino</translation>
+<translation id="5325847452011598583">Δεν υπάρχει λογαριασμός</translation>
 <translation id="5683557219437283801">Φωνητική αναζήτηση</translation>
 <translation id="6179961764474023795">Γρήγορες ενέργειες</translation>
 <translation id="6330929932864892436">Αναζήτηση ή πληκτρολόγηση URL</translation>
@@ -39,6 +40,7 @@
 <translation id="8104498668011127805">Μεταβείτε στο παιχνίδι Chrome Dino</translation>
 <translation id="8150601371542319992">Lens</translation>
 <translation id="8171952085734471362">Ανώνυμη αναζήτηση</translation>
+<translation id="8310150944719146950">Λογαριασμός</translation>
 <translation id="8564942608461410346">Αναζητήστε στο Chrome με την αγαπημένη σας μηχανή αναζήτησης.</translation>
 <translation id="9175676375569833962">Αναζήτηση
 κωδ. πρόσβασης</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_fa.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_fa.xtb
index 349c96a4..b66edd79 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_fa.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_fa.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">‏با موتور جستجوی دلخواهتان در Chrome جستجو کنید.</translation>
 <translation id="5277852985315196237">جستجو یا تایپ نشانی وب</translation>
 <translation id="529497070985873480">Chrome Dino</translation>
+<translation id="5325847452011598583">بدون حساب</translation>
 <translation id="5683557219437283801">جستجوی گفتاری</translation>
 <translation id="6179961764474023795">کنش‌های سریع</translation>
 <translation id="6330929932864892436">جستجو یا تایپ نشانی وب</translation>
@@ -39,6 +40,7 @@
 <translation id="8104498668011127805">‏رفتن به بازی Chrome Dino</translation>
 <translation id="8150601371542319992">لنز</translation>
 <translation id="8171952085734471362">جستجوی ناشناس</translation>
+<translation id="8310150944719146950">حساب</translation>
 <translation id="8564942608461410346">‏با موتور جستجوی دلخواهتان در Chrome جستجو کنید.</translation>
 <translation id="9175676375569833962">جستجوی
 گذرواژه‌ها</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_is.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_is.xtb
index f9e189a..0b3f289 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_is.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_is.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">Leitaðu á Chrome með uppáhaldsleitarvélinni þinni.</translation>
 <translation id="5277852985315196237">Leitaðu eða sláðu inn vefslóð</translation>
 <translation id="529497070985873480">Chrome Dino</translation>
+<translation id="5325847452011598583">Enginn reikningur</translation>
 <translation id="5683557219437283801">Raddleit</translation>
 <translation id="6179961764474023795">Flýtiaðgerðir</translation>
 <translation id="6330929932864892436">Leitaðu eða sláðu inn vefslóð</translation>
@@ -37,6 +38,7 @@
 <translation id="8104498668011127805">Hoppaðu í leikinn Chrome Dino</translation>
 <translation id="8150601371542319992">Linsa</translation>
 <translation id="8171952085734471362">Leit í huliðsstillingu</translation>
+<translation id="8310150944719146950">Reikningur</translation>
 <translation id="8564942608461410346">Leitaðu á Chrome með uppáhalds leitarvélinni þinni.</translation>
 <translation id="9175676375569833962">Leita að
 aðgangsorðum</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ja.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ja.xtb
index f785cd92..ab89d924 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ja.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ja.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">Chrome でお気に入りの検索エンジンを使って検索できます。</translation>
 <translation id="5277852985315196237">検索または URL を入力</translation>
 <translation id="529497070985873480">Chrome Dino</translation>
+<translation id="5325847452011598583">アカウントがありません</translation>
 <translation id="5683557219437283801">音声検索</translation>
 <translation id="6179961764474023795">クイック操作</translation>
 <translation id="6330929932864892436">検索または URL を入力</translation>
@@ -39,6 +40,7 @@
 <translation id="8104498668011127805">Chrome Dino ゲームに移動</translation>
 <translation id="8150601371542319992">レンズ</translation>
 <translation id="8171952085734471362">シークレット検索</translation>
+<translation id="8310150944719146950">アカウント</translation>
 <translation id="8564942608461410346">Chrome でお気に入りの検索エンジンを使って検索できます。</translation>
 <translation id="9175676375569833962">パスワードを
 検索</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ka.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ka.xtb
index 3589e8b..d699259 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ka.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ka.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">მოიძიეთ Chrome-ში თქვენი რჩეული საძიებო სისტემის მეშვეობით.</translation>
 <translation id="5277852985315196237">მოიძიეთ ან აკრიფეთ URL</translation>
 <translation id="529497070985873480">Chrome დინოზავრი</translation>
+<translation id="5325847452011598583">ანგარიში არ არის</translation>
 <translation id="5683557219437283801">ხმოვანი ძიება</translation>
 <translation id="6179961764474023795">სწრაფი ქმედებები</translation>
 <translation id="6330929932864892436">მოიძიეთ ან აკრიფეთ URL</translation>
@@ -39,6 +40,7 @@
 <translation id="8104498668011127805">Chrome დინოზავრის თამაშზე გადასვლა</translation>
 <translation id="8150601371542319992">Lens</translation>
 <translation id="8171952085734471362">ინკოგნიტო ძიება</translation>
+<translation id="8310150944719146950">ანგარიში</translation>
 <translation id="8564942608461410346">მოიძიეთ Chrome-ში თქვენი რჩეული საძიებო სისტემის მეშვეობით.</translation>
 <translation id="9175676375569833962">პაროლების
 ძიება</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ko.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ko.xtb
index 63f4a4f4..83e004f9 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ko.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ko.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">Chrome에서 내가 좋아하는 검색엔진을 이용하여 검색합니다.</translation>
 <translation id="5277852985315196237">검색 또는 URL 입력</translation>
 <translation id="529497070985873480">Chrome 공룡 게임</translation>
+<translation id="5325847452011598583">계정 없음</translation>
 <translation id="5683557219437283801">음성 검색</translation>
 <translation id="6179961764474023795">빠른 작업</translation>
 <translation id="6330929932864892436">검색 또는 URL 입력</translation>
@@ -39,6 +40,7 @@
 <translation id="8104498668011127805">Chrome 공룡 게임 시작</translation>
 <translation id="8150601371542319992">렌즈</translation>
 <translation id="8171952085734471362">시크릿 검색</translation>
+<translation id="8310150944719146950">계정</translation>
 <translation id="8564942608461410346">Chrome에서 내가 좋아하는 검색엔진을 이용하여 검색하세요.</translation>
 <translation id="9175676375569833962">비밀번호
 검색</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ky.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ky.xtb
index 2192d2e6..0951699 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ky.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ky.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">Chrome'до cүйүктүү издөө каражаттарыңыз менен издеңиз.</translation>
 <translation id="5277852985315196237">Издеңиз же URL'ди териңиз</translation>
 <translation id="529497070985873480">Chrome Dino</translation>
+<translation id="5325847452011598583">Аккаунт жок</translation>
 <translation id="5683557219437283801">Үн менен издөө</translation>
 <translation id="6179961764474023795">Ыкчам аракеттер</translation>
 <translation id="6330929932864892436">Издеп же URL'ди териңиз</translation>
@@ -39,6 +40,7 @@
 <translation id="8104498668011127805">Chrome Dino оюнун ачуу</translation>
 <translation id="8150601371542319992">Lens</translation>
 <translation id="8171952085734471362">Жашыруун издөө</translation>
+<translation id="8310150944719146950">Аккаунт</translation>
 <translation id="8564942608461410346">Chrome'до cүйүктүү издөө каражаттарыңыз менен издеңиз.</translation>
 <translation id="9175676375569833962">Сырсөздөрдү
 издөө</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_lo.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_lo.xtb
index 083ff29..7fd29fb 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_lo.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_lo.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">ຊອກຫາໃນ Chrome ດ້ວຍໂປຣແກຣມຊອກຫາທີ່ທ່ານມັກ.</translation>
 <translation id="5277852985315196237">ຊອກຫາ ຫຼື ພິມ URL</translation>
 <translation id="529497070985873480">Chrome Dino</translation>
+<translation id="5325847452011598583">ບໍ່ມີບັນຊີ</translation>
 <translation id="5683557219437283801">ຊອກຫາດ້ວຍສຽງ</translation>
 <translation id="6179961764474023795">ຄຳສັ່ງດ່ວນ</translation>
 <translation id="6330929932864892436">ຊອກຫາ ຫຼື ພິມ URL</translation>
@@ -39,6 +40,7 @@
 <translation id="8104498668011127805">ໄປທີ່ເກມ Chrome Dino</translation>
 <translation id="8150601371542319992">Lens</translation>
 <translation id="8171952085734471362">ການຊອກຫາແບບບໍ່ເປີດເຜີຍຕົວຕົນ</translation>
+<translation id="8310150944719146950">ບັນຊີ</translation>
 <translation id="8564942608461410346">ຊອກຫາໃນ Chrome ດ້ວຍໂປຣແກຣມຊອກຫາທີ່ທ່ານມັກ.</translation>
 <translation id="9175676375569833962">ຊອກຫາ
 ລະຫັດຜ່ານ</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_lv.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_lv.xtb
index eb22725..9adc322 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_lv.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_lv.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">Veiciet meklēšanu pārlūkā Chrome, izmantojot savu iecienīto meklētājprogrammu.</translation>
 <translation id="5277852985315196237">Meklējiet vai ievadiet URL</translation>
 <translation id="529497070985873480">Chrome dinozaurs</translation>
+<translation id="5325847452011598583">Nav konta</translation>
 <translation id="5683557219437283801">Meklēt ar balsi</translation>
 <translation id="6179961764474023795">Ātrās darbības</translation>
 <translation id="6330929932864892436">Meklēt vai ievadīt URL</translation>
@@ -39,6 +40,7 @@
 <translation id="8104498668011127805">Atvērt Chrome dinozaura spēli</translation>
 <translation id="8150601371542319992">Lens</translation>
 <translation id="8171952085734471362">Meklēt inkognito režīmā</translation>
+<translation id="8310150944719146950">Konts</translation>
 <translation id="8564942608461410346">Veiciet meklēšanu pārlūkā Chrome, izmantojot savu iecienīto meklētājprogrammu.</translation>
 <translation id="9175676375569833962">Paroļu
 meklēšana</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ne.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ne.xtb
index 3826e4bb..ee02bd3 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ne.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ne.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">Chrome मा आफूलाई मन पर्ने सर्च इन्जिन प्रयोग गरी खोज्नुहोस्।</translation>
 <translation id="5277852985315196237">खोज्नुहोस् वा URL टाइप गर्नुहोस्</translation>
 <translation id="529497070985873480">Chrome Dino</translation>
+<translation id="5325847452011598583">कुनै पनि खाता छैन</translation>
 <translation id="5683557219437283801">भ्वाइस सर्च</translation>
 <translation id="6179961764474023795">द्रुत कारबाहीहरू</translation>
 <translation id="6330929932864892436">खोज्नुहोस् वा URL टाइप गर्नुहोस्</translation>
@@ -39,6 +40,7 @@
 <translation id="8104498668011127805">Chrome Dino गेम खेल्नुहोस्</translation>
 <translation id="8150601371542319992">लेन्स</translation>
 <translation id="8171952085734471362">इन्कोग्निटो खोज</translation>
+<translation id="8310150944719146950">खाता</translation>
 <translation id="8564942608461410346">Chrome मा आफूलाई मन पर्ने सर्च इन्जिन प्रयोग गरी खोज्नुहोस्।</translation>
 <translation id="9175676375569833962">पासवर्डहरू
 खोज्नुहोस्</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_nl.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_nl.xtb
index f74eb78..bc42209 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_nl.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_nl.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">Zoek in Chrome met je favoriete zoekmachine.</translation>
 <translation id="5277852985315196237">Zoek of typ een URL</translation>
 <translation id="529497070985873480">Chrome Dino</translation>
+<translation id="5325847452011598583">Geen account</translation>
 <translation id="5683557219437283801">Gesproken zoekopdracht</translation>
 <translation id="6179961764474023795">Snelle acties</translation>
 <translation id="6330929932864892436">Zoek of typ een URL</translation>
@@ -38,6 +39,7 @@
 <translation id="8104498668011127805">Chrome Dino-game openen</translation>
 <translation id="8150601371542319992">Lens</translation>
 <translation id="8171952085734471362">Incognito zoeken</translation>
+<translation id="8310150944719146950">Account</translation>
 <translation id="8564942608461410346">Zoek in Chrome met je favoriete zoekmachine.</translation>
 <translation id="9175676375569833962">Wachtwoorden zoeken</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_or.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_or.xtb
index f569d61..58789df 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_or.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_or.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">ଆପଣଙ୍କ ପସନ୍ଦର ସନ୍ଧାନ ଇଞ୍ଜିନ ବ୍ୟବହାର କରି Chromeରେ ସନ୍ଧାନ କରନ୍ତୁ।</translation>
 <translation id="5277852985315196237">ସର୍ଚ୍ଚ କରନ୍ତୁ କିମ୍ବା URL ଟାଇପ କରନ୍ତୁ</translation>
 <translation id="529497070985873480">Chrome Dino</translation>
+<translation id="5325847452011598583">କୌଣସି ଆକାଉଣ୍ଟ ନାହିଁ</translation>
 <translation id="5683557219437283801">ଭଏସ ସର୍ଚ୍ଚ କରନ୍ତୁ</translation>
 <translation id="6179961764474023795">ଦ୍ରୁତ କାର୍ଯ୍ୟଗୁଡ଼ିକ</translation>
 <translation id="6330929932864892436">ସର୍ଚ୍ଚ କରନ୍ତୁ କିମ୍ବା URL ଟାଇପ କରନ୍ତୁ</translation>
@@ -38,6 +39,7 @@
 <translation id="8104498668011127805">Chrome Dino ଗେମକୁ ସିଧା ଯାଆନ୍ତୁ</translation>
 <translation id="8150601371542319992">Lens</translation>
 <translation id="8171952085734471362">ଇନକଗ୍ନିଟୋ ମୋଡରେ ସନ୍ଧାନ</translation>
+<translation id="8310150944719146950">ଆକାଉଣ୍ଟ</translation>
 <translation id="8564942608461410346">ଆପଣଙ୍କ ପସନ୍ଦର ସର୍ଚ୍ଚ ଇଞ୍ଜିନ ବ୍ୟବହାର କରି Chromeରେ ସର୍ଚ୍ଚ କରନ୍ତୁ।</translation>
 <translation id="9175676375569833962">ପାସୱାର୍ଡ
 ସର୍ଚ୍ଚ କରନ୍ତୁ</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ro.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ro.xtb
index 1ceb9d1..f0e0462 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ro.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ro.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">Caută în Chrome folosind motorul de căutare preferat.</translation>
 <translation id="5277852985315196237">Caută sau introdu adresa URL</translation>
 <translation id="529497070985873480">Jocul cu dinozauri din Chrome</translation>
+<translation id="5325847452011598583">Niciun cont</translation>
 <translation id="5683557219437283801">Căutare vocală</translation>
 <translation id="6179961764474023795">Acțiuni rapide</translation>
 <translation id="6330929932864892436">Caută sau introdu adresa URL</translation>
@@ -38,6 +39,7 @@
 <translation id="8104498668011127805">Accesează jocul cu dinozauri din Chrome</translation>
 <translation id="8150601371542319992">Lens</translation>
 <translation id="8171952085734471362">Căutare incognito</translation>
+<translation id="8310150944719146950">Cont</translation>
 <translation id="8564942608461410346">Caută în Chrome folosind motorul de căutare preferat.</translation>
 <translation id="9175676375569833962">Caută
 parole</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ru.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ru.xtb
index 67022654..fd1617b 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ru.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_ru.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">Пользуйтесь любимой поисковой системой в Chrome.</translation>
 <translation id="5277852985315196237">Введите запрос или URL</translation>
 <translation id="529497070985873480">Chrome Dino</translation>
+<translation id="5325847452011598583">Нет аккаунта</translation>
 <translation id="5683557219437283801">Голосовой поиск</translation>
 <translation id="6179961764474023795">Панель действий</translation>
 <translation id="6330929932864892436">Введите запрос или URL</translation>
@@ -38,6 +39,7 @@
 <translation id="8104498668011127805">Запустить игру Chrome Dino</translation>
 <translation id="8150601371542319992">Объектив</translation>
 <translation id="8171952085734471362">Поиск в режиме инкогнито</translation>
+<translation id="8310150944719146950">Аккаунт</translation>
 <translation id="8564942608461410346">Пользуйтесь любимой поисковой системой в Chrome.</translation>
 <translation id="9175676375569833962">Поиск
 паролей</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_zh-HK.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_zh-HK.xtb
index 86841d91..3b81d2c 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_zh-HK.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_zh-HK.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">在 Chrome 使用您喜愛的搜尋引擎進行搜尋。</translation>
 <translation id="5277852985315196237">搜尋或輸入網址</translation>
 <translation id="529497070985873480">Chrome 恐龍</translation>
+<translation id="5325847452011598583">沒有帳戶</translation>
 <translation id="5683557219437283801">語音搜尋</translation>
 <translation id="6179961764474023795">快速操作</translation>
 <translation id="6330929932864892436">搜尋或者輸入網址</translation>
@@ -39,6 +40,7 @@
 <translation id="8104498668011127805">進入 Chrome 恐龍遊戲</translation>
 <translation id="8150601371542319992">智能鏡頭</translation>
 <translation id="8171952085734471362">無痕搜尋</translation>
+<translation id="8310150944719146950">帳戶</translation>
 <translation id="8564942608461410346">在 Chrome 使用您喜愛的搜尋引擎進行搜尋。</translation>
 <translation id="9175676375569833962">搜尋
 密碼</translation>
diff --git a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_zh-TW.xtb b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_zh-TW.xtb
index 7760ca6..ad62b8ab 100644
--- a/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_zh-TW.xtb
+++ b/ios/chrome/widget_kit_extension/strings/resources/ios_widget_kit_extension_strings_zh-TW.xtb
@@ -20,6 +20,7 @@
 <translation id="5234725349196694896">在 Chrome 中使用你喜好的搜尋引擎進行搜尋。</translation>
 <translation id="5277852985315196237">搜尋或輸入網址</translation>
 <translation id="529497070985873480">Chrome 恐龍</translation>
+<translation id="5325847452011598583">沒有帳戶</translation>
 <translation id="5683557219437283801">語音搜尋</translation>
 <translation id="6179961764474023795">快速操作</translation>
 <translation id="6330929932864892436">搜尋或輸入網址</translation>
@@ -39,6 +40,7 @@
 <translation id="8104498668011127805">進入 Chrome 恐龍遊戲</translation>
 <translation id="8150601371542319992">智慧鏡頭</translation>
 <translation id="8171952085734471362">無痕搜尋</translation>
+<translation id="8310150944719146950">帳戶</translation>
 <translation id="8564942608461410346">在 Chrome 中使用你最喜愛的搜尋引擎進行搜尋。</translation>
 <translation id="9175676375569833962">搜尋密碼</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios_internal b/ios_internal
index bfe5c72..ff8ce0b 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit bfe5c7265c62fcd1f20a90bebeb4a3b7d44aae0d
+Subproject commit ff8ce0b2995198b6076b1a6fc0ac27d0d4bc5d6f
diff --git a/media/gpu/chromeos/video_decoder_pipeline_unittest.cc b/media/gpu/chromeos/video_decoder_pipeline_unittest.cc
index fac1dac..4910d48 100644
--- a/media/gpu/chromeos/video_decoder_pipeline_unittest.cc
+++ b/media/gpu/chromeos/video_decoder_pipeline_unittest.cc
@@ -22,8 +22,8 @@
 #include "media/base/mock_media_log.h"
 #include "media/base/status.h"
 #include "media/base/video_decoder_config.h"
-#include "media/gpu/chromeos/default_video_frame_converter.h"
 #include "media/gpu/chromeos/dmabuf_video_frame_pool.h"
+#include "media/gpu/chromeos/frame_resource_converter.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/libdrm/src/include/drm/drm_fourcc.h"
@@ -57,6 +57,29 @@
   return arg->MatchesForTesting(*buffer);
 }
 
+class FakeFrameResourceConverter : public FrameResourceConverter {
+ public:
+  static std::unique_ptr<FrameResourceConverter> Create() {
+    return base::WrapUnique<FrameResourceConverter>(
+        new FakeFrameResourceConverter());
+  }
+
+  FakeFrameResourceConverter(const FakeFrameResourceConverter&) = delete;
+  FakeFrameResourceConverter& operator=(const FakeFrameResourceConverter&) =
+      delete;
+
+ private:
+  FakeFrameResourceConverter() = default;
+  ~FakeFrameResourceConverter() override = default;
+
+  // FrameResourceConverter overrides.
+  void ConvertFrameImpl(scoped_refptr<FrameResource> frame) override {
+    // It is fine to output a nullptr VideoFrame. The output frames are not
+    // checked.
+    Output(nullptr);
+  }
+};
+
 class MockVideoFramePool : public DmabufVideoFramePool {
  public:
   MockVideoFramePool() = default;
@@ -205,7 +228,7 @@
             std::numeric_limits<int>::max()),
         gpu::GpuDriverBugWorkarounds(),
         base::SingleThreadTaskRunner::GetCurrentDefault(), std::move(pool),
-        DefaultFrameConverter::Create(),
+        FakeFrameResourceConverter::Create(),
         VideoDecoderPipeline::DefaultPreferredRenderableFourccs(),
         std::make_unique<MockMediaLog>(),
         // This callback needs to be configured in the individual tests.
diff --git a/media/gpu/vaapi/test/fake_libva_driver/fake_context.cc b/media/gpu/vaapi/test/fake_libva_driver/fake_context.cc
index 4ce7677..b98f5011 100644
--- a/media/gpu/vaapi/test/fake_libva_driver/fake_context.cc
+++ b/media/gpu/vaapi/test/fake_libva_driver/fake_context.cc
@@ -21,9 +21,9 @@
     int picture_height) {
   std::unique_ptr<base::Environment> env = base::Environment::Create();
   CHECK(env);
-  std::string no_op_flag;
-  if (env->GetVar("USE_NO_OP_CONTEXT_DELEGATE", &no_op_flag) &&
-      no_op_flag == "1") {
+  std::string no_op_flag =
+      env->GetVar("USE_NO_OP_CONTEXT_DELEGATE").value_or(std::string());
+  if (no_op_flag == "1") {
     return std::make_unique<media::internal::NoOpContextDelegate>();
   }
 
diff --git a/net/http/http_cache.cc b/net/http/http_cache.cc
index a6c3ac8..0a3f485 100644
--- a/net/http/http_cache.cc
+++ b/net/http/http_cache.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/341324165): Fix and remove.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "net/http/http_cache.h"
 
 #include <algorithm>
diff --git a/net/http/http_cache_writers.cc b/net/http/http_cache_writers.cc
index 0df0ff3..fb642cf 100644
--- a/net/http/http_cache_writers.cc
+++ b/net/http/http_cache_writers.cc
@@ -4,14 +4,10 @@
 
 #include "net/http/http_cache_writers.h"
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/390223051): Remove C-library calls to fix the errors.
-#pragma allow_unsafe_libc_calls
-#endif
-
 #include <algorithm>
 #include <utility>
 
+#include "base/containers/span.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
 #include "base/logging.h"
@@ -585,8 +581,8 @@
     if (result >= 0) {  // success
       // Save the data in the waiting transaction's read buffer.
       it->second.write_len = std::min(it->second.read_buf_len, result);
-      memcpy(it->second.read_buf->data(), read_buf_->data(),
-             it->second.write_len);
+      it->second.read_buf->span().copy_prefix_from(
+          read_buf_->first(it->second.write_len));
       callback_result = it->second.write_len;
     }
 
diff --git a/net/http/http_response_headers.cc b/net/http/http_response_headers.cc
index 11572f9..2a518cb 100644
--- a/net/http/http_response_headers.cc
+++ b/net/http/http_response_headers.cc
@@ -237,7 +237,7 @@
                                                    status_, headers_);
 }
 
-HttpResponseHeaders::HttpResponseHeaders(const std::string& raw_input)
+HttpResponseHeaders::HttpResponseHeaders(std::string_view raw_input)
     : response_code_(-1) {
   Parse(raw_input);
 
@@ -630,23 +630,22 @@
   AddHeader(kLengthHeader, base::StringPrintf("%" PRId64, range_len));
 }
 
-void HttpResponseHeaders::Parse(const std::string& raw_input) {
+void HttpResponseHeaders::Parse(std::string_view raw_input) {
   raw_headers_.reserve(raw_input.size());
   // TODO(crbug.com/40277776): Call reserve() on `parsed_` with an
   // appropriate value.
 
   // ParseStatusLine adds a normalized status line to raw_headers_
-  std::string::const_iterator line_begin = raw_input.begin();
-  std::string::const_iterator line_end = std::ranges::find(raw_input, '\0');
+  size_t line_end = raw_input.find('\0');
   // has_headers = true, if there is any data following the status line.
   // Used by ParseStatusLine() to decide if a HTTP/0.9 is really a HTTP/1.0.
   bool has_headers =
-      (line_end != raw_input.end() && (line_end + 1) != raw_input.end() &&
-       *(line_end + 1) != '\0');
-  ParseStatusLine(line_begin, line_end, has_headers);
+      (line_end != std::string::npos && (line_end + 1) != raw_input.size() &&
+       raw_input[line_end + 1] != '\0');
+  ParseStatusLine(raw_input.substr(0, line_end), has_headers);
   raw_headers_.push_back('\0');  // Terminate status line with a null.
 
-  if (line_end == raw_input.end()) {
+  if (line_end == std::string::npos) {
     raw_headers_.push_back('\0');  // Ensure the headers end with a double null.
 
     DCHECK_EQ('\0', raw_headers_[raw_headers_.size() - 2]);
@@ -654,12 +653,12 @@
     return;
   }
 
-  // Including a terminating null byte.
+  // Length of the written status line, including the terminating null byte.
   size_t status_line_len = raw_headers_.size();
 
-  // Now, we add the rest of the raw headers to raw_headers_, and begin parsing
-  // it (to populate our parsed_ vector).
-  raw_headers_.append(line_end + 1, raw_input.end());
+  // Now, we add the rest of the raw headers to `raw_headers_`, and begin
+  // parsing it (to populate our `parsed_` vector).
+  raw_headers_.append(raw_input.substr(line_end + 1));
 
   // Ensure the headers end with a double null.
   while (raw_headers_.size() < 2 ||
@@ -668,11 +667,8 @@
     raw_headers_.push_back('\0');
   }
 
-  // Adjust to point at the null byte following the status line
-  line_end = raw_headers_.begin() + status_line_len - 1;
-
-  HttpUtil::HeadersIterator headers(line_end + 1, raw_headers_.end(),
-                                    std::string(1, '\0'));
+  HttpUtil::HeadersIterator headers(raw_headers_.begin() + status_line_len,
+                                    raw_headers_.end(), std::string(1, '\0'));
   while (headers.GetNext()) {
     AddHeader(headers.name_begin(), headers.name_end(), headers.values_begin(),
               headers.values_end(), ContainsCommas::kMaybe);
@@ -815,30 +811,27 @@
 // Note: this implementation implicitly assumes that line_end points at a valid
 // sentinel character (such as '\0').
 // static
-HttpVersion HttpResponseHeaders::ParseVersion(
-    std::string::const_iterator line_begin,
-    std::string::const_iterator line_end) {
-  std::string::const_iterator p = line_begin;
+HttpVersion HttpResponseHeaders::ParseVersion(std::string_view line) {
+  size_t p = 0;
 
   // RFC9112 Section 2.3:
   // HTTP-version  = HTTP-name "/" DIGIT "." DIGIT
   // HTTP-name     = %s"HTTP"
 
-  if (!base::StartsWith(base::MakeStringPiece(line_begin, line_end), "http",
-                        base::CompareCase::INSENSITIVE_ASCII)) {
+  if (!base::StartsWith(line, "http", base::CompareCase::INSENSITIVE_ASCII)) {
     DVLOG(1) << "missing status line";
     return HttpVersion();
   }
 
   p += 4;
 
-  if (p >= line_end || *p != '/') {
+  if (p >= line.size() || line[p] != '/') {
     DVLOG(1) << "missing version";
     return HttpVersion();
   }
 
-  std::string::const_iterator dot = std::find(p, line_end, '.');
-  if (dot == line_end) {
+  size_t dot = line.find('.', p);
+  if (dot == std::string_view::npos || dot + 1 == line.size()) {
     DVLOG(1) << "malformed version";
     return HttpVersion();
   }
@@ -846,25 +839,23 @@
   ++p;  // from / to first digit.
   ++dot;  // from . to second digit.
 
-  if (!(base::IsAsciiDigit(*p) && base::IsAsciiDigit(*dot))) {
+  if (!(base::IsAsciiDigit(line[p]) && base::IsAsciiDigit(line[dot]))) {
     DVLOG(1) << "malformed version number";
     return HttpVersion();
   }
 
-  uint16_t major = *p - '0';
-  uint16_t minor = *dot - '0';
+  uint16_t major = line[p] - '0';
+  uint16_t minor = line[dot] - '0';
 
   return HttpVersion(major, minor);
 }
 
 // Note: this implementation implicitly assumes that line_end points at a valid
 // sentinel character (such as '\0').
-void HttpResponseHeaders::ParseStatusLine(
-    std::string::const_iterator line_begin,
-    std::string::const_iterator line_end,
-    bool has_headers) {
+void HttpResponseHeaders::ParseStatusLine(std::string_view line,
+                                          bool has_headers) {
   // Extract the version number
-  HttpVersion parsed_http_version = ParseVersion(line_begin, line_end);
+  HttpVersion parsed_http_version = ParseVersion(line);
 
   // Clamp the version number to one of: {0.9, 1.0, 1.1, 2.0}
   if (parsed_http_version == HttpVersion(0, 9) && !has_headers) {
@@ -887,17 +878,16 @@
   }
 
   // TODO(eroman): this doesn't make sense if ParseVersion failed.
-  std::string::const_iterator p = std::find(line_begin, line_end, ' ');
+  size_t space = line.find(' ');
 
-  if (p == line_end) {
+  if (space == std::string_view::npos) {
     DVLOG(1) << "missing response status; assuming 200 OK";
     raw_headers_.append(" 200 OK");
     response_code_ = HTTP_OK;
     return;
   }
 
-  response_code_ =
-      ParseStatus(base::MakeStringPiece(p + 1, line_end), raw_headers_);
+  response_code_ = ParseStatus(line.substr(space + 1), raw_headers_);
 }
 
 size_t HttpResponseHeaders::FindHeader(size_t from,
diff --git a/net/http/http_response_headers.h b/net/http/http_response_headers.h
index 8d67e1b..e7a3efe 100644
--- a/net/http/http_response_headers.h
+++ b/net/http/http_response_headers.h
@@ -137,7 +137,7 @@
   //
   // HttpResponseHeaders does not perform any encoding changes on the input.
   //
-  explicit HttpResponseHeaders(const std::string& raw_headers);
+  explicit HttpResponseHeaders(std::string_view raw_headers);
 
   // Initializes from the representation stored in the given pickle.  The data
   // for this object is found relative to the given pickle_iter, which should
@@ -473,15 +473,14 @@
   ~HttpResponseHeaders();
 
   // Initializes from the given raw headers.
-  void Parse(const std::string& raw_input);
+  void Parse(std::string_view raw_input);
 
   // Helper function for ParseStatusLine.
   // Tries to extract the "HTTP/X.Y" from a status line formatted like:
   //    HTTP/1.1 200 OK
   // with line_begin and end pointing at the begin and end of this line.  If the
   // status line is malformed, returns HttpVersion(0,0).
-  static HttpVersion ParseVersion(std::string::const_iterator line_begin,
-                                  std::string::const_iterator line_end);
+  static HttpVersion ParseVersion(std::string_view line);
 
   // Tries to extract the status line from a header block, given the first
   // line of said header block.  If the status line is malformed, we'll
@@ -489,9 +488,7 @@
   //    HTTP/1.1 200 OK
   // with line_begin and end pointing at the begin and end of this line.
   // Output will be a normalized version of this.
-  void ParseStatusLine(std::string::const_iterator line_begin,
-                       std::string::const_iterator line_end,
-                       bool has_headers);
+  void ParseStatusLine(std::string_view line, bool has_headers);
 
   // Find the header in our list (case-insensitive) starting with |parsed_| at
   // index |from|.  Returns string::npos if not found.
diff --git a/net/http/http_stream_parser.cc b/net/http/http_stream_parser.cc
index 260f8042..9ec4e47 100644
--- a/net/http/http_stream_parser.cc
+++ b/net/http/http_stream_parser.cc
@@ -2,11 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifdef UNSAFE_BUFFERS_BUILD
-// TODO(crbug.com/390223051): Remove C-library calls to fix the errors.
-#pragma allow_unsafe_libc_calls
-#endif
-
 #include "net/http/http_stream_parser.h"
 
 #include <algorithm>
@@ -267,18 +262,17 @@
     request_headers_ = base::MakeRefCounted<DrainableIOBuffer>(
         merged_request_headers_and_body, merged_size);
 
-    memcpy(request_headers_->data(), request.data(), request_headers_length_);
-    request_headers_->DidConsume(request_headers_length_);
+    request_headers_->span().copy_prefix_from(base::as_byte_span(request));
+    // Size of IOBuffers always fits within an int, so if `request` can't fit
+    // within an int, the above copy_prefix_from() would have triggered a CHECK.
+    request_headers_->DidConsume(static_cast<int>(request.size()));
 
-    uint64_t todo = upload_data_stream_->size();
-    while (todo) {
-      int consumed = upload_data_stream_->Read(request_headers_.get(),
-                                               static_cast<int>(todo),
-                                               CompletionOnceCallback());
+    while (int remaining = request_headers_->BytesRemaining() > 0) {
+      int consumed = upload_data_stream_->Read(
+          request_headers_.get(), remaining, CompletionOnceCallback());
       // Read() must succeed synchronously if not chunked and in memory.
-      DCHECK_GT(consumed, 0);
+      CHECK_GT(consumed, 0);
       request_headers_->DidConsume(consumed);
-      todo -= consumed;
     }
     DCHECK(upload_data_stream_->IsEOF());
     // Reset the offset, so the buffer can be read from the beginning.
@@ -458,7 +452,7 @@
 int HttpStreamParser::DoSendHeadersComplete(int result) {
   if (result < 0) {
     // In the unlikely case that the headers and body were merged, all the
-    // the headers were sent, but not all of the body way, and |result| is
+    // the headers were sent, but not all of the body was, and |result| is
     // an error that this should try reading after, stash the error for now and
     // act like the request was successfully sent.
     io_state_ = STATE_SEND_REQUEST_COMPLETE;
diff --git a/net/http/http_stream_pool.cc b/net/http/http_stream_pool.cc
index c695498..86e5f3e8 100644
--- a/net/http/http_stream_pool.cc
+++ b/net/http/http_stream_pool.cc
@@ -74,13 +74,13 @@
         HttpStreamPool::kConnectionAttemptDelayParamName.data(),
         HttpStreamPool::kDefaultConnectionAttemptDelay};
 
-constexpr base::FeatureParam<HttpStreamPool::StreamAttemptDelayBehavior>
-    kStreamAttemptDelayBehavior{
+constexpr base::FeatureParam<HttpStreamPool::TcpBasedAttemptDelayBehavior>
+    kTcpBasedAttemptDelayBehavior{
         &features::kHappyEyeballsV3,
-        HttpStreamPool::kStreamAttemptDelayBehaviorParamName.data(),
-        HttpStreamPool::StreamAttemptDelayBehavior::
+        HttpStreamPool::kTcpBasedAttemptDelayBehaviorParamName.data(),
+        HttpStreamPool::TcpBasedAttemptDelayBehavior::
             kStartTimerOnFirstQuicAttempt,
-        HttpStreamPool::kStreamAttemptDelayBehaviorOptions};
+        HttpStreamPool::kTcpBasedAttemptDelayBehaviorOptions};
 
 constexpr base::FeatureParam<bool> kVerboseNetLog{
     &features::kHappyEyeballsV3, HttpStreamPool::kVerboseNetLogParamName.data(),
@@ -128,9 +128,9 @@
 }
 
 // static
-HttpStreamPool::StreamAttemptDelayBehavior
-HttpStreamPool::GetStreamAttemptDelayBehavior() {
-  return kStreamAttemptDelayBehavior.Get();
+HttpStreamPool::TcpBasedAttemptDelayBehavior
+HttpStreamPool::GetTcpBasedAttemptDelayBehavior() {
+  return kTcpBasedAttemptDelayBehavior.Get();
 }
 
 // static
diff --git a/net/http/http_stream_pool.h b/net/http/http_stream_pool.h
index 5fb6366c..4b70142 100644
--- a/net/http/http_stream_pool.h
+++ b/net/http/http_stream_pool.h
@@ -52,8 +52,8 @@
     kIgnore,
   };
 
-  // Specify when to start the stream attempt delay timer.
-  enum class StreamAttemptDelayBehavior {
+  // Specify when to start the TCP based attempt delay timer.
+  enum class TcpBasedAttemptDelayBehavior {
     // Starts the stream attempt delay timer on the first service endpoint
     // update.
     kStartTimerOnFirstEndpointUpdate,
@@ -124,17 +124,17 @@
       "max_stream_per_group";
   static constexpr std::string_view kConnectionAttemptDelayParamName =
       "connection_attempt_delay";
-  static constexpr std::string_view kStreamAttemptDelayBehaviorParamName =
-      "stream_attempt_delay_behavior";
+  static constexpr std::string_view kTcpBasedAttemptDelayBehaviorParamName =
+      "tcp_based_attempt_delay_behavior";
   static constexpr std::string_view kVerboseNetLogParamName = "verbose_netlog";
   static constexpr std::string_view kConsistencyCheckParamName =
       "consistency_check";
 
-  static constexpr inline auto kStreamAttemptDelayBehaviorOptions =
-      std::to_array<base::FeatureParam<StreamAttemptDelayBehavior>::Option>(
-          {{StreamAttemptDelayBehavior::kStartTimerOnFirstEndpointUpdate,
+  static constexpr inline auto kTcpBasedAttemptDelayBehaviorOptions =
+      std::to_array<base::FeatureParam<TcpBasedAttemptDelayBehavior>::Option>(
+          {{TcpBasedAttemptDelayBehavior::kStartTimerOnFirstEndpointUpdate,
             "first_endpoint_update"},
-           {StreamAttemptDelayBehavior::kStartTimerOnFirstQuicAttempt,
+           {TcpBasedAttemptDelayBehavior::kStartTimerOnFirstQuicAttempt,
             "first_quic_attempt"}});
 
   class NET_EXPORT_PRIVATE Job;
@@ -146,7 +146,7 @@
   static base::TimeDelta GetConnectionAttemptDelay();
 
   // Returns when to start the stream attempt delay timer.
-  static StreamAttemptDelayBehavior GetStreamAttemptDelayBehavior();
+  static TcpBasedAttemptDelayBehavior GetTcpBasedAttemptDelayBehavior();
 
   explicit HttpStreamPool(HttpNetworkSession* http_network_session,
                           bool cleanup_on_ip_address_change = true);
diff --git a/net/http/http_stream_pool_attempt_manager.cc b/net/http/http_stream_pool_attempt_manager.cc
index 2a1ecc5..cf1c011 100644
--- a/net/http/http_stream_pool_attempt_manager.cc
+++ b/net/http/http_stream_pool_attempt_manager.cc
@@ -69,7 +69,7 @@
   return "Canceled";
 }
 
-std::string_view GetHistogramSuffixForStreamAttemptCancel(
+std::string_view GetHistogramSuffixForTcpBasedAttemptCancel(
     StreamSocketCloseReason reason) {
   switch (reason) {
     case StreamSocketCloseReason::kSpdySessionCreated:
@@ -104,17 +104,18 @@
 
 }  // namespace
 
-// Represents an in-flight stream attempt.
-class HttpStreamPool::AttemptManager::InFlightAttempt
+// Represents a TCP based attempt.
+class HttpStreamPool::AttemptManager::TcpBasedAttempt
     : public TlsStreamAttempt::SSLConfigProvider {
  public:
-  explicit InFlightAttempt(AttemptManager* manager) : manager_(manager) {}
+  explicit TcpBasedAttempt(AttemptManager* manager) : manager_(manager) {}
 
-  InFlightAttempt(const InFlightAttempt&) = delete;
-  InFlightAttempt& operator=(const InFlightAttempt&) = delete;
+  TcpBasedAttempt(const TcpBasedAttempt&) = delete;
+  TcpBasedAttempt& operator=(const TcpBasedAttempt&) = delete;
 
-  ~InFlightAttempt() override {
+  ~TcpBasedAttempt() override {
     base::TimeDelta elapsed = base::TimeTicks::Now() - start_time_;
+    // TODO(bashi): Rename following histograms to use TcpBased*.
     base::UmaHistogramTimes(
         base::StrCat({"Net.HttpStreamPool.StreamAttemptTime.",
                       GetResultHistogramSuffix(result_)}),
@@ -125,7 +126,7 @@
           "Net.HttpStreamPool.StreamAttemptCancelReason", *cancel_reason_);
 
       std::string_view suffix =
-          GetHistogramSuffixForStreamAttemptCancel(*cancel_reason_);
+          GetHistogramSuffixForTcpBasedAttemptCancel(*cancel_reason_);
       CHECK(manager_->initial_attempt_state_.has_value());
       base::UmaHistogramEnumeration(
           base::StrCat(
@@ -145,25 +146,25 @@
     attempt_ = std::move(attempt);
     start_time_ = base::TimeTicks::Now();
     int rv = attempt_->Start(
-        base::BindOnce(&InFlightAttempt::OnInFlightAttemptComplete,
+        base::BindOnce(&TcpBasedAttempt::OnInFlightAttemptComplete,
                        weak_ptr_factory_.GetWeakPtr()));
     if (rv == ERR_IO_PENDING) {
       // SAFETY: Unretained `manager_` is fine since `manager_` owns this and
       // `this` owns `slow_timer_`.
       slow_timer_.Start(FROM_HERE, HttpStreamPool::GetConnectionAttemptDelay(),
-                        base::BindOnce(&AttemptManager::OnInFlightAttemptSlow,
+                        base::BindOnce(&AttemptManager::OnTcpBasedAttemptSlow,
                                        base::Unretained(manager_), this));
       if (tls_attempt_ptr && !tls_attempt_ptr->IsTcpHandshakeCompleted()) {
         // SAFETY: Unretained `manager_` is fine since the passed callback runs
         // is invoked synchronously (without PostTask) when the TCP handshake
         // completes. See TlsStreamAttempt::DoTcpAttemptComplete.
         tls_attempt_ptr->SetTcpHandshakeCompletionCallback(base::BindOnce(
-            &AttemptManager::OnInFlightAttemptTcpHandshakeComplete,
+            &AttemptManager::OnTcpBasedAttemptTcpHandshakeComplete,
             base::Unretained(manager_), this));
       }
     } else {
       base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
-          FROM_HERE, base::BindOnce(&InFlightAttempt::OnInFlightAttemptComplete,
+          FROM_HERE, base::BindOnce(&TcpBasedAttempt::OnInFlightAttemptComplete,
                                     weak_ptr_factory_.GetWeakPtr(), rv));
     }
   }
@@ -255,7 +256,7 @@
 
  private:
   void OnInFlightAttemptComplete(int rv) {
-    manager_->OnInFlightAttemptComplete(this, rv);
+    manager_->OnTcpBasedAttemptComplete(this, rv);
   }
 
   const raw_ptr<AttemptManager> manager_;
@@ -274,7 +275,7 @@
   base::TimeTicks ssl_config_wait_start_time_;
   CompletionOnceCallback ssl_config_waiting_callback_;
 
-  base::WeakPtrFactory<InFlightAttempt> weak_ptr_factory_{this};
+  base::WeakPtrFactory<TcpBasedAttempt> weak_ptr_factory_{this};
 };
 
 // static
@@ -287,8 +288,8 @@
       return "ReachedPoolLimit";
     case CanAttemptResult::kNoPendingJob:
       return "NoPendingJob";
-    case CanAttemptResult::kBlockedStreamAttempt:
-      return "BlockedStreamAttempt";
+    case CanAttemptResult::kBlockedTcpBasedAttempt:
+      return "BlockedTcpBasedAttempt";
     case CanAttemptResult::kThrottledForSpdy:
       return "ThrottledForSpdy";
     case CanAttemptResult::kReachedGroupLimit:
@@ -356,25 +357,27 @@
           NetLogSourceType::HTTP_STREAM_POOL_ATTEMPT_MANAGER)),
       created_time_(base::TimeTicks::Now()),
       jobs_(NUM_PRIORITIES),
-      stream_attempt_delay_(GetStreamAttemptDelay()),
-      should_block_stream_attempt_(!stream_attempt_delay_.is_zero()) {
+      tcp_based_attempt_delay_(GetTcpBasedAttemptDelay()),
+      should_block_tcp_based_attempt_(!tcp_based_attempt_delay_.is_zero()) {
   CHECK(group_);
 
   net_log_.BeginEvent(
       NetLogEventType::HTTP_STREAM_POOL_ATTEMPT_MANAGER_ALIVE, [&] {
         base::Value::Dict dict;
         dict.Set("stream_key", stream_key().ToValue());
-        dict.Set("stream_attempt_delay",
-                 static_cast<int>(stream_attempt_delay_.InMilliseconds()));
-        dict.Set("should_block_stream_attempt", should_block_stream_attempt_);
+        dict.Set("tcp_based_attempt_delay",
+                 static_cast<int>(tcp_based_attempt_delay_.InMilliseconds()));
+        dict.Set("should_block_tcp_based_attempt",
+                 should_block_tcp_based_attempt_);
         group_->net_log().source().AddToEventParameters(dict);
         return dict;
       });
   group_->net_log().AddEventReferencingSource(
       NetLogEventType::HTTP_STREAM_POOL_GROUP_ATTEMPT_MANAGER_CREATED,
       net_log_.source());
+  // TODO(bashi): Rename the histogram to TcpBasedAttemptDelay.
   base::UmaHistogramTimes("Net.HttpStreamPool.StreamAttemptDelay",
-                          stream_attempt_delay_);
+                          tcp_based_attempt_delay_);
 }
 
 HttpStreamPool::AttemptManager::~AttemptManager() {
@@ -606,7 +609,7 @@
 }
 
 base::expected<SSLConfig, TlsStreamAttempt::GetSSLConfigError>
-HttpStreamPool::AttemptManager::GetSSLConfig(InFlightAttempt* attempt) {
+HttpStreamPool::AttemptManager::GetSSLConfig(TcpBasedAttempt* attempt) {
   CHECK(ssl_config_.has_value());
   CHECK(service_endpoint_request_);
   CHECK(!attempt->is_aborted());
@@ -680,24 +683,25 @@
 
   DCHECK(!HasAvailableSpdySession());
 
-  MaybeAttemptConnection(/*exclude_ip_endpoint=*/std::nullopt,
-                         /*max_attempts=*/1);
+  MaybeAttemptTcpBased(/*exclude_ip_endpoint=*/std::nullopt,
+                       /*max_attempts=*/1);
 }
 
-void HttpStreamPool::AttemptManager::CancelInFlightAttempts(
+void HttpStreamPool::AttemptManager::CancelTcpBasedAttempts(
     StreamSocketCloseReason reason) {
-  if (in_flight_attempts_.empty()) {
+  if (tcp_based_attempts_.empty()) {
     return;
   }
 
-  const size_t num_cancel_attempts = in_flight_attempts_.size();
-  for (auto& attempt : in_flight_attempts_) {
+  const size_t num_cancel_attempts = tcp_based_attempts_.size();
+  for (auto& attempt : tcp_based_attempts_) {
     attempt->SetCancelReason(reason);
   }
   pool()->DecrementTotalConnectingStreamCount(num_cancel_attempts);
-  in_flight_attempts_.clear();
-  slow_attempt_count_ = 0;
+  tcp_based_attempts_.clear();
+  slow_tcp_based_attempt_count_ = 0;
 
+  // TODO(bashi): Rename the histogram to TcpBasedAttemptCancelCount.
   base::UmaHistogramCounts100(
       base::StrCat({"Net.HttpStreamPool.StreamAttemptCancelCount.",
                     StreamSocketCloseReasonToString(reason)}),
@@ -827,10 +831,10 @@
 
   LoadState load_state = LOAD_STATE_IDLE;
 
-  // When there are in-flight attempts, use most advanced one.
-  for (const auto& in_flight_attempt : in_flight_attempts_) {
+  // When there are TCP based attempts, use most advanced one.
+  for (const auto& tcp_based_attempt : tcp_based_attempts_) {
     load_state =
-        std::max(load_state, in_flight_attempt->attempt()->GetLoadState());
+        std::max(load_state, tcp_based_attempt->attempt()->GetLoadState());
     // There should not be a load state later than LOAD_STATE_SSL_HANDSHAKE.
     if (load_state == LOAD_STATE_SSL_HANDSHAKE) {
       break;
@@ -862,7 +866,7 @@
     return false;
   }
 
-  if (!GetIPEndPointToAttempt().has_value()) {
+  if (!GetIPEndPointToAttemptTcpBased().has_value()) {
     return false;
   }
 
@@ -884,7 +888,7 @@
     case CanAttemptResult::kReachedPoolLimit:
       return true;
     case CanAttemptResult::kNoPendingJob:
-    case CanAttemptResult::kBlockedStreamAttempt:
+    case CanAttemptResult::kBlockedTcpBasedAttempt:
     case CanAttemptResult::kThrottledForSpdy:
     case CanAttemptResult::kReachedGroupLimit:
       return false;
@@ -944,14 +948,14 @@
 
   if (tcp_based_attempt_state_ == TcpBasedAttemptState::kAllEndpointsFailed ||
       !CanUseTcpBasedProtocols()) {
-    CancelStreamAttemptDelayTimer();
+    CancelTcpBasedAttemptDelayTimer();
     HandleFinalError(rv);
     return;
   }
 
-  if (should_block_stream_attempt_) {
-    CancelStreamAttemptDelayTimer();
-    MaybeAttemptConnection();
+  if (should_block_tcp_based_attempt_) {
+    CancelTcpBasedAttemptDelayTimer();
+    MaybeAttemptTcpBased();
   } else {
     MaybeCompleteLater();
   }
@@ -969,8 +973,9 @@
            static_cast<int>(PendingPreconnectCount()));
   dict.Set("preconnect_count_notifying",
            static_cast<int>(notifying_preconnect_completion_count_));
-  dict.Set("in_flight_attempt_count", static_cast<int>(InFlightAttemptCount()));
-  dict.Set("slow_attempt_count", static_cast<int>(slow_attempt_count_));
+  dict.Set("tcp_based_attempt_count", static_cast<int>(TcpBasedAttemptCount()));
+  dict.Set("slow_tcp_based_attempt_count",
+           static_cast<int>(slow_tcp_based_attempt_count_));
   dict.Set("is_failing", is_failing_);
   if (final_error_to_notify_jobs_.has_value()) {
     dict.Set("final_error_to_notify_job", *final_error_to_notify_jobs_);
@@ -984,22 +989,22 @@
            service_endpoint_request_finished_);
   dict.Set("tcp_based_attempt_state",
            TcpBasedAttemptStateToString(tcp_based_attempt_state_));
-  dict.Set("stream_attempt_delay_ms",
-           static_cast<int>(stream_attempt_delay_.InMilliseconds()));
-  dict.Set("should_block_stream_attempt", should_block_stream_attempt_);
+  dict.Set("tcp_based_attempt_delay_ms",
+           static_cast<int>(tcp_based_attempt_delay_.InMilliseconds()));
+  dict.Set("should_block_tcp_based_attempt", should_block_tcp_based_attempt_);
 
   dict.Set("ssl_config_is_avaliable", ssl_config_.has_value());
 
   int ssl_config_num_waiting_callbacks = 0;
-  if (!in_flight_attempts_.empty()) {
-    base::Value::List in_flight_attempts;
-    for (const auto& entry : in_flight_attempts_) {
+  if (!tcp_based_attempts_.empty()) {
+    base::Value::List tcp_based_attempts;
+    for (const auto& entry : tcp_based_attempts_) {
       if (entry->IsWaitingSSLConfig()) {
         ++ssl_config_num_waiting_callbacks;
       }
-      in_flight_attempts.Append(entry->GetInfoAsValue());
+      tcp_based_attempts.Append(entry->GetInfoAsValue());
     }
-    dict.Set("in_flight_attempts", std::move(in_flight_attempts));
+    dict.Set("tcp_based_attempts", std::move(tcp_based_attempts));
   }
   dict.Set("ssl_config_num_waiting_callbacks",
            ssl_config_num_waiting_callbacks);
@@ -1036,11 +1041,11 @@
 
 void HttpStreamPool::AttemptManager::StartInternal(Job* job) {
   RestrictAllowedProtocols(job->allowed_alpns());
-  UpdateStreamAttemptState();
+  UpdateTcpBasedAttemptState();
 
   if (service_endpoint_request_ || service_endpoint_request_finished_) {
     MaybeAttemptQuic();
-    MaybeAttemptConnection();
+    MaybeAttemptTcpBased();
   } else {
     ResolveServiceEndpoint(job->priority());
   }
@@ -1071,14 +1076,14 @@
   CHECK(!allowed_alpns_.empty());
 
   if (!CanUseTcpBasedProtocols()) {
-    CancelInFlightAttempts(
+    CancelTcpBasedAttempts(
         StreamSocketCloseReason::kCannotUseTcpBasedProtocols);
   }
 
   if (!CanUseQuic()) {
     // TODO(crbug.com/346835898): Use other error code?
     CancelQuicTask(ERR_ABORTED);
-    UpdateStreamAttemptState();
+    UpdateTcpBasedAttemptState();
   }
 }
 
@@ -1108,7 +1113,7 @@
   MaybeCalculateSSLConfig();
 
   if (CanUseExistingQuicSessionAfterEndpointChanges()) {
-    CHECK(in_flight_attempts_.empty());
+    CHECK(tcp_based_attempts_.empty());
     return;
   }
 
@@ -1124,20 +1129,20 @@
   }
 
   if (CanUseExistingSpdySessionAfterEndpointChanges()) {
-    CHECK(in_flight_attempts_.empty());
+    CHECK(tcp_based_attempts_.empty());
     return;
   }
 
-  if (GetStreamAttemptDelayBehavior() ==
-      StreamAttemptDelayBehavior::kStartTimerOnFirstEndpointUpdate) {
-    MaybeRunStreamAttemptDelayTimer();
+  if (GetTcpBasedAttemptDelayBehavior() ==
+      TcpBasedAttemptDelayBehavior::kStartTimerOnFirstEndpointUpdate) {
+    MaybeRunTcpBasedAttemptDelayTimer();
   }
 
   MaybeNotifySSLConfigReady();
   if (!quic_attempted) {
     MaybeAttemptQuic();
   }
-  MaybeAttemptConnection();
+  MaybeAttemptTcpBased();
 }
 
 bool HttpStreamPool::AttemptManager::
@@ -1271,8 +1276,8 @@
     // SSLConfig.
     // TODO(crbug.com/383220402): Put this check behind DCHECK_ALWAYS_ON or
     // remove this check once we have stabilized the implementation.
-    for (const auto& in_flight_attempt : in_flight_attempts_) {
-      CHECK(!in_flight_attempt->IsWaitingSSLConfig());
+    for (const auto& tcp_based_attempt : tcp_based_attempts_) {
+      CHECK(!tcp_based_attempt->IsWaitingSSLConfig());
     }
     return;
   }
@@ -1284,21 +1289,21 @@
   // avoid accessing in-flight attempts that could be destroyed while invoking
   // callbacks.
   std::vector<CompletionOnceCallback> callbacks;
-  for (auto& in_flight_attempt : in_flight_attempts_) {
-    if (!in_flight_attempt->is_slow() &&
-        !in_flight_attempt->slow_timer().IsRunning()) {
+  for (auto& tcp_based_attempt : tcp_based_attempts_) {
+    if (!tcp_based_attempt->is_slow() &&
+        !tcp_based_attempt->slow_timer().IsRunning()) {
       // TODO(crbug.com/346835898): Should we use a different delay other than
       // the connection attempt delay?
       // base::Unretained() is safe here because `this` owns the
-      // `in_flight_attempt` and `slow_timer`.
-      in_flight_attempt->slow_timer().Start(
+      // `tcp_based_attempt` and `slow_timer`.
+      tcp_based_attempt->slow_timer().Start(
           FROM_HERE, HttpStreamPool::GetConnectionAttemptDelay(),
-          base::BindOnce(&AttemptManager::OnInFlightAttemptSlow,
-                         base::Unretained(this), in_flight_attempt.get()));
+          base::BindOnce(&AttemptManager::OnTcpBasedAttemptSlow,
+                         base::Unretained(this), tcp_based_attempt.get()));
     }
 
-    if (in_flight_attempt->IsWaitingSSLConfig()) {
-      callbacks.emplace_back(in_flight_attempt->TakeSSLConfigWaitingCallback());
+    if (tcp_based_attempt->IsWaitingSSLConfig()) {
+      callbacks.emplace_back(tcp_based_attempt->TakeSSLConfigWaitingCallback());
     }
   }
 
@@ -1320,7 +1325,7 @@
   quic_task_->MaybeAttempt();
 }
 
-void HttpStreamPool::AttemptManager::MaybeAttemptConnection(
+void HttpStreamPool::AttemptManager::MaybeAttemptTcpBased(
     std::optional<IPEndPoint> exclude_ip_endpoint,
     std::optional<size_t> max_attempts) {
   if (is_failing_) {
@@ -1340,7 +1345,7 @@
   // and allowed.
   size_t num_attempts = 0;
   const bool using_tls = UsingTls();
-  while (IsConnectionAttemptReady()) {
+  while (IsTcpBasedAttemptReady()) {
     // TODO(crbug.com/346835898, crbug.com/406932139, crbug.com/406936736):
     // Change to DCHECK once we identify the cause of bugs.
     if (HasAvailableSpdySession()) {
@@ -1366,9 +1371,9 @@
       NOTREACHED();
     }
     std::optional<IPEndPoint> ip_endpoint =
-        GetIPEndPointToAttempt(exclude_ip_endpoint);
+        GetIPEndPointToAttemptTcpBased(exclude_ip_endpoint);
     if (!ip_endpoint.has_value()) {
-      if (service_endpoint_request_finished_ && in_flight_attempts_.empty()) {
+      if (service_endpoint_request_finished_ && tcp_based_attempts_.empty()) {
         tcp_based_attempt_state_ = TcpBasedAttemptState::kAllEndpointsFailed;
       }
       if (tcp_based_attempt_state_ ==
@@ -1405,10 +1410,10 @@
 
     CHECK(!preconnect_jobs_.empty() || group_->IdleStreamSocketCount() == 0);
 
-    auto in_flight_attempt = std::make_unique<InFlightAttempt>(this);
-    InFlightAttempt* raw_attempt = in_flight_attempt.get();
+    auto tcp_based_attempt = std::make_unique<TcpBasedAttempt>(this);
+    TcpBasedAttempt* raw_attempt = tcp_based_attempt.get();
     auto [_, inserted] =
-        in_flight_attempts_.emplace(std::move(in_flight_attempt));
+        tcp_based_attempts_.emplace(std::move(tcp_based_attempt));
     CHECK(inserted);
     pool()->IncrementTotalConnectingStreamCount();
 
@@ -1446,7 +1451,7 @@
   }
 }
 
-bool HttpStreamPool::AttemptManager::IsConnectionAttemptReady() {
+bool HttpStreamPool::AttemptManager::IsTcpBasedAttemptReady() {
   switch (CanAttemptConnection()) {
     case CanAttemptResult::kAttempt:
       // If we ignore stream limits and the pool's limit has already reached,
@@ -1460,7 +1465,7 @@
       return true;
     case CanAttemptResult::kNoPendingJob:
       return false;
-    case CanAttemptResult::kBlockedStreamAttempt:
+    case CanAttemptResult::kBlockedTcpBasedAttempt:
       return false;
     case CanAttemptResult::kThrottledForSpdy:
       // TODO(crbug.com/346835898): Consider throttling less aggressively (e.g.
@@ -1505,8 +1510,8 @@
     return CanAttemptResult::kThrottledForSpdy;
   }
 
-  if (should_block_stream_attempt_) {
-    return CanAttemptResult::kBlockedStreamAttempt;
+  if (should_block_tcp_based_attempt_) {
+    return CanAttemptResult::kBlockedTcpBasedAttempt;
   }
 
   if (ShouldRespectLimits()) {
@@ -1547,7 +1552,7 @@
   CHECK(UsingTls());
 
   // The first attempt should not be blocked.
-  if (in_flight_attempts_.empty()) {
+  if (tcp_based_attempts_.empty()) {
     return false;
   }
 
@@ -1569,13 +1574,14 @@
 
 size_t HttpStreamPool::AttemptManager::PendingCountInternal(
     size_t pending_count) const {
-  CHECK_GE(in_flight_attempts_.size(), slow_attempt_count_);
+  CHECK_GE(tcp_based_attempts_.size(), slow_tcp_based_attempt_count_);
   // When SPDY throttle delay passed, treat all in-flight attempts as non-slow,
   // to avoid attempting connections more than requested.
   // TODO(crbug.com/346835898): This behavior is tricky. Figure out a better
   // way to handle this situation.
-  size_t slow_count = spdy_throttle_delay_passed_ ? 0 : slow_attempt_count_;
-  size_t non_slow_count = in_flight_attempts_.size() - slow_count;
+  size_t slow_count =
+      spdy_throttle_delay_passed_ ? 0 : slow_tcp_based_attempt_count_;
+  size_t non_slow_count = tcp_based_attempts_.size() - slow_count;
   // The number of in-flight, non-slow attempts could be larger than the number
   // of jobs (e.g. a job was cancelled in the middle of an attempt).
   if (pending_count <= non_slow_count) {
@@ -1586,7 +1592,7 @@
 }
 
 std::optional<IPEndPoint>
-HttpStreamPool::AttemptManager::GetIPEndPointToAttempt(
+HttpStreamPool::AttemptManager::GetIPEndPointToAttemptTcpBased(
     std::optional<IPEndPoint> exclude_ip_endpoint) {
   // TODO(crbug.com/383824591): Add a trace event to see if this method is
   // time consuming.
@@ -1651,7 +1657,7 @@
         continue;
       case IPEndPointState::kSlowAttempting:
         if (!current_endpoint.has_value() &&
-            !HasEnoughAttemptsForSlowIPEndPoint(ip_endpoint)) {
+            !HasEnoughTcpBasedAttemptsForSlowIPEndPoint(ip_endpoint)) {
           current_endpoint = ip_endpoint;
           current_state = it->second;
         }
@@ -1661,7 +1667,7 @@
             !current_state.has_value() ||
             *current_state == IPEndPointState::kSlowAttempting;
         if (prefer_slow_succeeded &&
-            !HasEnoughAttemptsForSlowIPEndPoint(ip_endpoint)) {
+            !HasEnoughTcpBasedAttemptsForSlowIPEndPoint(ip_endpoint)) {
           current_endpoint = ip_endpoint;
           current_state = it->second;
         }
@@ -1670,13 +1676,13 @@
   }
 }
 
-bool HttpStreamPool::AttemptManager::HasEnoughAttemptsForSlowIPEndPoint(
+bool HttpStreamPool::AttemptManager::HasEnoughTcpBasedAttemptsForSlowIPEndPoint(
     const IPEndPoint& ip_endpoint) {
   // TODO(crbug.com/383824591): Consider modifying the value of
   // IPEndPointStateMap to track the number of in-flight attempts per
   // IPEndPoint, if this loop is a bottlenek.
   size_t num_attempts = 0;
-  for (const auto& entry : in_flight_attempts_) {
+  for (const auto& entry : tcp_based_attempts_) {
     if (entry->attempt()->ip_endpoint() == ip_endpoint) {
       ++num_attempts;
     }
@@ -1702,7 +1708,7 @@
         return dict;
       });
 
-  CancelInFlightAttempts(StreamSocketCloseReason::kAbort);
+  CancelTcpBasedAttempts(StreamSocketCloseReason::kAbort);
   CancelQuicTask(final_error_to_notify_jobs());
   NotifyPreconnectsComplete(final_error_to_notify_jobs());
   NotifyJobOfFailure();
@@ -1955,11 +1961,11 @@
   if (ShouldRespectLimits()) {
     while (group_->ActiveStreamSocketCount() >
                pool()->max_stream_sockets_per_group() &&
-           !in_flight_attempts_.empty()) {
-      std::unique_ptr<InFlightAttempt> attempt = std::move(
-          in_flight_attempts_.extract(in_flight_attempts_.begin()).value());
+           !tcp_based_attempts_.empty()) {
+      std::unique_ptr<TcpBasedAttempt> attempt = std::move(
+          tcp_based_attempts_.extract(tcp_based_attempts_.begin()).value());
       if (attempt->is_slow()) {
-        --slow_attempt_count_;
+        --slow_tcp_based_attempt_count_;
       }
       pool()->DecrementTotalConnectingStreamCount();
       attempt.reset();
@@ -1986,8 +1992,8 @@
   MaybeChangeServiceEndpointRequestPriority();
 }
 
-void HttpStreamPool::AttemptManager::OnInFlightAttemptComplete(
-    InFlightAttempt* raw_attempt,
+void HttpStreamPool::AttemptManager::OnTcpBasedAttemptComplete(
+    TcpBasedAttempt* raw_attempt,
     int rv) {
   net_log().AddEvent(
       NetLogEventType::HTTP_STREAM_POOL_ATTEMPT_MANAGER_ATTEMPT_END, [&] {
@@ -1999,8 +2005,8 @@
   raw_attempt->SetResult(rv);
   raw_attempt->slow_timer().Stop();
   if (raw_attempt->is_slow()) {
-    CHECK_GT(slow_attempt_count_, 0u);
-    --slow_attempt_count_;
+    CHECK_GT(slow_tcp_based_attempt_count_, 0u);
+    --slow_tcp_based_attempt_count_;
 
     if (rv == OK) {
       auto it = ip_endpoint_states_.find(raw_attempt->ip_endpoint());
@@ -2009,14 +2015,14 @@
     }
   }
 
-  auto it = in_flight_attempts_.find(raw_attempt);
-  CHECK(it != in_flight_attempts_.end());
-  std::unique_ptr<InFlightAttempt> in_flight_attempt =
-      std::move(in_flight_attempts_.extract(it).value());
+  auto it = tcp_based_attempts_.find(raw_attempt);
+  CHECK(it != tcp_based_attempts_.end());
+  std::unique_ptr<TcpBasedAttempt> tcp_based_attempt =
+      std::move(tcp_based_attempts_.extract(it).value());
   pool()->DecrementTotalConnectingStreamCount();
 
   if (rv != OK) {
-    HandleAttemptFailure(std::move(in_flight_attempt), rv);
+    HandleTcpBasedAttemptFailure(std::move(tcp_based_attempt), rv);
     return;
   }
 
@@ -2027,7 +2033,7 @@
   }
 
   LoadTimingInfo::ConnectTiming connect_timing =
-      in_flight_attempt->attempt()->connect_timing();
+      tcp_based_attempt->attempt()->connect_timing();
   connect_timing.domain_lookup_start = dns_resolution_start_time_;
   // If the attempt started before DNS resolution completion, `connect_start`
   // could be smaller than `dns_resolution_end_time_`. Use the smallest one.
@@ -2037,7 +2043,7 @@
           : std::min(connect_timing.connect_start, dns_resolution_end_time_);
 
   std::unique_ptr<StreamSocket> stream_socket =
-      in_flight_attempt->attempt()->ReleaseStreamSocket();
+      tcp_based_attempt->attempt()->ReleaseStreamSocket();
   CHECK(stream_socket);
   CHECK(service_endpoint_request_);
   stream_socket->SetDnsAliases(service_endpoint_request_->GetDnsAliasResults());
@@ -2055,7 +2061,7 @@
             MultiplexedSessionCreationInitiator::kUnknown, &spdy_session,
             SpdySessionInitiator::kHttpStreamPoolAttemptManager);
     if (create_result != OK) {
-      HandleAttemptFailure(std::move(in_flight_attempt), create_result);
+      HandleTcpBasedAttemptFailure(std::move(tcp_based_attempt), create_result);
       return;
     }
 
@@ -2067,7 +2073,7 @@
 
     base::UmaHistogramTimes(
         "Net.HttpStreamPool.NewSpdySessionEstablishTime",
-        base::TimeTicks::Now() - in_flight_attempt->start_time());
+        base::TimeTicks::Now() - tcp_based_attempt->start_time());
 
     HandleSpdySessionReady(spdy_session,
                            StreamSocketCloseReason::kSpdySessionCreated);
@@ -2083,11 +2089,11 @@
                                  std::move(connect_timing));
 }
 
-void HttpStreamPool::AttemptManager::OnInFlightAttemptTcpHandshakeComplete(
-    InFlightAttempt* raw_attempt,
+void HttpStreamPool::AttemptManager::OnTcpBasedAttemptTcpHandshakeComplete(
+    TcpBasedAttempt* raw_attempt,
     int rv) {
-  auto it = in_flight_attempts_.find(raw_attempt);
-  CHECK(it != in_flight_attempts_.end());
+  auto it = tcp_based_attempts_.find(raw_attempt);
+  CHECK(it != tcp_based_attempts_.end());
   if (raw_attempt->is_slow() || !raw_attempt->slow_timer().IsRunning()) {
     return;
   }
@@ -2095,13 +2101,13 @@
   raw_attempt->slow_timer().Stop();
 }
 
-void HttpStreamPool::AttemptManager::OnInFlightAttemptSlow(
-    InFlightAttempt* raw_attempt) {
-  auto it = in_flight_attempts_.find(raw_attempt);
-  CHECK(it != in_flight_attempts_.end());
+void HttpStreamPool::AttemptManager::OnTcpBasedAttemptSlow(
+    TcpBasedAttempt* raw_attempt) {
+  auto it = tcp_based_attempts_.find(raw_attempt);
+  CHECK(it != tcp_based_attempts_.end());
 
   raw_attempt->set_is_slow(true);
-  ++slow_attempt_count_;
+  ++slow_tcp_based_attempt_count_;
   // This will not overwrite the previous value, if it's already tagged as
   // kSlowSucceeded (Nor will it overwrite other values).
   ip_endpoint_states_.emplace(raw_attempt->attempt()->ip_endpoint(),
@@ -2109,23 +2115,23 @@
   prefer_ipv6_ = !raw_attempt->attempt()->ip_endpoint().address().IsIPv6();
 
   // Don't attempt the same IP endpoint.
-  MaybeAttemptConnection(/*exclude_ip_endpoint=*/raw_attempt->ip_endpoint());
+  MaybeAttemptTcpBased(/*exclude_ip_endpoint=*/raw_attempt->ip_endpoint());
 }
 
-void HttpStreamPool::AttemptManager::HandleAttemptFailure(
-    std::unique_ptr<InFlightAttempt> in_flight_attempt,
+void HttpStreamPool::AttemptManager::HandleTcpBasedAttemptFailure(
+    std::unique_ptr<TcpBasedAttempt> tcp_based_attempt,
     int rv) {
   CHECK_NE(rv, ERR_IO_PENDING);
-  connection_attempts_.emplace_back(in_flight_attempt->ip_endpoint(), rv);
-  ip_endpoint_states_.insert_or_assign(in_flight_attempt->ip_endpoint(),
+  connection_attempts_.emplace_back(tcp_based_attempt->ip_endpoint(), rv);
+  ip_endpoint_states_.insert_or_assign(tcp_based_attempt->ip_endpoint(),
                                        IPEndPointState::kFailed);
 
-  if (in_flight_attempt->is_aborted()) {
+  if (tcp_based_attempt->is_aborted()) {
     CHECK_EQ(rv, ERR_ABORTED);
     return;
   }
 
-  // We already removed `in_flight_attempt` from `in_flight_attempts_` so
+  // We already removed `tcp_based_attempt` from `tcp_based_attempts_` so
   // the active stream count is up-to-date.
   ProcessPreconnectsAfterAttemptComplete(rv, group_->ActiveStreamSocketCount());
 
@@ -2136,8 +2142,8 @@
 
   if (rv == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) {
     CHECK(UsingTls());
-    client_auth_cert_info_ = in_flight_attempt->attempt()->GetCertRequestInfo();
-    in_flight_attempt.reset();
+    client_auth_cert_info_ = tcp_based_attempt->attempt()->GetCertRequestInfo();
+    tcp_based_attempt.reset();
     HandleFinalError(rv);
     return;
   }
@@ -2146,33 +2152,33 @@
     // When a certificate error happened for an attempt, notifies all jobs of
     // the error.
     CHECK(UsingTls());
-    CHECK(in_flight_attempt->attempt()->stream_socket());
+    CHECK(tcp_based_attempt->attempt()->stream_socket());
     SSLInfo ssl_info;
     bool has_ssl_info =
-        in_flight_attempt->attempt()->stream_socket()->GetSSLInfo(&ssl_info);
+        tcp_based_attempt->attempt()->stream_socket()->GetSSLInfo(&ssl_info);
     CHECK(has_ssl_info);
     cert_error_ssl_info_ = ssl_info;
-    in_flight_attempt.reset();
+    tcp_based_attempt.reset();
     HandleFinalError(rv);
     return;
   }
 
   most_recent_tcp_error_ = rv;
-  in_flight_attempt.reset();
+  tcp_based_attempt.reset();
   // Try to connect to a different destination, if any.
   // TODO(crbug.com/383606724): Figure out better way to make connection
   // attempts, see the review comment at
   // https://chromium-review.googlesource.com/c/chromium/src/+/6160855/comment/60e04065_805b0b89/
-  MaybeAttemptConnection();
+  MaybeAttemptTcpBased();
 }
 
 void HttpStreamPool::AttemptManager::OnSpdyThrottleDelayPassed() {
   CHECK(!spdy_throttle_delay_passed_);
   spdy_throttle_delay_passed_ = true;
-  MaybeAttemptConnection();
+  MaybeAttemptTcpBased();
 }
 
-base::TimeDelta HttpStreamPool::AttemptManager::GetStreamAttemptDelay() {
+base::TimeDelta HttpStreamPool::AttemptManager::GetTcpBasedAttemptDelay() {
   if (!CanUseQuic()) {
     return base::TimeDelta();
   }
@@ -2181,42 +2187,43 @@
       quic_session_alias_key().session_key());
 }
 
-void HttpStreamPool::AttemptManager::UpdateStreamAttemptState() {
-  if (should_block_stream_attempt_ && !CanUseQuic()) {
-    CancelStreamAttemptDelayTimer();
+void HttpStreamPool::AttemptManager::UpdateTcpBasedAttemptState() {
+  if (should_block_tcp_based_attempt_ && !CanUseQuic()) {
+    CancelTcpBasedAttemptDelayTimer();
   }
 }
 
-void HttpStreamPool::AttemptManager::MaybeRunStreamAttemptDelayTimer() {
-  if (!should_block_stream_attempt_ ||
-      stream_attempt_delay_timer_.IsRunning() || !CanUseTcpBasedProtocols()) {
+void HttpStreamPool::AttemptManager::MaybeRunTcpBasedAttemptDelayTimer() {
+  if (!should_block_tcp_based_attempt_ ||
+      tcp_based_attempt_delay_timer_.IsRunning() ||
+      !CanUseTcpBasedProtocols()) {
     return;
   }
-  CHECK(!stream_attempt_delay_.is_zero());
-  stream_attempt_delay_timer_.Start(
-      FROM_HERE, stream_attempt_delay_,
-      base::BindOnce(&AttemptManager::OnStreamAttemptDelayPassed,
+  CHECK(!tcp_based_attempt_delay_.is_zero());
+  tcp_based_attempt_delay_timer_.Start(
+      FROM_HERE, tcp_based_attempt_delay_,
+      base::BindOnce(&AttemptManager::OnTcpBasedAttemptDelayPassed,
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
-void HttpStreamPool::AttemptManager::CancelStreamAttemptDelayTimer() {
-  should_block_stream_attempt_ = false;
-  stream_attempt_delay_timer_.Stop();
+void HttpStreamPool::AttemptManager::CancelTcpBasedAttemptDelayTimer() {
+  should_block_tcp_based_attempt_ = false;
+  tcp_based_attempt_delay_timer_.Stop();
 }
 
-void HttpStreamPool::AttemptManager::OnStreamAttemptDelayPassed() {
+void HttpStreamPool::AttemptManager::OnTcpBasedAttemptDelayPassed() {
   net_log().AddEvent(
       NetLogEventType::
-          HTTP_STREAM_POOL_ATTEMPT_MANAGER_STREAM_ATTEMPT_DELAY_PASSED,
+          HTTP_STREAM_POOL_ATTEMPT_MANAGER_TCP_BASED_ATTEMPT_DELAY_PASSED,
       [&] {
         base::Value::Dict dict;
-        dict.Set("stream_attempt_delay",
-                 static_cast<int>(stream_attempt_delay_.InMilliseconds()));
+        dict.Set("tcp_based_attempt_delay",
+                 static_cast<int>(tcp_based_attempt_delay_.InMilliseconds()));
         return dict;
       });
-  CHECK(should_block_stream_attempt_);
-  should_block_stream_attempt_ = false;
-  MaybeAttemptConnection();
+  CHECK(should_block_tcp_based_attempt_);
+  should_block_tcp_based_attempt_ = false;
+  MaybeAttemptTcpBased();
 }
 
 bool HttpStreamPool::AttemptManager::CanUseTcpBasedProtocols() {
@@ -2310,9 +2317,10 @@
   dict.Set("num_jobs", static_cast<int>(jobs_.size()));
   dict.Set("num_notified_jobs", static_cast<int>(notified_jobs_.size()));
   dict.Set("num_preconnects", static_cast<int>(preconnect_jobs_.size()));
-  dict.Set("num_inflight_attempts",
-           static_cast<int>(in_flight_attempts_.size()));
-  dict.Set("num_slow_attempts", static_cast<int>(slow_attempt_count_));
+  dict.Set("num_tcp_based_attempts",
+           static_cast<int>(tcp_based_attempts_.size()));
+  dict.Set("num_slow_attempts",
+           static_cast<int>(slow_tcp_based_attempt_count_));
   dict.Set("enable_ip_based_pooling", IsIpBasedPoolingEnabled());
   dict.Set("enable_alternative_services", IsAlternativeServiceEnabled());
   dict.Set("quic_task_alive", !!quic_task_);
@@ -2325,7 +2333,7 @@
 bool HttpStreamPool::AttemptManager::CanComplete() const {
   return jobs_.empty() && notified_jobs_.empty() && preconnect_jobs_.empty() &&
          notifying_preconnect_completion_count_ == 0 &&
-         in_flight_attempts_.empty() && !quic_task_;
+         tcp_based_attempts_.empty() && !quic_task_;
 }
 
 void HttpStreamPool::AttemptManager::MaybeComplete() {
diff --git a/net/http/http_stream_pool_attempt_manager.h b/net/http/http_stream_pool_attempt_manager.h
index b51cefb..ada0b8f0 100644
--- a/net/http/http_stream_pool_attempt_manager.h
+++ b/net/http/http_stream_pool_attempt_manager.h
@@ -134,11 +134,11 @@
   // failure.
   size_t NotifiedJobCount() const { return notified_jobs_.size(); }
 
-  // Returns the number of in-flight attempts.
-  size_t InFlightAttemptCount() const { return in_flight_attempts_.size(); }
+  // Returns the number of in-flight TCP based attempts.
+  size_t TcpBasedAttemptCount() const { return tcp_based_attempts_.size(); }
 
-  // Cancels all in-flight attempts.
-  void CancelInFlightAttempts(StreamSocketCloseReason reason);
+  // Cancels all in-flight TCP based attempts.
+  void CancelTcpBasedAttempts(StreamSocketCloseReason reason);
 
   // Called when `job` is going to be destroyed.
   void OnJobComplete(Job* job);
@@ -241,7 +241,7 @@
   enum class CanAttemptResult {
     kAttempt,
     kNoPendingJob,
-    kBlockedStreamAttempt,
+    kBlockedTcpBasedAttempt,
     kThrottledForSpdy,
     kReachedGroupLimit,
     kReachedPoolLimit,
@@ -259,7 +259,7 @@
 
   using JobQueue = PriorityQueue<raw_ptr<Job>>;
 
-  class InFlightAttempt;
+  class TcpBasedAttempt;
 
   static std::string_view CanAttemptResultToString(CanAttemptResult result);
 
@@ -295,7 +295,7 @@
   InitialAttemptState CalculateInitialAttemptState();
 
   base::expected<SSLConfig, TlsStreamAttempt::GetSSLConfigError> GetSSLConfig(
-      InFlightAttempt* attempt);
+      TcpBasedAttempt* attempt);
 
   bool UsingTls() const;
 
@@ -323,7 +323,7 @@
   void MaybeCalculateSSLConfig();
 
   // When SSLConfig is ready and the notification has not yet been sent,
-  // notifies in-flight attempts that SSLConfig is ready.
+  // notifies in-flight TCP based attempts that SSLConfig is ready.
   void MaybeNotifySSLConfigReady();
 
   // Attempts QUIC sessions if QUIC can be used and `this` is ready to start
@@ -334,7 +334,7 @@
   // haven't failed. If `exclude_ip_endpoint` is given, exclude the IPEndPoint
   // from attempts. If `max_attempts` is given, attempts connections up to
   // `max_attempts`.
-  void MaybeAttemptConnection(
+  void MaybeAttemptTcpBased(
       std::optional<IPEndPoint> exclude_ip_endpoint = std::nullopt,
       std::optional<size_t> max_attempts = std::nullopt);
 
@@ -342,7 +342,7 @@
   // haven't reached stream limits. If the pool reached the stream limit, may
   // close idle sockets in other groups. Also may cancel preconnects or trigger
   // `spdy_throttle_timer_`.
-  bool IsConnectionAttemptReady();
+  bool IsTcpBasedAttemptReady();
 
   // Actual implementation of IsConnectionAttemptReady(), without having side
   // effects.
@@ -363,7 +363,8 @@
   bool SupportsSpdy() const;
 
   // Returns true when connection attempts should be throttled because there is
-  // an in-flight attempt and the destination is known to support HTTP/2.
+  // an in-flight TCP based attempt and the destination is known to support
+  // HTTP/2.
   bool ShouldThrottleAttemptForSpdy() const;
 
   // Calculates the maximum streams counts requested by preconnects.
@@ -383,16 +384,17 @@
   // TODO(crbug.com/383606724): The current logic relies on rather naive and not
   // very well-founded heuristics. Write a design document and implement more
   // appropriate algorithm to pick an IPEndPoint.
-  std::optional<IPEndPoint> GetIPEndPointToAttempt(
+  std::optional<IPEndPoint> GetIPEndPointToAttemptTcpBased(
       std::optional<IPEndPoint> exclude_ip_endpoint = std::nullopt);
   void FindBetterIPEndPoint(const std::vector<IPEndPoint>& ip_endpoints,
                             std::optional<IPEndPoint> exclude_ip_endpoint,
                             std::optional<IPEndPointState>& current_state,
                             std::optional<IPEndPoint>& current_endpoint);
-  bool HasEnoughAttemptsForSlowIPEndPoint(const IPEndPoint& ip_endpoint);
+  bool HasEnoughTcpBasedAttemptsForSlowIPEndPoint(
+      const IPEndPoint& ip_endpoint);
 
   // Called when this gets a fatal error. Notifies all jobs of the failure and
-  // cancels in-flight TCP-based attempts and QuicTask's, if they exist.
+  // cancels in-flight TCP based attempts and QuicTask's, if they exist.
   void HandleFinalError(int error);
 
   // Calculate the failure kind to notify jobs of failure. Used to call one of
@@ -446,37 +448,38 @@
   Job* ExtractFirstJobToNotify();
 
   // Remove the pointeee of `job_pointer` from `jobs_`. May cancel in-flight
-  // attempts when there are no limit ignoring jobs after removing the job and
-  // in-flight attempts count is larger than the limit.
+  // TCP based attempts when there are no limit ignoring jobs after removing the
+  // job and in-flight TCP based attempts count is larger than the limit.
   raw_ptr<Job> RemoveJobFromQueue(JobQueue::Pointer job_pointer);
 
-  void OnInFlightAttemptComplete(InFlightAttempt* raw_attempt, int rv);
-  void OnInFlightAttemptTcpHandshakeComplete(InFlightAttempt* raw_attempt,
+  void OnTcpBasedAttemptComplete(TcpBasedAttempt* raw_attempt, int rv);
+  void OnTcpBasedAttemptTcpHandshakeComplete(TcpBasedAttempt* raw_attempt,
                                              int rv);
-  void OnInFlightAttemptSlow(InFlightAttempt* raw_attempt);
+  void OnTcpBasedAttemptSlow(TcpBasedAttempt* raw_attempt);
 
-  void HandleAttemptFailure(std::unique_ptr<InFlightAttempt> in_flight_attempt,
-                            int rv);
+  void HandleTcpBasedAttemptFailure(
+      std::unique_ptr<TcpBasedAttempt> tcp_based_attempt,
+      int rv);
 
   void OnSpdyThrottleDelayPassed();
 
-  // Returns the delay for TCP-based stream attempts in favor of QUIC.
-  base::TimeDelta GetStreamAttemptDelay();
+  // Returns the delay for TCP based attempts in favor of QUIC.
+  base::TimeDelta GetTcpBasedAttemptDelay();
 
-  // Updates whether stream attempts should be blocked or not. May cancel
-  // `stream_attempt_delay_timer_`.
-  void UpdateStreamAttemptState();
+  // Updates whether TCP based attempts should be blocked or not. May cancel
+  // `tcp_based_attempt_delay_timer_`.
+  void UpdateTcpBasedAttemptState();
 
-  // Runs the stream attempt delay timer if stream attempts are blocked and the
-  // timer is not running. StreamAttemptDelayBehavior specifies when this method
-  // is called.
-  void MaybeRunStreamAttemptDelayTimer();
+  // Runs the TCP based attempt delay timer if TCP based attempts are blocked
+  // and the timer is not running. TcpBasedAttemptDelayBehavior specifies when
+  // this method is called.
+  void MaybeRunTcpBasedAttemptDelayTimer();
 
-  // Cancels `stream_attempt_delay_timer_`.
-  void CancelStreamAttemptDelayTimer();
+  // Cancels `tcp_based_attempt_delay_timer_`.
+  void CancelTcpBasedAttemptDelayTimer();
 
-  // Called when `stream_attempt_delay_timer_` is fired.
-  void OnStreamAttemptDelayPassed();
+  // Called when `tcp_based_attempt_delay_timer_` is fired.
+  void OnTcpBasedAttemptDelayPassed();
 
   bool CanUseTcpBasedProtocols();
 
@@ -577,7 +580,7 @@
   // attempt failure, network change events, or QUIC task failure.
   std::optional<int> final_error_to_notify_jobs_;
 
-  // Set to the most recent TCP-based attempt failure, if any.
+  // Set to the most recent TCP based attempt failure, if any.
   std::optional<int> most_recent_tcp_error_;
 
   // Set to a SSLInfo when an attempt has failed with a certificate error. Used
@@ -597,10 +600,10 @@
   std::optional<SSLConfig> ssl_config_;
   bool ssl_config_ready_notified_ = false;
 
-  std::set<std::unique_ptr<InFlightAttempt>, base::UniquePtrComparator>
-      in_flight_attempts_;
-  // The number of in-flight attempts that are treated as slow.
-  size_t slow_attempt_count_ = 0;
+  std::set<std::unique_ptr<TcpBasedAttempt>, base::UniquePtrComparator>
+      tcp_based_attempts_;
+  // The number of in-flight TCP based attempts that are treated as slow.
+  size_t slow_tcp_based_attempt_count_ = 0;
 
   base::OneShotTimer spdy_throttle_timer_;
   bool spdy_throttle_delay_passed_ = false;
@@ -624,11 +627,11 @@
   // Set when `quic_task_` is completed.
   std::optional<int> quic_task_result_;
 
-  // The delay for TCP-based stream attempts in favor of QUIC.
-  base::TimeDelta stream_attempt_delay_;
-  // Set to true when stream attempts should be blocked.
-  bool should_block_stream_attempt_ = false;
-  base::OneShotTimer stream_attempt_delay_timer_;
+  // The delay for TCP based stream attempts in favor of QUIC.
+  base::TimeDelta tcp_based_attempt_delay_;
+  // Set to true when TCP based attempts should be blocked.
+  bool should_block_tcp_based_attempt_ = false;
+  base::OneShotTimer tcp_based_attempt_delay_timer_;
 
   base::WeakPtrFactory<AttemptManager> weak_ptr_factory_{this};
 };
diff --git a/net/http/http_stream_pool_attempt_manager_quic_task.cc b/net/http/http_stream_pool_attempt_manager_quic_task.cc
index 3e587f2..8e61b2e 100644
--- a/net/http/http_stream_pool_attempt_manager_quic_task.cc
+++ b/net/http/http_stream_pool_attempt_manager_quic_task.cc
@@ -119,9 +119,9 @@
       /*use_dns_aliases=*/true, std::move(dns_aliases),
       manager_->CalculateMultiplexedSessionCreationInitiator());
 
-  if (GetStreamAttemptDelayBehavior() ==
-      StreamAttemptDelayBehavior::kStartTimerOnFirstQuicAttempt) {
-    manager_->MaybeRunStreamAttemptDelayTimer();
+  if (GetTcpBasedAttemptDelayBehavior() ==
+      TcpBasedAttemptDelayBehavior::kStartTimerOnFirstQuicAttempt) {
+    manager_->MaybeRunTcpBasedAttemptDelayTimer();
   }
 
   int rv = session_attempt_->Start(base::BindOnce(
diff --git a/net/http/http_stream_pool_attempt_manager_unittest.cc b/net/http/http_stream_pool_attempt_manager_unittest.cc
index 3e00db4..dbf7878 100644
--- a/net/http/http_stream_pool_attempt_manager_unittest.cc
+++ b/net/http/http_stream_pool_attempt_manager_unittest.cc
@@ -1384,12 +1384,12 @@
     manager->ip_endpoint_states_for_testing() = std::move(states);
 
     std::optional<IPEndPoint> ip_endpoint =
-        manager->GetIPEndPointToAttempt(test_case.exclude_ip_endpoint);
+        manager->GetIPEndPointToAttemptTcpBased(test_case.exclude_ip_endpoint);
     EXPECT_THAT(ip_endpoint, test_case.expected);
 
     // Clean-up for the next iteration: destroy the attempt manager and the
     // group by cancelling the in-flight attempt.
-    manager->CancelInFlightAttempts(StreamSocketCloseReason::kUnspecified);
+    manager->CancelTcpBasedAttempts(StreamSocketCloseReason::kUnspecified);
     requester.ResetRequest();
     FastForwardUntilNoTasksRemain();
     ASSERT_FALSE(pool().GetGroupForTesting(stream_key));
@@ -1425,11 +1425,11 @@
       pool()
           .GetOrCreateGroupForTesting(requester.GetStreamKey())
           .GetAttemptManagerForTesting();
-  ASSERT_EQ(manager->InFlightAttemptCount(), 1u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u);
   ASSERT_FALSE(request->completed());
 
   FastForwardBy(HttpStreamPool::GetConnectionAttemptDelay());
-  ASSERT_EQ(manager->InFlightAttemptCount(), 2u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 2u);
   ASSERT_EQ(manager->PendingJobCount(), 0u);
   ASSERT_FALSE(request->completed());
 
@@ -1807,7 +1807,7 @@
       pool()
           .GetOrCreateGroupForTesting(requester.GetStreamKey())
           .GetAttemptManagerForTesting();
-  ASSERT_EQ(manager->InFlightAttemptCount(), 1u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u);
   ASSERT_FALSE(requester.result().has_value());
 
   // Complete TCP handshake after a delay that is less than the connection
@@ -1817,24 +1817,24 @@
   FastForwardBy(kTcpDelay);
   tcp_connect_completer1.Complete(OK);
   RunUntilIdle();
-  ASSERT_EQ(manager->InFlightAttemptCount(), 1u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u);
 
   // Fast-forward to the connection attempt delay. Since the in-flight attempt
   // has completed TCP handshake and is waiting for HTTPS RR, the manager
   // shouldn't start another attempt.
   FastForwardBy(HttpStreamPool::GetConnectionAttemptDelay());
-  ASSERT_EQ(manager->InFlightAttemptCount(), 1u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u);
 
   // Complete DNS resolution fully.
   endpoint_request->set_crypto_ready(true).CallOnServiceEndpointRequestFinished(
       OK);
-  ASSERT_EQ(manager->InFlightAttemptCount(), 1u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u);
 
   // Fast-forward to the connection attempt delay again. This time the in-flight
   // attempt is still doing TLS handshake, it's treated as slow and the manager
   // should start another attempt.
   FastForwardBy(HttpStreamPool::GetConnectionAttemptDelay());
-  ASSERT_EQ(manager->InFlightAttemptCount(), 2u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 2u);
 
   // Complete the second attempt. The request should finish successfully.
   tcp_connect_completer2.Complete(OK);
@@ -1924,7 +1924,7 @@
   AttemptManager* manager = group.GetAttemptManagerForTesting();
   ASSERT_EQ(pool().TotalActiveStreamCount(), kMaxPerGroup);
   ASSERT_EQ(group.ActiveStreamSocketCount(), kMaxPerGroup);
-  ASSERT_EQ(manager->InFlightAttemptCount(), kMaxPerGroup);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), kMaxPerGroup);
   ASSERT_EQ(manager->PendingJobCount(), 0u);
 
   // This request should not start an attempt as the group reached its limit.
@@ -1937,7 +1937,7 @@
 
   ASSERT_EQ(pool().TotalActiveStreamCount(), kMaxPerGroup);
   ASSERT_EQ(group.ActiveStreamSocketCount(), kMaxPerGroup);
-  ASSERT_EQ(manager->InFlightAttemptCount(), kMaxPerGroup);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), kMaxPerGroup);
   ASSERT_EQ(manager->PendingJobCount(), 1u);
   ASSERT_EQ(stalled_request->GetLoadState(),
             LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET);
@@ -1946,7 +1946,7 @@
   RunUntilIdle();
   ASSERT_EQ(pool().TotalActiveStreamCount(), kMaxPerGroup);
   ASSERT_EQ(group.ActiveStreamSocketCount(), kMaxPerGroup);
-  ASSERT_EQ(manager->InFlightAttemptCount(), 0u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 0u);
   ASSERT_EQ(manager->PendingJobCount(), 1u);
 
   // Release one HttpStream and close it to make non-reusable.
@@ -1971,14 +1971,14 @@
 
   ASSERT_EQ(pool().TotalActiveStreamCount(), kMaxPerGroup);
   ASSERT_EQ(group.ActiveStreamSocketCount(), kMaxPerGroup);
-  ASSERT_EQ(manager->InFlightAttemptCount(), 1u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u);
   ASSERT_EQ(manager->PendingJobCount(), 0u);
 
   RunUntilIdle();
 
   ASSERT_EQ(pool().TotalActiveStreamCount(), kMaxPerGroup);
   ASSERT_EQ(group.ActiveStreamSocketCount(), kMaxPerGroup);
-  ASSERT_EQ(manager->InFlightAttemptCount(), 0u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 0u);
   ASSERT_EQ(manager->PendingJobCount(), 0u);
   ASSERT_TRUE(stalled_request->completed());
   std::unique_ptr<HttpStream> stream = stalled_requester.ReleaseStream();
@@ -2057,7 +2057,7 @@
   ASSERT_FALSE(request2->completed());
   ASSERT_TRUE(pool().ReachedMaxStreamLimit());
   ASSERT_TRUE(pool().IsPoolStalled());
-  ASSERT_EQ(manager_b->InFlightAttemptCount(), 0u);
+  ASSERT_EQ(manager_b->TcpBasedAttemptCount(), 0u);
   ASSERT_EQ(manager_b->PendingJobCount(), 1u);
 
   // Release one HttpStream from group A. It should unblock the in-flight
@@ -2350,7 +2350,7 @@
   }
 
   Group& group = pool().GetOrCreateGroupForTesting(stream_key);
-  ASSERT_GT(group.GetAttemptManagerForTesting()->InFlightAttemptCount(),
+  ASSERT_GT(group.GetAttemptManagerForTesting()->TcpBasedAttemptCount(),
             kMaxPerGroup);
 
   // Complete requests that ignore limits.
@@ -2596,16 +2596,16 @@
           .GetOrCreateGroupForTesting(requester2.GetStreamKey())
           .GetAttemptManagerForTesting();
   ASSERT_EQ(manager1->JobCount(), 1u);
-  ASSERT_EQ(manager1->InFlightAttemptCount(), 1u);
+  ASSERT_EQ(manager1->TcpBasedAttemptCount(), 1u);
   ASSERT_EQ(manager2->JobCount(), 1u);
-  ASSERT_EQ(manager2->InFlightAttemptCount(), 1u);
+  ASSERT_EQ(manager2->TcpBasedAttemptCount(), 1u);
 
   NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
   RunUntilIdle();
   ASSERT_EQ(manager1->JobCount(), 0u);
-  ASSERT_EQ(manager1->InFlightAttemptCount(), 0u);
+  ASSERT_EQ(manager1->TcpBasedAttemptCount(), 0u);
   ASSERT_EQ(manager2->JobCount(), 0u);
-  ASSERT_EQ(manager2->InFlightAttemptCount(), 0u);
+  ASSERT_EQ(manager2->TcpBasedAttemptCount(), 0u);
   EXPECT_THAT(requester1.result(), Optional(IsError(ERR_NETWORK_CHANGED)));
   EXPECT_THAT(requester2.result(), Optional(IsError(ERR_NETWORK_CHANGED)));
 }
@@ -2714,7 +2714,7 @@
       pool().GetGroupForTesting(stream_key)->GetAttemptManagerForTesting();
   ASSERT_EQ(manager->JobCount(), 2u);
   ASSERT_EQ(manager->NotifiedJobCount(), 0u);
-  ASSERT_EQ(manager->InFlightAttemptCount(), 2u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 2u);
 
   auto count_slow_attempt_endpoints = [&]() {
     size_t count = 0;
@@ -2739,7 +2739,7 @@
   ASSERT_TRUE(manager);
   ASSERT_EQ(manager->JobCount(), 0u);
   ASSERT_EQ(manager->NotifiedJobCount(), 0u);
-  ASSERT_EQ(manager->InFlightAttemptCount(), 2u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 2u);
 
   // Trigger an SSLConfig change. This should cancel in-flight attempts.
   ssl_config_service()->NotifySSLContextConfigChange();
@@ -2845,7 +2845,7 @@
   }
   Group& group =
       pool().GetOrCreateGroupForTesting(requesters[0]->GetStreamKey());
-  ASSERT_EQ(group.GetAttemptManagerForTesting()->InFlightAttemptCount(), 0u);
+  ASSERT_EQ(group.GetAttemptManagerForTesting()->TcpBasedAttemptCount(), 0u);
   ASSERT_EQ(group.IdleStreamSocketCount(), 0u);
   ASSERT_EQ(group.ActiveStreamSocketCount(), 1u);
   ASSERT_EQ(pool().TotalConnectingStreamCount(), 0u);
@@ -3556,7 +3556,7 @@
       .CallOnServiceEndpointRequestFinished(OK);
   // There should be only one in-flight attempt because attempts are throttled.
   Group& group = pool().GetOrCreateGroupForTesting(requester1.GetStreamKey());
-  ASSERT_EQ(group.GetAttemptManagerForTesting()->InFlightAttemptCount(), 1u);
+  ASSERT_EQ(group.GetAttemptManagerForTesting()->TcpBasedAttemptCount(), 1u);
 
   // This should not enter an infinite loop.
   pool().ProcessPendingRequestsInGroups();
@@ -3608,14 +3608,14 @@
       .CallOnServiceEndpointRequestFinished(OK);
   // There should be only one in-flight attempt because attempts are throttled.
   Group& group = pool().GetOrCreateGroupForTesting(requester1.GetStreamKey());
-  ASSERT_EQ(group.GetAttemptManagerForTesting()->InFlightAttemptCount(), 1u);
+  ASSERT_EQ(group.GetAttemptManagerForTesting()->TcpBasedAttemptCount(), 1u);
 
   FastForwardBy(AttemptManager::kSpdyThrottleDelay);
-  ASSERT_EQ(group.GetAttemptManagerForTesting()->InFlightAttemptCount(), 2u);
+  ASSERT_EQ(group.GetAttemptManagerForTesting()->TcpBasedAttemptCount(), 2u);
 
   connect_completer1.Complete(OK);
   RunUntilIdle();
-  ASSERT_EQ(group.GetAttemptManagerForTesting()->InFlightAttemptCount(), 0u);
+  ASSERT_EQ(group.GetAttemptManagerForTesting()->TcpBasedAttemptCount(), 0u);
 
   EXPECT_THAT(requester1.result(), Optional(IsOk()));
   EXPECT_THAT(requester2.result(), Optional(IsOk()));
@@ -3661,14 +3661,14 @@
       .CallOnServiceEndpointRequestFinished(OK);
   // There should be only one in-flight attempt because attempts are throttled.
   Group& group = pool().GetOrCreateGroupForTesting(requester1.GetStreamKey());
-  ASSERT_EQ(group.GetAttemptManagerForTesting()->InFlightAttemptCount(), 1u);
+  ASSERT_EQ(group.GetAttemptManagerForTesting()->TcpBasedAttemptCount(), 1u);
 
   FastForwardBy(AttemptManager::kSpdyThrottleDelay);
-  ASSERT_EQ(group.GetAttemptManagerForTesting()->InFlightAttemptCount(), 2u);
+  ASSERT_EQ(group.GetAttemptManagerForTesting()->TcpBasedAttemptCount(), 2u);
 
   connect_completer1.Complete(OK);
   RunUntilIdle();
-  ASSERT_EQ(group.GetAttemptManagerForTesting()->InFlightAttemptCount(), 1u);
+  ASSERT_EQ(group.GetAttemptManagerForTesting()->TcpBasedAttemptCount(), 1u);
 
   connect_completer2.Complete(OK);
   RunUntilIdle();
@@ -3711,7 +3711,7 @@
       ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint())
       .CallOnServiceEndpointRequestFinished(OK);
   Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey());
-  ASSERT_EQ(group.GetAttemptManagerForTesting()->InFlightAttemptCount(), 1u);
+  ASSERT_EQ(group.GetAttemptManagerForTesting()->TcpBasedAttemptCount(), 1u);
   ASSERT_FALSE(preconnector.result().has_value());
 
   RunUntilIdle();
@@ -3740,7 +3740,7 @@
       ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint())
       .CallOnServiceEndpointRequestFinished(OK);
   Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey());
-  ASSERT_EQ(group.GetAttemptManagerForTesting()->InFlightAttemptCount(),
+  ASSERT_EQ(group.GetAttemptManagerForTesting()->TcpBasedAttemptCount(),
             kNumStreams);
   ASSERT_FALSE(preconnector.result().has_value());
 
@@ -3787,7 +3787,7 @@
   int rv =
       preconnector.set_num_streams(kNumPreconnectStreams).Preconnect(pool());
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
-  ASSERT_EQ(group.GetAttemptManagerForTesting()->InFlightAttemptCount(),
+  ASSERT_EQ(group.GetAttemptManagerForTesting()->TcpBasedAttemptCount(),
             kNumPreconnectStreams - 1u);
   ASSERT_FALSE(preconnector.result().has_value());
 
@@ -3823,7 +3823,7 @@
       ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint())
       .CallOnServiceEndpointRequestFinished(OK);
   Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey());
-  ASSERT_EQ(group.GetAttemptManagerForTesting()->InFlightAttemptCount(), 1u);
+  ASSERT_EQ(group.GetAttemptManagerForTesting()->TcpBasedAttemptCount(), 1u);
   ASSERT_FALSE(preconnector.result().has_value());
 
   RunUntilIdle();
@@ -3865,7 +3865,7 @@
       ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint())
       .CallOnServiceEndpointRequestFinished(OK);
   Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey());
-  ASSERT_EQ(group.GetAttemptManagerForTesting()->InFlightAttemptCount(), 2u);
+  ASSERT_EQ(group.GetAttemptManagerForTesting()->TcpBasedAttemptCount(), 2u);
   ASSERT_FALSE(preconnector.result().has_value());
 
   RunUntilIdle();
@@ -3900,7 +3900,7 @@
       ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint())
       .CallOnServiceEndpointRequestFinished(OK);
   Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey());
-  ASSERT_EQ(group.GetAttemptManagerForTesting()->InFlightAttemptCount(),
+  ASSERT_EQ(group.GetAttemptManagerForTesting()->TcpBasedAttemptCount(),
             kNumStreams);
   ASSERT_FALSE(preconnector.result().has_value());
 
@@ -3938,7 +3938,7 @@
       ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint())
       .CallOnServiceEndpointRequestFinished(OK);
   Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey());
-  ASSERT_EQ(group.GetAttemptManagerForTesting()->InFlightAttemptCount(),
+  ASSERT_EQ(group.GetAttemptManagerForTesting()->TcpBasedAttemptCount(),
             kNumStreams);
   ASSERT_FALSE(preconnector.result().has_value());
 
@@ -4575,7 +4575,7 @@
       pool()
           .GetOrCreateGroupForTesting(requester.GetStreamKey())
           .GetAttemptManagerForTesting();
-  ASSERT_EQ(manager->InFlightAttemptCount(), 0u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 0u);
 
   requester.WaitForResult();
   EXPECT_THAT(requester.result(), Optional(IsOk()));
@@ -5504,8 +5504,8 @@
       /*enabled_features=*/
       {{features::kAsyncQuicSession, {}},
        {features::kHappyEyeballsV3,
-        {{HttpStreamPool::kStreamAttemptDelayBehaviorParamName.data(),
-          HttpStreamPool::kStreamAttemptDelayBehaviorOptions[0].name}}}},
+        {{HttpStreamPool::kTcpBasedAttemptDelayBehaviorParamName.data(),
+          HttpStreamPool::kTcpBasedAttemptDelayBehaviorOptions[0].name}}}},
       /*disabled_features=*/{});
 
   quic_session_pool()->SetTimeDelayForWaitingJobForTesting(kDelay);
@@ -5548,7 +5548,7 @@
   endpoint_request->CallOnServiceEndpointRequestFinished(OK);
   ASSERT_FALSE(requester.result().has_value());
   ASSERT_TRUE(manager->quic_task_for_testing());
-  ASSERT_EQ(manager->InFlightAttemptCount(), 1u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u);
 
   // The request should complete with the TCP-based attempt.
   requester.WaitForResult();
@@ -5567,8 +5567,8 @@
       /*enabled_features=*/
       {{features::kAsyncQuicSession, {}},
        {features::kHappyEyeballsV3,
-        {{HttpStreamPool::kStreamAttemptDelayBehaviorParamName.data(),
-          HttpStreamPool::kStreamAttemptDelayBehaviorOptions[1].name}}}},
+        {{HttpStreamPool::kTcpBasedAttemptDelayBehaviorParamName.data(),
+          HttpStreamPool::kTcpBasedAttemptDelayBehaviorOptions[1].name}}}},
       /*disabled_features=*/{});
 
   quic_session_pool()->SetTimeDelayForWaitingJobForTesting(kQuicDelay);
@@ -5610,7 +5610,7 @@
   endpoint_request->CallOnServiceEndpointRequestFinished(OK);
   ASSERT_FALSE(requester.result().has_value());
   ASSERT_TRUE(manager->quic_task_for_testing());
-  ASSERT_EQ(manager->InFlightAttemptCount(), 0u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 0u);
 
   // Fire the stream attempt delay timer. The request should complete.
   FastForwardBy(kQuicDelay);
@@ -5632,8 +5632,8 @@
       /*enabled_features=*/
       {{features::kAsyncQuicSession, {}},
        {features::kHappyEyeballsV3,
-        {{HttpStreamPool::kStreamAttemptDelayBehaviorParamName.data(),
-          HttpStreamPool::kStreamAttemptDelayBehaviorOptions[1].name}}}},
+        {{HttpStreamPool::kTcpBasedAttemptDelayBehaviorParamName.data(),
+          HttpStreamPool::kTcpBasedAttemptDelayBehaviorOptions[1].name}}}},
       /*disabled_features=*/{});
 
   quic_session_pool()->SetTimeDelayForWaitingJobForTesting(kDelay);
@@ -5677,7 +5677,7 @@
   EXPECT_FALSE(manager->quic_task_for_testing());
   EXPECT_THAT(manager->GetQuicTaskResultForTesting(),
               Optional(IsError(ERR_DNS_NO_MATCHING_SUPPORTED_ALPN)));
-  EXPECT_EQ(manager->InFlightAttemptCount(), 1u);
+  EXPECT_EQ(manager->TcpBasedAttemptCount(), 1u);
 
   connect_completer.Complete(OK);
   preconnector.WaitForResult();
@@ -7048,7 +7048,7 @@
       pool()
           .GetOrCreateGroupForTesting(requester.GetStreamKey())
           .GetAttemptManagerForTesting();
-  EXPECT_THAT(manager->InFlightAttemptCount(), 0u);
+  EXPECT_THAT(manager->TcpBasedAttemptCount(), 0u);
   EXPECT_THAT(manager->GetQuicTaskResultForTesting(),
               Optional(IsError(ERR_NETWORK_CHANGED)));
 }
@@ -7097,7 +7097,7 @@
       pool()
           .GetOrCreateGroupForTesting(requester.GetStreamKey())
           .GetAttemptManagerForTesting();
-  EXPECT_THAT(manager->InFlightAttemptCount(), 0u);
+  EXPECT_THAT(manager->TcpBasedAttemptCount(), 0u);
   EXPECT_THAT(manager->GetQuicTaskResultForTesting(),
               Optional(IsError(ERR_NAME_NOT_RESOLVED)));
 }
@@ -7141,7 +7141,7 @@
       pool()
           .GetOrCreateGroupForTesting(requester.GetStreamKey())
           .GetAttemptManagerForTesting();
-  EXPECT_THAT(manager->InFlightAttemptCount(), 0u);
+  EXPECT_THAT(manager->TcpBasedAttemptCount(), 0u);
   EXPECT_THAT(manager->GetQuicTaskResultForTesting(),
               Optional(IsError(ERR_SSL_CLIENT_AUTH_CERT_NEEDED)));
 }
@@ -7180,7 +7180,7 @@
       pool()
           .GetOrCreateGroupForTesting(requester.GetStreamKey())
           .GetAttemptManagerForTesting();
-  EXPECT_THAT(manager->InFlightAttemptCount(), 0u);
+  EXPECT_THAT(manager->TcpBasedAttemptCount(), 0u);
   EXPECT_THAT(manager->GetQuicTaskResultForTesting(),
               Optional(IsError(ERR_CERT_DATE_INVALID)));
 }
diff --git a/net/http/http_stream_pool_group.cc b/net/http/http_stream_pool_group.cc
index 8c9c698..0e19976 100644
--- a/net/http/http_stream_pool_group.cc
+++ b/net/http/http_stream_pool_group.cc
@@ -288,7 +288,7 @@
 }
 
 size_t HttpStreamPool::Group::ConnectingStreamSocketCount() const {
-  return attempt_manager_ ? attempt_manager_->InFlightAttemptCount() : 0;
+  return attempt_manager_ ? attempt_manager_->TcpBasedAttemptCount() : 0;
 }
 
 size_t HttpStreamPool::Group::ActiveStreamSocketCount() const {
@@ -325,7 +325,7 @@
   // jobs/preconnects?
   ++generation_;
   if (attempt_manager_) {
-    attempt_manager_->CancelInFlightAttempts(cancel_reason);
+    attempt_manager_->CancelTcpBasedAttempts(cancel_reason);
   }
   CleanupIdleStreamSockets(CleanupMode::kForce, net_log_close_reason_utf8);
 }
diff --git a/net/http/http_util.cc b/net/http/http_util.cc
index 0fecc9c..bc58372 100644
--- a/net/http/http_util.cc
+++ b/net/http/http_util.cc
@@ -938,21 +938,6 @@
   return false;
 }
 
-bool HttpUtil::HeadersIterator::AdvanceTo(const char* name) {
-  DCHECK(name != nullptr);
-  DCHECK_EQ(0, base::ToLowerASCII(name).compare(name))
-      << "the header name must be in all lower case";
-
-  while (GetNext()) {
-    if (base::EqualsCaseInsensitiveASCII(
-            base::MakeStringPiece(name_begin_, name_end_), name)) {
-      return true;
-    }
-  }
-
-  return false;
-}
-
 HttpUtil::ValuesIterator::ValuesIterator(std::string_view values,
                                          char delimiter,
                                          bool ignore_empty_values)
diff --git a/net/http/http_util.h b/net/http/http_util.h
index 02e7937..0039402 100644
--- a/net/http/http_util.h
+++ b/net/http/http_util.h
@@ -311,18 +311,6 @@
     // header name and values.
     bool GetNext();
 
-    // Iterates through the list of headers, starting with the current position
-    // and looks for the specified header.  Note that the name _must_ be
-    // lower cased.
-    // If the header was found, the return value will be true and the current
-    // position points to the header.  If the return value is false, the
-    // current position will be at the end of the headers.
-    bool AdvanceTo(const char* lowercase_name);
-
-    void Reset() {
-      lines_.Reset();
-    }
-
     std::string::const_iterator name_begin() const {
       return name_begin_;
     }
diff --git a/net/http/http_util_unittest.cc b/net/http/http_util_unittest.cc
index 81b3b17..9d8625e8 100644
--- a/net/http/http_util_unittest.cc
+++ b/net/http/http_util_unittest.cc
@@ -191,31 +191,6 @@
   EXPECT_FALSE(it.GetNext());
 }
 
-TEST(HttpUtilTest, HeadersIterator_AdvanceTo) {
-  std::string headers = "foo: 1\r\n: 2\r\n3\r\nbar: 4";
-
-  HttpUtil::HeadersIterator it(headers.begin(), headers.end(), "\r\n");
-  EXPECT_TRUE(it.AdvanceTo("foo"));
-  EXPECT_EQ("foo", it.name());
-  EXPECT_TRUE(it.AdvanceTo("bar"));
-  EXPECT_EQ("bar", it.name());
-  EXPECT_FALSE(it.AdvanceTo("blat"));
-  EXPECT_FALSE(it.GetNext());  // should be at end of headers
-}
-
-TEST(HttpUtilTest, HeadersIterator_Reset) {
-  std::string headers = "foo: 1\r\n: 2\r\n3\r\nbar: 4";
-  HttpUtil::HeadersIterator it(headers.begin(), headers.end(), "\r\n");
-  // Search past "foo".
-  EXPECT_TRUE(it.AdvanceTo("bar"));
-  // Now try advancing to "foo".  This time it should fail since the iterator
-  // position is past it.
-  EXPECT_FALSE(it.AdvanceTo("foo"));
-  it.Reset();
-  // Now that we reset the iterator position, we should find 'foo'
-  EXPECT_TRUE(it.AdvanceTo("foo"));
-}
-
 TEST(HttpUtilTest, ValuesIterator) {
   std::string values = " must-revalidate,   no-cache=\"foo, bar\"\t, private ";
 
diff --git a/net/http/http_vary_data.cc b/net/http/http_vary_data.cc
index 279752d..fc7d8589 100644
--- a/net/http/http_vary_data.cc
+++ b/net/http/http_vary_data.cc
@@ -11,6 +11,7 @@
 
 #include <stdlib.h>
 
+#include <array>
 #include <string_view>
 
 #include "base/pickle.h"
@@ -63,9 +64,10 @@
 
 bool HttpVaryData::InitFromPickle(base::PickleIterator* iter) {
   is_valid_ = false;
-  const char* data;
-  if (iter->ReadBytes(&data, sizeof(request_digest_))) {
-    memcpy(&request_digest_, data, sizeof(request_digest_));
+  std::optional<base::span<const uint8_t>> bytes =
+      iter->ReadBytes(sizeof(request_digest_));
+  if (bytes) {
+    base::span(request_digest_.a).copy_from(*bytes);
     return is_valid_ = true;
   }
   return false;
@@ -73,7 +75,7 @@
 
 void HttpVaryData::Persist(base::Pickle* pickle) const {
   DCHECK(is_valid());
-  pickle->WriteBytes(&request_digest_, sizeof(request_digest_));
+  pickle->WriteBytes(request_digest_.a);
 }
 
 bool HttpVaryData::MatchesRequest(
@@ -89,8 +91,7 @@
     // by a build before crbug.com/469675 was fixed.
     return false;
   }
-  return memcmp(&new_vary_data.request_digest_, &request_digest_,
-                sizeof(request_digest_)) == 0;
+  return new_vary_data.request_digest_.a == request_digest_.a;
 }
 
 // static
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins
index 24f1b52..5027356 100644
--- a/net/http/transport_security_state_static.pins
+++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@
 #   hash function for preloaded entries again (we have already done so once).
 #
 
-# Last updated: 2025-04-06 12:54 UTC
+# Last updated: 2025-04-07 12:58 UTC
 PinsListTimestamp
-1743944070
+1744030694
 
 TestSPKI
 sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json
index 609ae162..6fd8be71 100644
--- a/net/http/transport_security_state_static_pins.json
+++ b/net/http/transport_security_state_static_pins.json
@@ -31,7 +31,7 @@
 // the 'static_spki_hashes' and 'bad_static_spki_hashes' fields in 'pinsets'
 // refer to, and the timestamp at which the pins list was last updated.
 //
-// Last updated: 2025-04-06 12:54 UTC
+// Last updated: 2025-04-07 12:58 UTC
 //
 {
   "pinsets": [
diff --git a/net/log/net_log_event_type_list.h b/net/log/net_log_event_type_list.h
index e9216fea..f335c6e 100644
--- a/net/log/net_log_event_type_list.h
+++ b/net/log/net_log_event_type_list.h
@@ -1634,7 +1634,7 @@
 //   {
 //     "stream_attempt_delay": <The stream attempt delay in milliseconds>
 //   }
-EVENT_TYPE(HTTP_STREAM_POOL_ATTEMPT_MANAGER_STREAM_ATTEMPT_DELAY_PASSED)
+EVENT_TYPE(HTTP_STREAM_POOL_ATTEMPT_MANAGER_TCP_BASED_ATTEMPT_DELAY_PASSED)
 
 // Records on an HttpStreamPool::AttemptManager's NetLog to indicate that an
 // HttpStreamPool::QuicTask is bound to the AttemptManager.
diff --git a/pdf/pdfium/pdfium_on_demand_searchifier_unittest.cc b/pdf/pdfium/pdfium_on_demand_searchifier_unittest.cc
index 0bc5b81c..e62ba4a2 100644
--- a/pdf/pdfium/pdfium_on_demand_searchifier_unittest.cc
+++ b/pdf/pdfium/pdfium_on_demand_searchifier_unittest.cc
@@ -656,6 +656,41 @@
   EXPECT_EQ(page1.GetImageObjectIndices().size(), 1u);
 }
 
+TEST_P(PDFiumOnDemandSearchifierTest, Bug405433817) {
+  CreateEngine(FILE_PATH_LITERAL("bug_405433817.pdf"));
+
+  PDFiumPage& page = GetPDFiumPageForTest(*engine(), 0);
+
+  // Load the page to trigger searchify checking.
+  page.GetPage();
+  ASSERT_TRUE(engine()->PageNeedsSearchify(0));
+
+  PDFiumPrint print(engine());
+
+  static constexpr std::array<int, 1> kPageIndices = {0};
+  const blink::WebPrintParams print_params = GetDefaultPrintParams();
+  std::vector<uint8_t> pdf_data =
+      print.PrintPagesAsPdf(kPageIndices, print_params);
+  CheckFuzzyPdfRendering(pdf_data, 0, /*size_in_points=*/{200, 300},
+                         GetReferenceFilePathForPrint("bug_405433817.png"));
+
+  PDFiumOnDemandSearchifier* searchifier = engine()->GetSearchifierForTesting();
+  ASSERT_TRUE(searchifier);
+  ASSERT_TRUE(searchifier->IsPageScheduled(0));
+
+  StartSearchify(/*empty_results=*/true);
+  base::test::TestFuture<void> future;
+  WaitUntilIdle(searchifier, future.GetCallback());
+  ASSERT_TRUE(future.Wait());
+
+  ASSERT_EQ(performed_ocrs(), 1);
+  EXPECT_TRUE(page.IsPageSearchified());
+
+  pdf_data = print.PrintPagesAsPdf(kPageIndices, print_params);
+  CheckFuzzyPdfRendering(pdf_data, 0, /*size_in_points=*/{200, 300},
+                         GetReferenceFilePathForPrint("bug_405433817.png"));
+}
+
 TEST_P(PDFiumOnDemandSearchifierTest, Bug406530484) {
   CreateEngine(FILE_PATH_LITERAL("bug_406530484.pdf"));
 
diff --git a/pdf/pdfium/pdfium_test_base.cc b/pdf/pdfium/pdfium_test_base.cc
index 327c665..fdafd981 100644
--- a/pdf/pdfium/pdfium_test_base.cc
+++ b/pdf/pdfium/pdfium_test_base.cc
@@ -34,9 +34,9 @@
 base::FilePath GetTestFontsDir() {
   // base::TestSuite::Initialize() should have already set this.
   std::unique_ptr<base::Environment> env(base::Environment::Create());
-  std::string fontconfig_sysroot;
-  CHECK(env->GetVar("FONTCONFIG_SYSROOT", &fontconfig_sysroot));
-  return base::FilePath(fontconfig_sysroot).AppendASCII("test_fonts");
+  auto fontconfig_sysroot = env->GetVar("FONTCONFIG_SYSROOT");
+  CHECK(fontconfig_sysroot.has_value());
+  return base::FilePath(fontconfig_sysroot.value()).AppendASCII("test_fonts");
 }
 #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
 
diff --git a/pdf/test/data/bug_405433817.in b/pdf/test/data/bug_405433817.in
new file mode 100644
index 0000000..ddef9e9
--- /dev/null
+++ b/pdf/test/data/bug_405433817.in
@@ -0,0 +1,71 @@
+{{header}}
+{{object 1 0}} <<
+  /Type /Catalog
+  /Pages 2 0 R
+>>
+endobj
+{{object 2 0}} <<
+  /Type /Pages
+  /Count 1
+  /Kids [3 0 R]
+>>
+endobj
+{{object 3 0}} <<
+  /Type /Page
+  /Parent 2 0 R
+  /MediaBox [0 0 200 300]
+  /Resources <<
+    /XObject <<
+      /X1 6 0 R
+    >>
+  >>
+  /Contents [4 0 R 5 0 R]
+>>
+endobj
+{{object 4 0}} <<
+  {{streamlen}}
+>>
+stream
+q
+200 0 0 200 0 0 cm
+/X1 Do
+Q
+q
+1 0 0 rg
+0 0 m
+100 0 l
+0 100 l
+h
+100 100 m
+endstream
+endobj
+{{object 5 0}} <<
+  {{streamlen}}
+>>
+stream
+100 200 m
+200 100 l
+100 100 l
+h
+f
+Q
+endstream
+endobj
+{{object 6 0}} <<
+  /Type /XObject
+  /Subtype /Image
+  /Width 1
+  /Height 1
+  /BitsPerComponent 8
+  /ColorSpace /DeviceGray
+  /Filter /ASCIIHexDecode
+  {{streamlen}}
+>>
+stream
+CC
+endstream
+endobj
+{{xref}}
+{{trailer}}
+{{startxref}}
+%%EOF
diff --git a/pdf/test/data/bug_405433817.pdf b/pdf/test/data/bug_405433817.pdf
new file mode 100644
index 0000000..79aa921
--- /dev/null
+++ b/pdf/test/data/bug_405433817.pdf
@@ -0,0 +1,84 @@
+%PDF-1.7
+% ò¤ô
+1 0 obj <<
+  /Type /Catalog
+  /Pages 2 0 R
+>>
+endobj
+2 0 obj <<
+  /Type /Pages
+  /Count 1
+  /Kids [3 0 R]
+>>
+endobj
+3 0 obj <<
+  /Type /Page
+  /Parent 2 0 R
+  /MediaBox [0 0 200 300]
+  /Resources <<
+    /XObject <<
+      /X1 6 0 R
+    >>
+  >>
+  /Contents [4 0 R 5 0 R]
+>>
+endobj
+4 0 obj <<
+  /Length 74
+>>
+stream
+q
+200 0 0 200 0 0 cm
+/X1 Do
+Q
+q
+1 0 0 rg
+0 0 m
+100 0 l
+0 100 l
+h
+100 100 m
+endstream
+endobj
+5 0 obj <<
+  /Length 35
+>>
+stream
+100 200 m
+200 100 l
+100 100 l
+h
+f
+Q
+endstream
+endobj
+6 0 obj <<
+  /Type /XObject
+  /Subtype /Image
+  /Width 1
+  /Height 1
+  /BitsPerComponent 8
+  /ColorSpace /DeviceGray
+  /Filter /ASCIIHexDecode
+  /Length 2
+>>
+stream
+CC
+endstream
+endobj
+xref
+0 7
+0000000000 65535 f 
+0000000015 00000 n 
+0000000068 00000 n 
+0000000131 00000 n 
+0000000294 00000 n 
+0000000420 00000 n 
+0000000507 00000 n 
+trailer <<
+  /Root 1 0 R
+  /Size 7
+>>
+startxref
+692
+%%EOF
diff --git a/pdf/test/data/pdfium_print/bug_405433817.png b/pdf/test/data/pdfium_print/bug_405433817.png
new file mode 100644
index 0000000..51927ccc
--- /dev/null
+++ b/pdf/test/data/pdfium_print/bug_405433817.png
Binary files differ
diff --git a/pdf/test/test_helpers.cc b/pdf/test/test_helpers.cc
index ee77d8a..eeef36b 100644
--- a/pdf/test/test_helpers.cc
+++ b/pdf/test/test_helpers.cc
@@ -51,6 +51,31 @@
   return testing::AssertionSuccess();
 }
 
+SkBitmap RenderPdfToSkBitmap(base::span<const uint8_t> pdf_data,
+                             int page_index,
+                             const gfx::Size& size_in_points) {
+  const gfx::Rect page_rect(size_in_points);
+  SkBitmap page_bitmap;
+  page_bitmap.allocPixels(
+      SkImageInfo::Make(gfx::SizeToSkISize(page_rect.size()),
+                        kBGRA_8888_SkColorType, kPremul_SkAlphaType));
+
+  PDFiumEngineExports::RenderingSettings settings(
+      gfx::Size(printing::kPointsPerInch, printing::kPointsPerInch), page_rect,
+      /*fit_to_bounds=*/false,
+      /*stretch_to_bounds=*/false,
+      /*keep_aspect_ratio=*/true,
+      /*center_in_bounds=*/false,
+      /*autorotate=*/false, /*use_color=*/true, /*render_for_printing=*/false);
+
+  PDFiumEngineExports exports;
+  if (!exports.RenderPDFPageToBitmap(pdf_data, page_index, settings,
+                                     page_bitmap.getPixels())) {
+    ADD_FAILURE();
+  }
+  return page_bitmap;
+}
+
 }  // namespace
 
 base::FilePath GetTestDataFilePath(const base::FilePath& path) {
@@ -98,27 +123,21 @@
                        int page_index,
                        const gfx::Size& size_in_points,
                        const base::FilePath& expected_png_file) {
-  const gfx::Rect page_rect(size_in_points);
-  SkBitmap page_bitmap;
-  page_bitmap.allocPixels(
-      SkImageInfo::Make(gfx::SizeToSkISize(page_rect.size()),
-                        kBGRA_8888_SkColorType, kPremul_SkAlphaType));
-
-  PDFiumEngineExports::RenderingSettings settings(
-      gfx::Size(printing::kPointsPerInch, printing::kPointsPerInch), page_rect,
-      /*fit_to_bounds=*/false,
-      /*stretch_to_bounds=*/false,
-      /*keep_aspect_ratio=*/true,
-      /*center_in_bounds=*/false,
-      /*autorotate=*/false, /*use_color=*/true, /*render_for_printing=*/false);
-
-  PDFiumEngineExports exports;
-  ASSERT_TRUE(exports.RenderPDFPageToBitmap(pdf_data, page_index, settings,
-                                            page_bitmap.getPixels()));
-
+  SkBitmap page_bitmap =
+      RenderPdfToSkBitmap(pdf_data, page_index, size_in_points);
   EXPECT_TRUE(MatchesPngFile(page_bitmap.asImage().get(), expected_png_file));
 }
 
+void CheckFuzzyPdfRendering(base::span<const uint8_t> pdf_data,
+                            int page_index,
+                            const gfx::Size& size_in_points,
+                            const base::FilePath& expected_png_file) {
+  SkBitmap page_bitmap =
+      RenderPdfToSkBitmap(pdf_data, page_index, size_in_points);
+  EXPECT_TRUE(
+      FuzzyMatchesPngFile(page_bitmap.asImage().get(), expected_png_file));
+}
+
 sk_sp<SkSurface> CreateSkiaSurfaceForTesting(const gfx::Size& size,
                                              SkColor color) {
   auto surface = SkSurfaces::Raster(
diff --git a/pdf/test/test_helpers.h b/pdf/test/test_helpers.h
index acd83be0..be92a48 100644
--- a/pdf/test/test_helpers.h
+++ b/pdf/test/test_helpers.h
@@ -54,12 +54,18 @@
 
 // Takes `pdf_data` and loads it using PDFium. Then renders the page at
 // `page_index` to a bitmap of `size_in_points` and checks if it matches
-// `expected_png_file`.
+// `expected_png_file` exactly.
 void CheckPdfRendering(base::span<const uint8_t> pdf_data,
                        int page_index,
                        const gfx::Size& size_in_points,
                        const base::FilePath& expected_png_file);
 
+// Same as CheckPdfRendering(), but with a fuzzy pixel comparator.
+void CheckFuzzyPdfRendering(base::span<const uint8_t> pdf_data,
+                            int page_index,
+                            const gfx::Size& size_in_points,
+                            const base::FilePath& expected_png_file);
+
 // Creates a Skia surface with dimensions `size` and filled with `color`.
 sk_sp<SkSurface> CreateSkiaSurfaceForTesting(const gfx::Size& size,
                                              SkColor color);
diff --git a/remoting/host/linux/input_injector_x11.h b/remoting/host/linux/input_injector_x11.h
index e0ee901..f01bf50 100644
--- a/remoting/host/linux/input_injector_x11.h
+++ b/remoting/host/linux/input_injector_x11.h
@@ -8,6 +8,7 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include <array>
 #include <memory>
 #include <optional>
 #include <set>
@@ -131,7 +132,7 @@
     // Left, Right, Middle, VScroll Up/Down, HScroll Left/Right, back, forward.
     static const int kNumPointerButtons = 9;
 
-    int pointer_button_map_[kNumPointerButtons];
+    std::array<int, kNumPointerButtons> pointer_button_map_;
 #if BUILDFLAG(IS_CHROMEOS)
     PointTransformer point_transformer_;
 #endif
diff --git a/remoting/host/linux/x_server_clipboard.cc b/remoting/host/linux/x_server_clipboard.cc
index fa63b00..5766565 100644
--- a/remoting/host/linux/x_server_clipboard.cc
+++ b/remoting/host/linux/x_server_clipboard.cc
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <array>
+
 #ifdef UNSAFE_BUFFERS_BUILD
 // TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
 #pragma allow_unsafe_buffers
@@ -51,18 +53,22 @@
 
   // TODO(lambroslambrou): Use ui::X11AtomCache for this, either by adding a
   // dependency on ui/ or by moving X11AtomCache to base/.
-  static const char* const kAtomNames[] = {"CLIPBOARD",        "INCR",
-                                           "SELECTION_STRING", "TARGETS",
-                                           "TIMESTAMP",        "UTF8_STRING"};
+  static const auto kAtomNames = std::to_array<const char*>({
+      "CLIPBOARD",
+      "INCR",
+      "SELECTION_STRING",
+      "TARGETS",
+      "TIMESTAMP",
+      "UTF8_STRING",
+  });
   static const int kNumAtomNames = std::size(kAtomNames);
 
-  x11::Future<x11::InternAtomReply> futures[kNumAtomNames];
+  std::array<x11::Future<x11::InternAtomReply>, kNumAtomNames> futures;
   for (size_t i = 0; i < kNumAtomNames; i++) {
     futures[i] = connection_->InternAtom({false, kAtomNames[i]});
   }
   connection_->Flush();
-  x11::Atom atoms[kNumAtomNames];
-  memset(atoms, 0, sizeof(atoms));
+  std::array<x11::Atom, kNumAtomNames> atoms = {};
   for (size_t i = 0; i < kNumAtomNames; i++) {
     if (auto reply = futures[i].Sync()) {
       atoms[i] = reply->atom;
diff --git a/remoting/host/pairing_registry_delegate_win.cc b/remoting/host/pairing_registry_delegate_win.cc
index 722619e..f160864c 100644
--- a/remoting/host/pairing_registry_delegate_win.cc
+++ b/remoting/host/pairing_registry_delegate_win.cc
@@ -10,7 +10,7 @@
 #include <string>
 #include <utility>
 
-#include "base/json/json_string_value_serializer.h"
+#include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
 #include "base/logging.h"
 #include "base/strings/utf_string_conversions.h"
@@ -56,14 +56,11 @@
 
   // Parse the value.
   std::string value_json_utf8 = base::WideToUTF8(value_json);
-  JSONStringValueDeserializer deserializer(value_json_utf8);
-  int error_code;
-  std::string error_message;
-  std::unique_ptr<base::Value> value =
-      deserializer.Deserialize(&error_code, &error_message);
-  if (!value) {
-    LOG(ERROR) << "Failed to parse '" << value_name << "': " << error_message
-               << " (" << error_code << ").";
+  base::JSONReader::Result value =
+      base::JSONReader::ReadAndReturnValueWithError(value_json_utf8);
+  if (!value.has_value()) {
+    LOG(ERROR) << "Failed to parse '" << value_name
+               << "': " << value.error().ToString();
     return std::nullopt;
   }
 
diff --git a/remoting/host/remote_open_url/remote_open_url_client_delegate_linux.cc b/remoting/host/remote_open_url/remote_open_url_client_delegate_linux.cc
index f58dfc2..bf54153 100644
--- a/remoting/host/remote_open_url/remote_open_url_client_delegate_linux.cc
+++ b/remoting/host/remote_open_url/remote_open_url_client_delegate_linux.cc
@@ -114,8 +114,8 @@
 
 void RemoteOpenUrlClientDelegateLinux::OpenUrlOnFallbackBrowser(
     const GURL& url) {
-  std::string current_desktop;
-  environment_->GetVar(kXdgCurrentDesktopEnvVar, &current_desktop);
+  std::string current_desktop =
+      environment_->GetVar(kXdgCurrentDesktopEnvVar).value_or(std::string());
 
   const char* host_setting_key = kLinuxPreviousDefaultWebBrowserGeneric;
   if (base::Contains(current_desktop, "Cinnamon")) {
diff --git a/remoting/host/webauthn/remote_webauthn_caller_security_utils.cc b/remoting/host/webauthn/remote_webauthn_caller_security_utils.cc
index bc818c3..f009ac5 100644
--- a/remoting/host/webauthn/remote_webauthn_caller_security_utils.cc
+++ b/remoting/host/webauthn/remote_webauthn_caller_security_utils.cc
@@ -4,6 +4,7 @@
 
 #include "remoting/host/webauthn/remote_webauthn_caller_security_utils.h"
 
+#include <optional>
 #include <string_view>
 
 #include "base/environment.h"
@@ -108,9 +109,9 @@
 
   // COMSPEC is generally "C:\WINDOWS\system32\cmd.exe". Note that the casing
   // does not match the actual file path's casing.
-  std::string comspec_utf8;
-  if (environment->GetVar("COMSPEC", &comspec_utf8)) {
-    base::FilePath::StringType comspec = base::UTF8ToWide(comspec_utf8);
+  std::optional<std::string> comspec_utf8 = environment->GetVar("COMSPEC");
+  if (comspec_utf8.has_value()) {
+    base::FilePath::StringType comspec = base::UTF8ToWide(comspec_utf8.value());
     if (base::FilePath::CompareEqualIgnoreCase(parent_image_path.value(),
                                                comspec)) {
       // Skip to the grandparent.
@@ -129,11 +130,13 @@
 
   // Check if the caller's image path is allowlisted.
   for (std::string_view apps_dir_env_var : kAppsDirectoryEnvVars) {
-    std::string apps_dir_path_utf8;
-    if (!environment->GetVar(apps_dir_env_var, &apps_dir_path_utf8)) {
+    std::optional<std::string> apps_dir_path_utf8 =
+        environment->GetVar(apps_dir_env_var);
+    if (!apps_dir_path_utf8.has_value()) {
       continue;
     }
-    auto apps_dir_path = base::FilePath::FromUTF8Unsafe(apps_dir_path_utf8);
+    auto apps_dir_path =
+        base::FilePath::FromUTF8Unsafe(apps_dir_path_utf8.value());
     if (!apps_dir_path.IsParent(parent_image_path)) {
       continue;
     }
diff --git a/remoting/host/webauthn/remote_webauthn_extension_notifier.cc b/remoting/host/webauthn/remote_webauthn_extension_notifier.cc
index 2ab962ad..9b99dc2 100644
--- a/remoting/host/webauthn/remote_webauthn_extension_notifier.cc
+++ b/remoting/host/webauthn/remote_webauthn_extension_notifier.cc
@@ -9,6 +9,7 @@
 
 #include "remoting/host/webauthn/remote_webauthn_extension_notifier.h"
 
+#include <optional>
 #include <vector>
 
 #include "base/base_paths.h"
@@ -86,10 +87,11 @@
   // See: chrome/common/chrome_paths_linux.cc
   auto env = base::Environment::Create();
   base::FilePath base_path;
-  std::string chrome_config_home_str;
-  if (env->GetVar("CHROME_CONFIG_HOME", &chrome_config_home_str) &&
-      base::IsStringUTF8(chrome_config_home_str)) {
-    base_path = base::FilePath::FromUTF8Unsafe(chrome_config_home_str);
+  std::optional<std::string> chrome_config_home_str =
+      env->GetVar("CHROME_CONFIG_HOME");
+  if (chrome_config_home_str.has_value() &&
+      base::IsStringUTF8(chrome_config_home_str.value())) {
+    base_path = base::FilePath::FromUTF8Unsafe(chrome_config_home_str.value());
   } else {
     base_path = base::nix::GetXDGDirectory(
         env.get(), base::nix::kXdgConfigHomeEnvVar, base::nix::kDotConfigDir);
diff --git a/services/tracing/perfetto/privacy_filtered_fields-inl.h b/services/tracing/perfetto/privacy_filtered_fields-inl.h
index 313e1b0..dbe7d576 100644
--- a/services/tracing/perfetto/privacy_filtered_fields-inl.h
+++ b/services/tracing/perfetto/privacy_filtered_fields-inl.h
@@ -463,7 +463,7 @@
                                                 nullptr};
 
 // Proto Message: EventForwarder
-constexpr int kEventForwarderIndices[] = {1, 2, 5, 6, 7, -1};
+constexpr int kEventForwarderIndices[] = {1, 2, 5, 6, 7, 8, 9, -1};
 constexpr MessageInfo kEventForwarder = {kEventForwarderIndices, nullptr};
 
 // Proto Message: TouchDispositionGestureFilter
diff --git a/skia/public/mojom/BUILD.gn b/skia/public/mojom/BUILD.gn
index 11bf3a0c..1e9a411 100644
--- a/skia/public/mojom/BUILD.gn
+++ b/skia/public/mojom/BUILD.gn
@@ -38,6 +38,7 @@
     "skcolor4f.mojom",
     "skcolorspace.mojom",
     "skcolorspace_primaries.mojom",
+    "skpath.mojom",
     "surface_origin.mojom",
     "tile_mode.mojom",
   ]
@@ -153,6 +154,16 @@
     {
       types = [
         {
+          mojom = "skia.mojom.SkPath"
+          cpp = "::SkPath"
+        },
+      ]
+      traits_headers = [ "skpath_mojom_traits.h" ]
+      traits_public_deps = [ "//skia" ]
+    },
+    {
+      types = [
+        {
           mojom = "skia.mojom.AlphaType"
           cpp = "::SkAlphaType"
         },
diff --git a/skia/public/mojom/skpath.mojom b/skia/public/mojom/skpath.mojom
new file mode 100644
index 0000000..d47e817
--- /dev/null
+++ b/skia/public/mojom/skpath.mojom
@@ -0,0 +1,13 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file contains structures used to represent an SkPath in Mojo.
+module skia.mojom;
+
+// Represents a serialized version of SkPath
+// It uses SkPath's internal serialization format and passes the resulting
+// buffer to mojo.
+struct SkPath {
+  array<uint8> data;
+};
diff --git a/skia/public/mojom/skpath_mojom_traits.h b/skia/public/mojom/skpath_mojom_traits.h
new file mode 100644
index 0000000..d1c87c8
--- /dev/null
+++ b/skia/public/mojom/skpath_mojom_traits.h
@@ -0,0 +1,33 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SKIA_PUBLIC_MOJOM_SKPATH_MOJOM_TRAITS_H_
+#define SKIA_PUBLIC_MOJOM_SKPATH_MOJOM_TRAITS_H_
+
+#include <vector>
+
+#include "mojo/public/cpp/bindings/struct_traits.h"
+#include "skia/public/mojom/skpath.mojom-shared.h"
+#include "third_party/skia/include/core/SkPath.h"
+
+namespace mojo {
+
+template <>
+struct StructTraits<skia::mojom::SkPathDataView, ::SkPath> {
+  static std::vector<uint8_t> data(const SkPath& path) {
+    std::vector<uint8_t> buffer(path.writeToMemory(nullptr));
+    CHECK_EQ(path.writeToMemory(buffer.data()), buffer.size());
+    return buffer;
+  }
+
+  static bool Read(skia::mojom::SkPathDataView data, ::SkPath* path) {
+    std::vector<uint8_t> buffer;
+    return data.ReadData(&buffer) &&
+           path->readFromMemory(buffer.data(), buffer.size());
+  }
+};
+
+}  // namespace mojo
+
+#endif  // SKIA_PUBLIC_MOJOM_SKPATH_MOJOM_TRAITS_H_
diff --git a/skia/public/mojom/test/mojom_traits_unittest.cc b/skia/public/mojom/test/mojom_traits_unittest.cc
index 6b9b4bc..80df2417 100644
--- a/skia/public/mojom/test/mojom_traits_unittest.cc
+++ b/skia/public/mojom/test/mojom_traits_unittest.cc
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "include/core/SkPathBuilder.h"
+#include "include/core/SkRRect.h"
 #ifdef UNSAFE_BUFFERS_BUILD
 // TODO(crbug.com/390223051): Remove C-library calls to fix the errors.
 #pragma allow_unsafe_libc_calls
@@ -19,12 +21,15 @@
 #include "skia/public/mojom/skcolorspace_mojom_traits.h"
 #include "skia/public/mojom/skcolorspace_primaries.mojom.h"
 #include "skia/public/mojom/skcolorspace_primaries_mojom_traits.h"
+#include "skia/public/mojom/skpath.mojom.h"
+#include "skia/public/mojom/skpath_mojom_traits.h"
 #include "skia/public/mojom/tile_mode.mojom.h"
 #include "skia/public/mojom/tile_mode_mojom_traits.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/skia/include/core/SkColorFilter.h"
 #include "third_party/skia/include/core/SkColorSpace.h"
 #include "third_party/skia/include/core/SkImageInfo.h"
+#include "third_party/skia/include/core/SkPath.h"
 #include "third_party/skia/include/core/SkString.h"
 #include "third_party/skia/include/core/SkTileMode.h"
 #include "third_party/skia/modules/skcms/skcms.h"
@@ -98,6 +103,14 @@
   return mojom_info;
 }
 
+void TestSkPathSerialization(const SkPath& input) {
+  SkPath output;
+  ASSERT_TRUE(
+      mojo::test::SerializeAndDeserialize<skia::mojom::SkPath>(input, output));
+
+  EXPECT_EQ(input, output);
+}
+
 TEST(StructTraitsTest, ImageInfo) {
   SkImageInfo input = SkImageInfo::Make(
       34, 56, SkColorType::kGray_8_SkColorType,
@@ -212,6 +225,18 @@
   EXPECT_EQ(input, output);
 }
 
+TEST(StructTraitsTest, SkPath) {
+  TestSkPathSerialization(SkPath::Rect(SkRect::MakeWH(100, 200)));
+  TestSkPathSerialization(SkPath::Circle(100, 0, 30));
+  TestSkPathSerialization(
+      SkPath::Polygon({{0, 10}, {10, 0}, {10, 10}}, /*isClosed=*/true));
+  TestSkPathSerialization(SkPathBuilder()
+                              .addRRect(SkRRect::MakeRectXY(
+                                  SkRect::MakeLTRB(10, 10, 30, 50), 2.5, 3))
+                              .cubicTo({0, 10}, {30, 50}, {-5, .8})
+                              .detach());
+}
+
 TEST(StructTraitsTest, Bitmap) {
   SkBitmap input;
   input.allocPixels(SkImageInfo::MakeN32Premul(
diff --git a/storage/browser/blob/blob_url_registry.cc b/storage/browser/blob/blob_url_registry.cc
index 4e71f11..5aef3989 100644
--- a/storage/browser/blob/blob_url_registry.cc
+++ b/storage/browser/blob/blob_url_registry.cc
@@ -58,13 +58,14 @@
     const url::Origin& renderer_origin,
     int render_process_host_id,
     mojo::PendingReceiver<blink::mojom::BlobURLStore> receiver,
+    base::RepeatingCallback<bool()> storage_access_check_callback,
     bool partitioning_disabled_by_policy,
     BlobURLValidityCheckBehavior validity_check_behavior) {
   worker_receivers_.Add(
       std::make_unique<storage::BlobURLStoreImpl>(
           storage_key, renderer_origin, render_process_host_id, AsWeakPtr(),
           validity_check_behavior, base::DoNothing(),
-          base::BindRepeating([]() -> bool { return false; }),
+          std::move(storage_access_check_callback),
           partitioning_disabled_by_policy),
       std::move(receiver));
 }
diff --git a/storage/browser/blob/blob_url_registry.h b/storage/browser/blob/blob_url_registry.h
index 75def4b..5dc2bf5 100644
--- a/storage/browser/blob/blob_url_registry.h
+++ b/storage/browser/blob/blob_url_registry.h
@@ -69,13 +69,16 @@
 
   // Binds receivers corresponding to connections from renderer worker
   // contexts and stores them in `worker_receivers_`.
-  void AddReceiver(const blink::StorageKey& storage_key,
-                   const url::Origin& renderer_origin,
-                   int render_process_host_id,
-                   mojo::PendingReceiver<blink::mojom::BlobURLStore> receiver,
-                   bool partitioning_disabled_by_policy = false,
-                   BlobURLValidityCheckBehavior validity_check_behavior =
-                       BlobURLValidityCheckBehavior::DEFAULT);
+  void AddReceiver(
+      const blink::StorageKey& storage_key,
+      const url::Origin& renderer_origin,
+      int render_process_host_id,
+      mojo::PendingReceiver<blink::mojom::BlobURLStore> receiver,
+      base::RepeatingCallback<bool()> storage_access_check_callback =
+          base::BindRepeating([]() -> bool { return false; }),
+      bool partitioning_disabled_by_policy = false,
+      BlobURLValidityCheckBehavior validity_check_behavior =
+          BlobURLValidityCheckBehavior::DEFAULT);
 
   // Returns the receivers corresponding to renderer frame contexts for use in
   // tests.
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index eb0acae..fb692da 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -3257,6 +3257,29 @@
             ]
         }
     ],
+    "BeaconLeakageLogging": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled_v1",
+                    "params": {
+                        "category_param_name": "category",
+                        "category_prefix": "acrcp_v1_"
+                    },
+                    "enable_features": [
+                        "BeaconLeakageLogging"
+                    ]
+                }
+            ]
+        }
+    ],
     "BiometricAuthPwdFillAndroid": [
         {
             "platforms": [
@@ -18141,6 +18164,30 @@
             ]
         }
     ],
+    "PreloadInlineDeferredImages": [
+        {
+            "platforms": [
+                "android",
+                "android_webview",
+                "chromeos",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled_Preload_20250402",
+                    "enable_features": [
+                        "DocumentPolicyExpectNoLinkedResources",
+                        "PreloadLinkRelDataUrls"
+                    ],
+                    "disable_features": [
+                        "BypassCSPForPreloads"
+                    ]
+                }
+            ]
+        }
+    ],
     "PreloadTopChromeWebUI": [
         {
             "platforms": [
@@ -23513,38 +23560,6 @@
             ]
         }
     ],
-    "StaleSessionCookieCleanup": [
-        {
-            "platforms": [
-                "android",
-                "chromeos",
-                "ios",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "DeleteStaleSessionCookiesOnStartup"
-                    ]
-                },
-                {
-                    "name": "Auto_Dogfood",
-                    "enable_features": [
-                        "DeleteStaleSessionCookiesOnStartup"
-                    ]
-                },
-                {
-                    "name": "Opt_In_Dogfood",
-                    "enable_features": [
-                        "DeleteStaleSessionCookiesOnStartup"
-                    ]
-                }
-            ]
-        }
-    ],
     "StandardizedBrowserZoom": [
         {
             "platforms": [
@@ -24863,21 +24878,6 @@
             ]
         }
     ],
-    "UseBuiltInMetalShaderCache": [
-        {
-            "platforms": [
-                "mac"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "UseBuiltInMetalShaderCache"
-                    ]
-                }
-            ]
-        }
-    ],
     "UseClientGmbInterface": [
         {
             "platforms": [
@@ -26726,6 +26726,23 @@
             ]
         }
     ],
+    "WebViewPaymentRequest": [
+        {
+            "platforms": [
+                "android_webview"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "AndroidPaymentIntentsOmitDeprecatedParameters",
+                        "UpdatePaymentDetailsIntentFilterInPaymentApp",
+                        "WebPayments"
+                    ]
+                }
+            ]
+        }
+    ],
     "WebViewPrefetchNativeLibrary": [
         {
             "platforms": [
diff --git a/third_party/android_deps/autorolled/BUILD.gn b/third_party/android_deps/autorolled/BUILD.gn
index 4fb5dc6..1e796682 100644
--- a/third_party/android_deps/autorolled/BUILD.gn
+++ b/third_party/android_deps/autorolled/BUILD.gn
@@ -39,7 +39,7 @@
   # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
   java_prebuilt("com_google_guava_guava_java") {
     jar_path =
-        "autorolled/cipd/libs/com_google_guava_guava/guava-33.3.1-android.jar"
+        "autorolled/cipd/libs/com_google_guava_guava/guava-33.3.1-jre.jar"
     output_name = "com_google_guava_guava"
     enable_bytecode_checks = false
     deps = [
diff --git a/third_party/android_deps/autorolled/VERSION.txt b/third_party/android_deps/autorolled/VERSION.txt
index 633195f7..51edec27 100644
--- a/third_party/android_deps/autorolled/VERSION.txt
+++ b/third_party/android_deps/autorolled/VERSION.txt
@@ -1 +1 @@
-8c12b38d429d858
\ No newline at end of file
+8c12b38d429d858.d7beea80eefd7f3
\ No newline at end of file
diff --git a/third_party/android_deps/autorolled/build.gradle b/third_party/android_deps/autorolled/build.gradle
index e8683e4b..ed96b33 100644
--- a/third_party/android_deps/autorolled/build.gradle
+++ b/third_party/android_deps/autorolled/build.gradle
@@ -381,6 +381,52 @@
     mavenCentral()
 }
 
+// See https://github.com/google/guava/releases/tag/v33.3.1
+dependencies.constraints {
+    compile("com.google.guava:guava:33.3.1-android") {
+        attributes {
+            attribute(
+                    TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE,
+                    objects.named(TargetJvmEnvironment, TargetJvmEnvironment.ANDROID))
+        }
+    }
+    compileLatest("com.google.guava:guava:33.3.1-android") {
+        attributes {
+            attribute(
+                    TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE,
+                    objects.named(TargetJvmEnvironment, TargetJvmEnvironment.ANDROID))
+        }
+    }
+    buildCompile("com.google.guava:guava:33.3.1-jre") {
+        attributes {
+            attribute(
+                    TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE,
+                    objects.named(TargetJvmEnvironment, TargetJvmEnvironment.STANDARD_JVM))
+        }
+    }
+    buildCompileLatest("com.google.guava:guava:33.3.1-jre") {
+        attributes {
+            attribute(
+                    TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE,
+                    objects.named(TargetJvmEnvironment, TargetJvmEnvironment.STANDARD_JVM))
+        }
+    }
+    testCompile("com.google.guava:guava:33.3.1-jre") {
+        attributes {
+            attribute(
+                    TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE,
+                    objects.named(TargetJvmEnvironment, TargetJvmEnvironment.STANDARD_JVM))
+        }
+    }
+    testCompileLatest("com.google.guava:guava:33.3.1-jre") {
+        attributes {
+            attribute(
+                    TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE,
+                    objects.named(TargetJvmEnvironment, TargetJvmEnvironment.STANDARD_JVM))
+        }
+    }
+}
+
 dependencies {
     // Use testCompile to have is_robolectric = true set on targets.
     testCompileLatest "org.robolectric:robolectric:+"
diff --git a/third_party/android_deps/autorolled/fetch_all_autorolled.py b/third_party/android_deps/autorolled/fetch_all_autorolled.py
index ada483a72..b683f87 100755
--- a/third_party/android_deps/autorolled/fetch_all_autorolled.py
+++ b/third_party/android_deps/autorolled/fetch_all_autorolled.py
@@ -73,7 +73,7 @@
                              extra_args=extra_args,
                              verbose_count=args.verbose_count)
 
-    version_map_str, version_hash = fetch_util.generate_version_map_str(
+    version_map_str, bom_hash = fetch_util.generate_version_map_str(
         _CIPD_PATH / _BOM_NAME, with_hash=True)
 
     # Regenerate the build.gradle file filling in the the version map so that
@@ -82,21 +82,27 @@
                              _CIPD_PATH / 'build.gradle',
                              version_overrides=version_map_str)
 
-    version_txt_path = os.path.join(_CIPD_PATH, 'VERSION.txt')
-    with open(version_txt_path, 'w') as f:
-        f.write(version_hash)
-
-    to_commit_zip_path = _CIPD_PATH / 'to_commit.zip'
-    files_in_tree = [
+    generated_files = [
         'BUILD.gn',
-        'VERSION.txt',
         'bill_of_materials.json',
         'additional_readme_paths.json',
         'build.gradle',
     ]
+    # TODO(mheikal): probably need to hash all text files, including licenses
+    # and readmes.
+    content_hash = fetch_util.hash_files(
+        [_CIPD_PATH / filename for filename in generated_files])
+
+    version_string = f'{bom_hash}.{content_hash}'
+    version_txt_path = os.path.join(_CIPD_PATH, 'VERSION.txt')
+    with open(version_txt_path, 'w') as f:
+        f.write(version_string)
+    generated_files.append('VERSION.txt')
+
+    to_commit_zip_path = _CIPD_PATH / 'to_commit.zip'
     file_map = {
         f: f'third_party/android_deps/autorolled/{f}'
-        for f in files_in_tree
+        for f in generated_files
     }
     fetch_util.create_to_commit_zip(output_path=to_commit_zip_path,
                                     package_root=_CIPD_PATH,
@@ -112,7 +118,7 @@
 
     fetch_util.write_cipd_yaml(package_root=_CIPD_PATH,
                                package_name=_CIPD_PACKAGE,
-                               version=version_hash,
+                               version=version_string,
                                output_path=_CIPD_PATH / 'cipd.yaml')
 
 
diff --git a/third_party/androidx/build.gradle b/third_party/androidx/build.gradle
index 2ccb1a7..30be3d01 100644
--- a/third_party/androidx/build.gradle
+++ b/third_party/androidx/build.gradle
@@ -296,7 +296,7 @@
     google()
     maven {
         // This URL is generated by the fetch_all_androidx.py script.
-        url 'https://androidx.dev/snapshots/builds/13319923/artifacts/repository'
+        url 'https://androidx.dev/snapshots/builds/13321477/artifacts/repository'
     }
     mavenCentral()
 }
diff --git a/third_party/angle b/third_party/angle
index 0feb9ed..1b92a97 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit 0feb9ed695d949e65f6fda21d6bd02e6654b4615
+Subproject commit 1b92a973484c95f26bba5e2e4e2511ed03ab6c66
diff --git a/third_party/blink/common/permissions/permission_utils.cc b/third_party/blink/common/permissions/permission_utils.cc
index 16ac4fcc..8abbc34 100644
--- a/third_party/blink/common/permissions/permission_utils.cc
+++ b/third_party/blink/common/permissions/permission_utils.cc
@@ -204,7 +204,7 @@
   return *kAllPermissionTypes;
 }
 
-std::optional<PermissionType> PermissionDescriptorToPermissionType(
+std::optional<PermissionType> MaybePermissionDescriptorToPermissionType(
     const PermissionDescriptorPtr& descriptor) {
   return PermissionDescriptorInfoToPermissionType(
       descriptor->name,
@@ -220,6 +220,27 @@
           descriptor->extension->get_fullscreen()->allow_without_user_gesture);
 }
 
+PermissionType PermissionDescriptorToPermissionType(
+    const PermissionDescriptorPtr& descriptor) {
+  auto permission_type_optional =
+      MaybePermissionDescriptorToPermissionType(descriptor);
+  CHECK(permission_type_optional.has_value());
+  return permission_type_optional.value();
+}
+
+std::vector<PermissionType> PermissionDescriptorToPermissionTypes(
+    const std::vector<PermissionDescriptorPtr>& descriptors) {
+  std::vector<PermissionType> permission_types;
+  permission_types.reserve(descriptors.size());
+
+  for (const auto& descriptor : descriptors) {
+    permission_types.emplace_back(
+        PermissionDescriptorToPermissionType(descriptor));
+  }
+
+  return permission_types;
+}
+
 std::optional<PermissionType> PermissionDescriptorInfoToPermissionType(
     mojom::PermissionName name,
     bool midi_sysex,
diff --git a/third_party/blink/public/common/permissions/permission_utils.h b/third_party/blink/public/common/permissions/permission_utils.h
index 947bd81..5c82a64 100644
--- a/third_party/blink/public/common/permissions/permission_utils.h
+++ b/third_party/blink/public/common/permissions/permission_utils.h
@@ -82,11 +82,24 @@
 // Get a list of all permission types.
 BLINK_COMMON_EXPORT const std::vector<PermissionType>& GetAllPermissionTypes();
 
-// Given |descriptor|, set |permission_type| to a corresponding PermissionType.
+// Given `PermissionDescriptorPtr`, return the corresponding `PermissionType` if
+// it exists.
 BLINK_COMMON_EXPORT std::optional<PermissionType>
-PermissionDescriptorToPermissionType(
+MaybePermissionDescriptorToPermissionType(
     const mojom::PermissionDescriptorPtr& descriptor);
 
+// Given `PermissionDescriptorPtr`, either return the corresponding
+// `PermissionType` or trigger a CHECK() failure.
+BLINK_COMMON_EXPORT PermissionType PermissionDescriptorToPermissionType(
+    const mojom::PermissionDescriptorPtr& descriptor);
+
+// Given a vector of `PermissionDescriptorPtr`s, return a vector of the
+// corresponding `PermissionType`s. Triggers a CHECK() failure if any
+// `PermissionDescriptorPtr` can't be mapped.
+BLINK_COMMON_EXPORT std::vector<PermissionType>
+PermissionDescriptorToPermissionTypes(
+    const std::vector<mojom::PermissionDescriptorPtr>& descriptors);
+
 // Ideally this would be an equivalent function to
 // |PermissionDescriptorToPermissionType| but for a
 // `mojom::blink::PermissionDescriptorPtr` descriptor. But unfortunately mojo
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
index 1c66cb5..4c6a7c3 100644
--- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl
+++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -11642,11 +11642,14 @@
       # Deprecated.
       deprecated optional TargetID targetId
 
-  # Controls whether to automatically attach to new targets which are considered to be related to
-  # this one. When turned on, attaches to all existing related targets as well. When turned off,
+  # Controls whether to automatically attach to new targets which are considered
+  # to be directly related to this one (for example, iframes or workers).
+  # When turned on, attaches to all existing related targets as well. When turned off,
   # automatically detaches from all currently attached targets.
   # This also clears all targets added by `autoAttachRelated` from the list of targets to watch
   # for creation of related targets.
+  # You might want to call this recursively for auto-attached targets to attach
+  # to all available targets.
   command setAutoAttach
     parameters
       # Whether to auto-attach to related targets.
diff --git a/third_party/blink/renderer/core/animation/css_angle_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_angle_interpolation_type.cc
index 18ad81f..83078303 100644
--- a/third_party/blink/renderer/core/animation/css_angle_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_angle_interpolation_type.cc
@@ -43,4 +43,17 @@
       CSSPrimitiveValue::UnitType::kDegrees);
 }
 
+InterpolationValue
+CSSAngleInterpolationType::MaybeConvertCustomPropertyUnderlyingValue(
+    const CSSValue& value) const {
+  if (const auto* numeric_value = DynamicTo<CSSNumericLiteralValue>(value)) {
+    if (numeric_value->IsAngle()) {
+      return InterpolationValue(MakeGarbageCollected<InterpolableNumber>(
+          numeric_value->ComputeDegrees(),
+          CSSPrimitiveValue::UnitType::kDegrees));
+    }
+  }
+  return nullptr;
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/animation/css_angle_interpolation_type.h b/third_party/blink/renderer/core/animation/css_angle_interpolation_type.h
index 05ba8ff..cbe6d3f 100644
--- a/third_party/blink/renderer/core/animation/css_angle_interpolation_type.h
+++ b/third_party/blink/renderer/core/animation/css_angle_interpolation_type.h
@@ -28,6 +28,8 @@
   const CSSValue* CreateCSSValue(const InterpolableValue&,
                                  const NonInterpolableValue*,
                                  const StyleResolverState&) const final;
+  InterpolationValue MaybeConvertCustomPropertyUnderlyingValue(
+      const CSSValue&) const final;
 
  private:
   // These methods only apply to CSSInterpolationTypes used by standard CSS
diff --git a/third_party/blink/renderer/core/animation/css_border_image_length_box_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_border_image_length_box_interpolation_type.cc
index 100d1f4c..083f1da 100644
--- a/third_party/blink/renderer/core/animation/css_border_image_length_box_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_border_image_length_box_interpolation_type.cc
@@ -111,7 +111,7 @@
   if (side.length().IsAuto()) {
     return SideType::kAuto;
   }
-  DCHECK(side.length().IsSpecified());
+  DCHECK(side.length().HasOnlyFixedAndPercent());
   return SideType::kLength;
 }
 
diff --git a/third_party/blink/renderer/core/animation/css_color_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_color_interpolation_type.cc
index 059b251..d31f7601 100644
--- a/third_party/blink/renderer/core/animation/css_color_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_color_interpolation_type.cc
@@ -368,6 +368,22 @@
       style.UsedColorScheme(), /*color_provider=*/nullptr);
 }
 
+InterpolationValue
+CSSColorInterpolationType::MaybeConvertCustomPropertyUnderlyingValue(
+    const CSSValue& value) const {
+  InterpolableColor* interpolable_color =
+      MaybeCreateInterpolableColor(value, /*state=*/nullptr);
+  if (!interpolable_color) {
+    return nullptr;
+  }
+
+  auto* color_pair =
+      MakeGarbageCollected<InterpolableList>(kInterpolableColorPairIndexCount);
+  color_pair->Set(kUnvisited, interpolable_color->Clone());
+  color_pair->Set(kVisited, interpolable_color);
+  return InterpolationValue(color_pair);
+}
+
 void CSSColorInterpolationType::ApplyStandardPropertyValue(
     const InterpolableValue& interpolable_value,
     const NonInterpolableValue*,
diff --git a/third_party/blink/renderer/core/animation/css_color_interpolation_type.h b/third_party/blink/renderer/core/animation/css_color_interpolation_type.h
index d56293b..9ea8cc8 100644
--- a/third_party/blink/renderer/core/animation/css_color_interpolation_type.h
+++ b/third_party/blink/renderer/core/animation/css_color_interpolation_type.h
@@ -26,6 +26,8 @@
 
   InterpolationValue MaybeConvertStandardPropertyUnderlyingValue(
       const ComputedStyle&) const final;
+  InterpolationValue MaybeConvertCustomPropertyUnderlyingValue(
+      const CSSValue&) const final;
   void ApplyStandardPropertyValue(const InterpolableValue&,
                                   const NonInterpolableValue*,
                                   StyleResolverState&) const final;
diff --git a/third_party/blink/renderer/core/animation/css_custom_length_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_custom_length_interpolation_type.cc
index 7d750520..ccc0dde 100644
--- a/third_party/blink/renderer/core/animation/css_custom_length_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_custom_length_interpolation_type.cc
@@ -21,8 +21,9 @@
     ConversionCheckers&) const {
   InterpolableLength* maybe_length =
       InterpolableLength::MaybeConvertCSSValue(value);
-  if (!maybe_length || maybe_length->HasPercentage())
+  if (!maybe_length || maybe_length->HasPercentage()) {
     return nullptr;
+  }
   return InterpolationValue(maybe_length);
 }
 
@@ -35,4 +36,15 @@
   return interpolable_length.CreateCSSValue(Length::ValueRange::kAll);
 }
 
+InterpolationValue
+CSSCustomLengthInterpolationType::MaybeConvertCustomPropertyUnderlyingValue(
+    const CSSValue& value) const {
+  InterpolableLength* maybe_length =
+      InterpolableLength::MaybeConvertCSSValue(value);
+  if (!maybe_length || maybe_length->HasPercentage()) {
+    return nullptr;
+  }
+  return InterpolationValue(maybe_length);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/animation/css_custom_length_interpolation_type.h b/third_party/blink/renderer/core/animation/css_custom_length_interpolation_type.h
index 9329dbd..d23f2b9 100644
--- a/third_party/blink/renderer/core/animation/css_custom_length_interpolation_type.h
+++ b/third_party/blink/renderer/core/animation/css_custom_length_interpolation_type.h
@@ -27,6 +27,8 @@
   const CSSValue* CreateCSSValue(const InterpolableValue&,
                                  const NonInterpolableValue*,
                                  const StyleResolverState&) const final;
+  InterpolationValue MaybeConvertCustomPropertyUnderlyingValue(
+      const CSSValue&) const final;
 
  private:
   // These methods only apply to CSSInterpolationTypes used by standard CSS
diff --git a/third_party/blink/renderer/core/animation/css_custom_list_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_custom_list_interpolation_type.cc
index 22ecdf4..a9befb10 100644
--- a/third_party/blink/renderer/core/animation/css_custom_list_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_custom_list_interpolation_type.cc
@@ -53,6 +53,20 @@
 }
 
 InterpolationValue
+CSSCustomListInterpolationType::MaybeConvertCustomPropertyUnderlyingValue(
+    const CSSValue& value) const {
+  const auto* list = DynamicTo<CSSValueList>(value);
+  if (!list) {
+    return nullptr;
+  }
+  return ListInterpolationFunctions::CreateList(
+      list->length(), [this, list](wtf_size_t index) {
+        return inner_interpolation_type_
+            ->MaybeConvertCustomPropertyUnderlyingValue(list->Item(index));
+      });
+}
+
+InterpolationValue
 CSSCustomListInterpolationType::PreInterpolationCompositeIfNeeded(
     InterpolationValue value,
     const InterpolationValue& underlying,
diff --git a/third_party/blink/renderer/core/animation/css_custom_list_interpolation_type.h b/third_party/blink/renderer/core/animation/css_custom_list_interpolation_type.h
index 449769c..df4629ec 100644
--- a/third_party/blink/renderer/core/animation/css_custom_list_interpolation_type.h
+++ b/third_party/blink/renderer/core/animation/css_custom_list_interpolation_type.h
@@ -47,6 +47,8 @@
   PairwiseInterpolationValue MaybeMergeSingles(
       InterpolationValue&& start,
       InterpolationValue&& end) const final;
+  InterpolationValue MaybeConvertCustomPropertyUnderlyingValue(
+      const CSSValue&) const final;
 
  private:
   // These methods only apply to CSSInterpolationTypes used by standard CSS
diff --git a/third_party/blink/renderer/core/animation/css_custom_transform_function_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_custom_transform_function_interpolation_type.cc
index 5a426994..2d195bc 100644
--- a/third_party/blink/renderer/core/animation/css_custom_transform_function_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_custom_transform_function_interpolation_type.cc
@@ -19,23 +19,32 @@
 }
 
 InterpolationValue
-CSSCustomTransformFunctionInterpolationType::MaybeConvertValue(
+CSSCustomTransformFunctionInterpolationType::MaybeConvertTransformFunction(
     const CSSValue& value,
-    const StyleResolverState*,
-    ConversionCheckers&) const {
-  auto* function_value = DynamicTo<CSSFunctionValue>(value);
+    const CSSToLengthConversionData& conversion_data) const {
+  const auto* function_value = DynamicTo<CSSFunctionValue>(value);
   if (!function_value || !IsTransformFunction(function_value->FunctionType())) {
     return nullptr;
   }
 
   InterpolableTransformList* interpolable =
       InterpolableTransformList::ConvertCSSValue(
-          value, CSSToLengthConversionData(/*element=*/nullptr),
+          value, conversion_data,
           TransformOperations::BoxSizeDependentMatrixBlending::kDisallow);
   CHECK_EQ(interpolable->operations().size(), 1u);
   return InterpolationValue(std::move(interpolable));
 }
 
+InterpolationValue
+CSSCustomTransformFunctionInterpolationType::MaybeConvertValue(
+    const CSSValue& value,
+    const StyleResolverState* state,
+    ConversionCheckers&) const {
+  CHECK(state);
+  return MaybeConvertTransformFunction(value,
+                                       state->CssToLengthConversionData());
+}
+
 const CSSValue* CSSCustomTransformFunctionInterpolationType::CreateCSSValue(
     const InterpolableValue& value,
     const NonInterpolableValue*,
@@ -50,6 +59,12 @@
       list_value->operations());
 }
 
+InterpolationValue CSSCustomTransformFunctionInterpolationType::
+    MaybeConvertCustomPropertyUnderlyingValue(const CSSValue& value) const {
+  return MaybeConvertTransformFunction(
+      value, CSSToLengthConversionData(/*element=*/nullptr));
+}
+
 InterpolationValue
 CSSCustomTransformFunctionInterpolationType::PreInterpolationCompositeIfNeeded(
     InterpolationValue value,
diff --git a/third_party/blink/renderer/core/animation/css_custom_transform_function_interpolation_type.h b/third_party/blink/renderer/core/animation/css_custom_transform_function_interpolation_type.h
index 52b48ce3..e5f9ebb 100644
--- a/third_party/blink/renderer/core/animation/css_custom_transform_function_interpolation_type.h
+++ b/third_party/blink/renderer/core/animation/css_custom_transform_function_interpolation_type.h
@@ -32,6 +32,8 @@
   const CSSValue* CreateCSSValue(const InterpolableValue&,
                                  const NonInterpolableValue*,
                                  const StyleResolverState&) const final;
+  InterpolationValue MaybeConvertCustomPropertyUnderlyingValue(
+      const CSSValue&) const final;
 
  private:
   InterpolationValue PreInterpolationCompositeIfNeeded(
@@ -40,6 +42,10 @@
       EffectModel::CompositeOperation,
       ConversionCheckers&) const final;
 
+  InterpolationValue MaybeConvertTransformFunction(
+      const CSSValue&,
+      const CSSToLengthConversionData&) const;
+
   // These methods only apply to CSSInterpolationTypes used by standard CSS
   // properties.
   // CSSCustomTransformInterpolationType is only accessible via registered
diff --git a/third_party/blink/renderer/core/animation/css_custom_transform_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_custom_transform_interpolation_type.cc
index 85853da..35d3305 100644
--- a/third_party/blink/renderer/core/animation/css_custom_transform_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_custom_transform_interpolation_type.cc
@@ -17,11 +17,11 @@
       TransformOperations::BoxSizeDependentMatrixBlending::kDisallow));
 }
 
-InterpolationValue CSSCustomTransformInterpolationType::MaybeConvertValue(
+InterpolationValue
+CSSCustomTransformInterpolationType::MaybeConvertTransformList(
     const CSSValue& value,
-    const StyleResolverState*,
-    ConversionCheckers&) const {
-  auto* list_value = DynamicTo<CSSValueList>(value);
+    const CSSToLengthConversionData& conversion_data) const {
+  const auto* list_value = DynamicTo<CSSValueList>(value);
   if (!list_value) {
     return nullptr;
   }
@@ -36,10 +36,18 @@
   }
 
   return InterpolationValue(InterpolableTransformList::ConvertCSSValue(
-      value, CSSToLengthConversionData(/*element=*/nullptr),
+      value, conversion_data,
       TransformOperations::BoxSizeDependentMatrixBlending::kDisallow));
 }
 
+InterpolationValue CSSCustomTransformInterpolationType::MaybeConvertValue(
+    const CSSValue& value,
+    const StyleResolverState* state,
+    ConversionCheckers&) const {
+  CHECK(state);
+  return MaybeConvertTransformList(value, state->CssToLengthConversionData());
+}
+
 const CSSValue* CSSCustomTransformInterpolationType::CreateCSSValue(
     const InterpolableValue& value,
     const NonInterpolableValue*,
@@ -51,4 +59,11 @@
   return ComputedStyleUtils::ValueForTransformList(list_value->operations(), 1);
 }
 
+InterpolationValue
+CSSCustomTransformInterpolationType::MaybeConvertCustomPropertyUnderlyingValue(
+    const CSSValue& value) const {
+  return MaybeConvertTransformList(
+      value, CSSToLengthConversionData(/*element=*/nullptr));
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/animation/css_custom_transform_interpolation_type.h b/third_party/blink/renderer/core/animation/css_custom_transform_interpolation_type.h
index 71e7f4f..4494651 100644
--- a/third_party/blink/renderer/core/animation/css_custom_transform_interpolation_type.h
+++ b/third_party/blink/renderer/core/animation/css_custom_transform_interpolation_type.h
@@ -30,8 +30,14 @@
   const CSSValue* CreateCSSValue(const InterpolableValue&,
                                  const NonInterpolableValue*,
                                  const StyleResolverState&) const final;
+  InterpolationValue MaybeConvertCustomPropertyUnderlyingValue(
+      const CSSValue&) const final;
 
  private:
+  InterpolationValue MaybeConvertTransformList(
+      const CSSValue&,
+      const CSSToLengthConversionData&) const;
+
   // These methods only apply to CSSInterpolationTypes used by standard CSS
   // properties.
   // CSSCustomTransformInterpolationType is only accessible via registered
diff --git a/third_party/blink/renderer/core/animation/css_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_interpolation_type.cc
index b00e4ed..29ec8a4 100644
--- a/third_party/blink/renderer/core/animation/css_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_interpolation_type.cc
@@ -391,10 +391,7 @@
       style.GetVariableValue(name, Registration().Inherits());
   if (!underlying_value)
     return nullptr;
-  // TODO(alancutter): Remove the need for passing in conversion checkers.
-  ConversionCheckers dummy_conversion_checkers;
-  return MaybeConvertValue(*underlying_value,
-                           /*state=*/nullptr, dummy_conversion_checkers);
+  return MaybeConvertCustomPropertyUnderlyingValue(*underlying_value);
 }
 
 void CSSInterpolationType::Apply(
diff --git a/third_party/blink/renderer/core/animation/css_interpolation_type.h b/third_party/blink/renderer/core/animation/css_interpolation_type.h
index 2c1bf70f..a478dc1 100644
--- a/third_party/blink/renderer/core/animation/css_interpolation_type.h
+++ b/third_party/blink/renderer/core/animation/css_interpolation_type.h
@@ -65,6 +65,11 @@
     return value;
   }
 
+  virtual InterpolationValue MaybeConvertCustomPropertyUnderlyingValue(
+      const CSSValue&) const {
+    NOTREACHED();
+  }
+
  protected:
   explicit CSSInterpolationType(PropertyHandle,
                                 const PropertyRegistration* = nullptr);
diff --git a/third_party/blink/renderer/core/animation/css_length_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_length_interpolation_type.cc
index 17e320e..db7fd86f 100644
--- a/third_party/blink/renderer/core/animation/css_length_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_length_interpolation_type.cc
@@ -223,6 +223,12 @@
       style.InterpolateSize()));
 }
 
+InterpolationValue
+CSSLengthInterpolationType::MaybeConvertCustomPropertyUnderlyingValue(
+    const CSSValue& value) const {
+  return InterpolationValue(InterpolableLength::MaybeConvertCSSValue(value));
+}
+
 const CSSValue* CSSLengthInterpolationType::CreateCSSValue(
     const InterpolableValue& interpolable_value,
     const NonInterpolableValue*,
@@ -256,7 +262,7 @@
     const ComputedStyle* after_style = builder.CloneStyle();
     DCHECK(
         LengthPropertyFunctions::GetLength(CssProperty(), *after_style, after));
-    if (before.IsSpecified() && after.IsSpecified()) {
+    if (before.HasOnlyFixedAndPercent() && after.HasOnlyFixedAndPercent()) {
       // A relative error of 1/100th of a percent is likely not noticeable.
       // This check can be triggered with a tight tolerance such as 1e-6 for
       // suitably ill-conditioned animations (crbug.com/1204099).
diff --git a/third_party/blink/renderer/core/animation/css_length_interpolation_type.h b/third_party/blink/renderer/core/animation/css_length_interpolation_type.h
index 4364af6e..c72373f 100644
--- a/third_party/blink/renderer/core/animation/css_length_interpolation_type.h
+++ b/third_party/blink/renderer/core/animation/css_length_interpolation_type.h
@@ -20,6 +20,8 @@
 
   InterpolationValue MaybeConvertStandardPropertyUnderlyingValue(
       const ComputedStyle&) const final;
+  InterpolationValue MaybeConvertCustomPropertyUnderlyingValue(
+      const CSSValue&) const final;
   void Composite(UnderlyingValueOwner&,
                  double underlying_fraction,
                  const InterpolationValue&,
diff --git a/third_party/blink/renderer/core/animation/css_number_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_number_interpolation_type.cc
index 66e03f2..8a37bd2 100644
--- a/third_party/blink/renderer/core/animation/css_number_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_number_interpolation_type.cc
@@ -105,6 +105,17 @@
   return CreateNumberValue(*underlying_number);
 }
 
+InterpolationValue
+CSSNumberInterpolationType::MaybeConvertCustomPropertyUnderlyingValue(
+    const CSSValue& value) const {
+  if (const auto* number_value = DynamicTo<CSSNumericLiteralValue>(value)) {
+    if (number_value->IsNumber()) {
+      return CreateNumberValue(number_value->GetDoubleValue());
+    }
+  }
+  return nullptr;
+}
+
 void CSSNumberInterpolationType::ApplyStandardPropertyValue(
     const InterpolableValue& interpolable_value,
     const NonInterpolableValue*,
diff --git a/third_party/blink/renderer/core/animation/css_number_interpolation_type.h b/third_party/blink/renderer/core/animation/css_number_interpolation_type.h
index ad4286df..c6fef95 100644
--- a/third_party/blink/renderer/core/animation/css_number_interpolation_type.h
+++ b/third_party/blink/renderer/core/animation/css_number_interpolation_type.h
@@ -24,6 +24,8 @@
 
   InterpolationValue MaybeConvertStandardPropertyUnderlyingValue(
       const ComputedStyle&) const final;
+  InterpolationValue MaybeConvertCustomPropertyUnderlyingValue(
+      const CSSValue&) const final;
   void ApplyStandardPropertyValue(const InterpolableValue&,
                                   const NonInterpolableValue*,
                                   StyleResolverState&) const final;
diff --git a/third_party/blink/renderer/core/animation/css_percentage_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_percentage_interpolation_type.cc
index b69754e..b9670c9 100644
--- a/third_party/blink/renderer/core/animation/css_percentage_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_percentage_interpolation_type.cc
@@ -103,6 +103,17 @@
   return CreatePercentageValue(*underlying_percentage);
 }
 
+InterpolationValue
+CSSPercentageInterpolationType::MaybeConvertCustomPropertyUnderlyingValue(
+    const CSSValue& value) const {
+  if (const auto* percentage_value = DynamicTo<CSSNumericLiteralValue>(value)) {
+    if (percentage_value->IsPercentage()) {
+      return CreatePercentageValue(percentage_value->GetDoubleValue());
+    }
+  }
+  return nullptr;
+}
+
 void CSSPercentageInterpolationType::ApplyStandardPropertyValue(
     const InterpolableValue& interpolable_value,
     const NonInterpolableValue*,
diff --git a/third_party/blink/renderer/core/animation/css_percentage_interpolation_type.h b/third_party/blink/renderer/core/animation/css_percentage_interpolation_type.h
index 9098852..65aeea4f 100644
--- a/third_party/blink/renderer/core/animation/css_percentage_interpolation_type.h
+++ b/third_party/blink/renderer/core/animation/css_percentage_interpolation_type.h
@@ -19,6 +19,8 @@
 
   InterpolationValue MaybeConvertStandardPropertyUnderlyingValue(
       const ComputedStyle&) const final;
+  InterpolationValue MaybeConvertCustomPropertyUnderlyingValue(
+      const CSSValue&) const final;
   void ApplyStandardPropertyValue(const InterpolableValue&,
                                   const NonInterpolableValue*,
                                   StyleResolverState&) const final;
diff --git a/third_party/blink/renderer/core/animation/css_resolution_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_resolution_interpolation_type.cc
index 0d1d1389..e7b93a5 100644
--- a/third_party/blink/renderer/core/animation/css_resolution_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_resolution_interpolation_type.cc
@@ -15,15 +15,23 @@
   return InterpolationValue(MakeGarbageCollected<InterpolableNumber>(0));
 }
 
+InterpolationValue CSSResolutionInterpolationType::MaybeConvertResolution(
+    const CSSValue& value,
+    const CSSToLengthConversionData& conversion_data) const {
+  const auto* primitive_value = DynamicTo<CSSPrimitiveValue>(value);
+  if (!primitive_value || !primitive_value->IsResolution()) {
+    return nullptr;
+  }
+  return InterpolationValue(MakeGarbageCollected<InterpolableNumber>(
+      primitive_value->ComputeDotsPerPixel(conversion_data)));
+}
+
 InterpolationValue CSSResolutionInterpolationType::MaybeConvertValue(
     const CSSValue& value,
-    const StyleResolverState*,
+    const StyleResolverState* state,
     ConversionCheckers&) const {
-  auto* primitive_value = DynamicTo<CSSPrimitiveValue>(value);
-  if (!primitive_value || !primitive_value->IsResolution())
-    return nullptr;
-  return InterpolationValue(MakeGarbageCollected<InterpolableNumber>(
-      primitive_value->ComputeDotsPerPixel()));
+  CHECK(state);
+  return MaybeConvertResolution(value, state->CssToLengthConversionData());
 }
 
 const CSSValue* CSSResolutionInterpolationType::CreateCSSValue(
@@ -35,4 +43,11 @@
       CSSPrimitiveValue::UnitType::kDotsPerPixel);
 }
 
+InterpolationValue
+CSSResolutionInterpolationType::MaybeConvertCustomPropertyUnderlyingValue(
+    const CSSValue& value) const {
+  return MaybeConvertResolution(value,
+                                CSSToLengthConversionData(/*element=*/nullptr));
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/animation/css_resolution_interpolation_type.h b/third_party/blink/renderer/core/animation/css_resolution_interpolation_type.h
index c18b396..4f50195 100644
--- a/third_party/blink/renderer/core/animation/css_resolution_interpolation_type.h
+++ b/third_party/blink/renderer/core/animation/css_resolution_interpolation_type.h
@@ -28,8 +28,14 @@
   const CSSValue* CreateCSSValue(const InterpolableValue&,
                                  const NonInterpolableValue*,
                                  const StyleResolverState&) const final;
+  InterpolationValue MaybeConvertCustomPropertyUnderlyingValue(
+      const CSSValue&) const final;
 
  private:
+  InterpolationValue MaybeConvertResolution(
+      const CSSValue&,
+      const CSSToLengthConversionData&) const;
+
   // These methods only apply to CSSInterpolationTypes used by standard CSS
   // properties.
   // CSSResolutionInterpolationType is only accessible via registered custom CSS
diff --git a/third_party/blink/renderer/core/animation/css_time_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_time_interpolation_type.cc
index 181ccff..3648e73 100644
--- a/third_party/blink/renderer/core/animation/css_time_interpolation_type.cc
+++ b/third_party/blink/renderer/core/animation/css_time_interpolation_type.cc
@@ -19,14 +19,22 @@
   return CreateTimeValue(0);
 }
 
+InterpolationValue CSSTimeInterpolationType::MaybeConvertTime(
+    const CSSValue& value,
+    const CSSToLengthConversionData& conversion_data) const {
+  const auto* primitive_value = DynamicTo<CSSPrimitiveValue>(value);
+  if (!primitive_value || !primitive_value->IsTime()) {
+    return nullptr;
+  }
+  return CreateTimeValue(primitive_value->ComputeSeconds(conversion_data));
+}
+
 InterpolationValue CSSTimeInterpolationType::MaybeConvertValue(
     const CSSValue& value,
-    const StyleResolverState*,
+    const StyleResolverState* state,
     ConversionCheckers&) const {
-  auto* primitive_value = DynamicTo<CSSPrimitiveValue>(value);
-  if (!primitive_value || !primitive_value->IsTime())
-    return nullptr;
-  return CreateTimeValue(primitive_value->ComputeSeconds());
+  CHECK(state);
+  return MaybeConvertTime(value, state->CssToLengthConversionData());
 }
 
 const CSSValue* CSSTimeInterpolationType::CreateCSSValue(
@@ -84,6 +92,13 @@
   return nullptr;
 }
 
+InterpolationValue
+CSSTimeInterpolationType::MaybeConvertCustomPropertyUnderlyingValue(
+    const CSSValue& value) const {
+  return MaybeConvertTime(value,
+                          CSSToLengthConversionData(/*element=*/nullptr));
+}
+
 void CSSTimeInterpolationType::ApplyStandardPropertyValue(
     const InterpolableValue& interpolable_value,
     const NonInterpolableValue*,
diff --git a/third_party/blink/renderer/core/animation/css_time_interpolation_type.h b/third_party/blink/renderer/core/animation/css_time_interpolation_type.h
index f970c93..6d90623f 100644
--- a/third_party/blink/renderer/core/animation/css_time_interpolation_type.h
+++ b/third_party/blink/renderer/core/animation/css_time_interpolation_type.h
@@ -34,8 +34,12 @@
   InterpolationValue CreateTimeValue(double) const;
   std::optional<double> GetSeconds(const ComputedStyle& style) const;
   double ClampTime(const CSSPropertyID& property, double value) const;
+  InterpolationValue MaybeConvertTime(const CSSValue&,
+                                      const CSSToLengthConversionData&) const;
   InterpolationValue MaybeConvertStandardPropertyUnderlyingValue(
       const ComputedStyle&) const final;
+  InterpolationValue MaybeConvertCustomPropertyUnderlyingValue(
+      const CSSValue&) const final;
   void ApplyStandardPropertyValue(const InterpolableValue&,
                                   const NonInterpolableValue*,
                                   StyleResolverState&) const final;
diff --git a/third_party/blink/renderer/core/animation/interpolable_length.cc b/third_party/blink/renderer/core/animation/interpolable_length.cc
index e3ee5fc..d9d5c52 100644
--- a/third_party/blink/renderer/core/animation/interpolable_length.cc
+++ b/third_party/blink/renderer/core/animation/interpolable_length.cc
@@ -135,7 +135,7 @@
     const CSSProperty& property,
     float zoom,
     std::optional<EInterpolateSize> interpolate_size) {
-  if (!length.IsSpecified()) {
+  if (!length.CanConvertToCalculation()) {
     CSSValueID keyword = LengthTypeToCSSValueID(length.GetType());
     if (keyword == CSSValueID::kInvalid ||
         !LengthPropertyFunctions::CanAnimateKeyword(property, keyword)) {
diff --git a/third_party/blink/renderer/core/css/css_math_expression_node.cc b/third_party/blink/renderer/core/css/css_math_expression_node.cc
index 1a97d61..199427d 100644
--- a/third_party/blink/renderer/core/css/css_math_expression_node.cc
+++ b/third_party/blink/renderer/core/css/css_math_expression_node.cc
@@ -419,8 +419,9 @@
   void Trace(Visitor* visitor) const { visitor->Trace(node); }
 };
 using UnitsVector = HeapVector<CSSMathExpressionNodeWithOperator>;
+using GCedUnitsVector = GCedHeapVector<CSSMathExpressionNodeWithOperator>;
 using UnitsVectorHashMap =
-    HeapHashMap<CSSPrimitiveValue::UnitType, Member<UnitsVector>>;
+    HeapHashMap<CSSPrimitiveValue::UnitType, Member<GCedUnitsVector>>;
 
 bool IsNumericNodeWithDoubleValue(const CSSMathExpressionNode* node) {
   return node->IsNumericLiteral() && HasDoubleValue(node->ResolvedUnitType());
@@ -546,7 +547,7 @@
       it->value->emplace_back(op, root);
     } else {
       numeric_children.insert(
-          unit_type, MakeGarbageCollected<UnitsVector>(
+          unit_type, MakeGarbageCollected<GCedUnitsVector>(
                          1, CSSMathExpressionNodeWithOperator(op, root)));
     }
     return;
@@ -585,8 +586,9 @@
                                                           sum_node->Category());
 }
 
-CSSMathExpressionNode* AddNodesVectorToSumNode(CSSMathExpressionNode* sum_node,
-                                               const UnitsVector& vector) {
+CSSMathExpressionNode* AddNodesVectorToSumNode(
+    CSSMathExpressionNode* sum_node,
+    const base::span<CSSMathExpressionNodeWithOperator>& vector) {
   for (const auto& [op, node] : vector) {
     sum_node = AddNodeToSumNode(sum_node, node, op);
   }
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_impl_test.cc b/third_party/blink/renderer/core/css/parser/css_parser_impl_test.cc
index ec3fcd8..856752f 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_impl_test.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_impl_test.cc
@@ -1286,7 +1286,8 @@
   StyleRuleSupports* supports_rule = DynamicTo<StyleRuleSupports>(rule);
   ASSERT_TRUE(supports_rule->ConditionIsSupported());
 
-  HeapVector<Member<StyleRuleBase>> child_rules = supports_rule->ChildRules();
+  const HeapVector<Member<StyleRuleBase>>& child_rules =
+      supports_rule->ChildRules();
   ASSERT_EQ(child_rules.size(), 2u);
   ASSERT_EQ(String("div"),
             To<StyleRule>(child_rules[0].Get())->SelectorsText());
@@ -1333,7 +1334,8 @@
   StyleRuleSupports* supports_rule = DynamicTo<StyleRuleSupports>(rule);
   ASSERT_FALSE(supports_rule->ConditionIsSupported());
 
-  HeapVector<Member<StyleRuleBase>> child_rules = supports_rule->ChildRules();
+  const HeapVector<Member<StyleRuleBase>>& child_rules =
+      supports_rule->ChildRules();
   ASSERT_EQ(child_rules.size(), 2u);
   ASSERT_EQ(String("div"),
             To<StyleRule>(child_rules[0].Get())->SelectorsText());
diff --git a/third_party/blink/renderer/core/css/resolver/match_result_test.cc b/third_party/blink/renderer/core/css/resolver/match_result_test.cc
index 2cb9e8e..77c7ff1 100644
--- a/third_party/blink/renderer/core/css/resolver/match_result_test.cc
+++ b/third_party/blink/renderer/core/css/resolver/match_result_test.cc
@@ -38,13 +38,14 @@
   }
 
  private:
-  Persistent<HeapVector<Member<MutableCSSPropertyValueSet>, 8>> property_sets;
+  Persistent<GCedHeapVector<Member<MutableCSSPropertyValueSet>, 8>>
+      property_sets;
 };
 
 void MatchResultTest::SetUp() {
   PageTestBase::SetUp();
-  property_sets =
-      MakeGarbageCollected<HeapVector<Member<MutableCSSPropertyValueSet>, 8>>();
+  property_sets = MakeGarbageCollected<
+      GCedHeapVector<Member<MutableCSSPropertyValueSet>, 8>>();
   for (unsigned i = 0; i < 8; i++) {
     property_sets->push_back(
         MakeGarbageCollected<MutableCSSPropertyValueSet>(kHTMLQuirksMode));
diff --git a/third_party/blink/renderer/core/css/rule_set.cc b/third_party/blink/renderer/core/css/rule_set.cc
index 968e0464..acb67fb 100644
--- a/third_party/blink/renderer/core/css/rule_set.cc
+++ b/third_party/blink/renderer/core/css/rule_set.cc
@@ -880,7 +880,7 @@
 }
 
 void RuleSet::AddChildRules(StyleRule* parent_rule,
-                            const HeapVector<Member<StyleRuleBase>>& rules,
+                            base::span<const Member<StyleRuleBase>> rules,
                             const MediaQueryEvaluator& medium,
                             AddRuleFlags add_rule_flags,
                             const ContainerQuery* container_query,
diff --git a/third_party/blink/renderer/core/css/rule_set.h b/third_party/blink/renderer/core/css/rule_set.h
index 1affcca..7e3cee1 100644
--- a/third_party/blink/renderer/core/css/rule_set.h
+++ b/third_party/blink/renderer/core/css/rule_set.h
@@ -611,7 +611,7 @@
   bool MatchMediaForAddRules(const MediaQueryEvaluator& evaluator,
                              const MediaQuerySet* media_queries);
   void AddChildRules(StyleRule* parent_rule,
-                     const HeapVector<Member<StyleRuleBase>>&,
+                     base::span<const Member<StyleRuleBase>>,
                      const MediaQueryEvaluator& medium,
                      AddRuleFlags,
                      const ContainerQuery*,
diff --git a/third_party/blink/renderer/core/css/style_engine.cc b/third_party/blink/renderer/core/css/style_engine.cc
index 491b5b8..8b28fe2 100644
--- a/third_party/blink/renderer/core/css/style_engine.cc
+++ b/third_party/blink/renderer/core/css/style_engine.cc
@@ -4728,6 +4728,28 @@
   return invalidated;
 }
 
+namespace {
+
+template <typename VectorType>
+void RevisitStyleRulesForInspector(const RuleFeatureSet& features,
+                                   const VectorType& rules) {
+  for (StyleRuleBase* rule : rules) {
+    if (StyleRule* style_rule = DynamicTo<StyleRule>(rule)) {
+      for (const CSSSelector* selector = style_rule->FirstSelector(); selector;
+           selector = CSSSelectorList::Next(*selector)) {
+        InvalidationSetToSelectorMap::SelectorScope selector_scope(
+            style_rule, style_rule->SelectorIndex(*selector));
+        features.RevisitSelectorForInspector(*selector);
+      }
+    } else if (StyleRuleGroup* style_rule_group =
+                   DynamicTo<StyleRuleGroup>(rule)) {
+      RevisitStyleRulesForInspector(features, style_rule_group->ChildRules());
+    }
+  }
+}
+
+}  // namespace
+
 void StyleEngine::RevisitStyleSheetForInspector(StyleSheetContents* contents) {
   // We need to revisit the sheet twice, once with the global rule set and
   // once with the sheet's associated rule set.
@@ -4744,22 +4766,4 @@
   }
 }
 
-void StyleEngine::RevisitStyleRulesForInspector(
-    const RuleFeatureSet& features,
-    const HeapVector<Member<StyleRuleBase>>& rules) {
-  for (StyleRuleBase* rule : rules) {
-    if (StyleRule* style_rule = DynamicTo<StyleRule>(rule)) {
-      for (const CSSSelector* selector = style_rule->FirstSelector(); selector;
-           selector = CSSSelectorList::Next(*selector)) {
-        InvalidationSetToSelectorMap::SelectorScope selector_scope(
-            style_rule, style_rule->SelectorIndex(*selector));
-        features.RevisitSelectorForInspector(*selector);
-      }
-    } else if (StyleRuleGroup* style_rule_group =
-                   DynamicTo<StyleRuleGroup>(rule)) {
-      RevisitStyleRulesForInspector(features, style_rule_group->ChildRules());
-    }
-  }
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/css/style_engine.h b/third_party/blink/renderer/core/css/style_engine.h
index 498e724..019779f 100644
--- a/third_party/blink/renderer/core/css/style_engine.h
+++ b/third_party/blink/renderer/core/css/style_engine.h
@@ -818,10 +818,6 @@
 
   Document& GetDocument() const { return *document_; }
 
-  void RevisitStyleRulesForInspector(
-      const RuleFeatureSet& features,
-      const HeapVector<Member<StyleRuleBase>>& rules);
-
   bool MediaQueryAffectingValueChanged(const ActiveStyleSheetVector&,
                                        MediaValueChange);
   void MediaQueryAffectingValueChanged(TreeScope&, MediaValueChange);
diff --git a/third_party/blink/renderer/core/css/style_environment_variables.h b/third_party/blink/renderer/core/css/style_environment_variables.h
index c1a255a4..d09afb5 100644
--- a/third_party/blink/renderer/core/css/style_environment_variables.h
+++ b/third_party/blink/renderer/core/css/style_environment_variables.h
@@ -182,8 +182,8 @@
   virtual void InvalidateVariable(const AtomicString& name);
 
  private:
-  typedef HeapVector<HeapVector<Member<CSSVariableData>>>
-      TwoDimensionVariableValues;
+  using TwoDimensionVariableValues =
+      GCedHeapVector<HeapVector<Member<CSSVariableData>>>;
 
   HeapVector<Member<StyleEnvironmentVariables>> children_;
   HeapHashMap<AtomicString, Member<CSSVariableData>> data_;
diff --git a/third_party/blink/renderer/core/css/style_rule.cc b/third_party/blink/renderer/core/css/style_rule.cc
index 74b92352..21b3137 100644
--- a/third_party/blink/renderer/core/css/style_rule.cc
+++ b/third_party/blink/renderer/core/css/style_rule.cc
@@ -593,7 +593,7 @@
       }
       auto* new_rule = StyleRule::Create(
           selectors, To<StyleRule>(this)->Properties().ImmutableCopyIfNeeded());
-      if (HeapVector<Member<StyleRuleBase>>* child_rules =
+      if (GCedHeapVector<Member<StyleRuleBase>>* child_rules =
               To<StyleRule>(this)->ChildRules()) {
         for (StyleRuleBase* child_rule : *child_rules) {
           new_rule->AddChildRule(child_rule->Renest(new_rule));
diff --git a/third_party/blink/renderer/core/css/style_sheet_contents.cc b/third_party/blink/renderer/core/css/style_sheet_contents.cc
index 4e470c5..9b1ea01 100644
--- a/third_party/blink/renderer/core/css/style_sheet_contents.cc
+++ b/third_party/blink/renderer/core/css/style_sheet_contents.cc
@@ -263,10 +263,10 @@
   child_rules_.clear();
 }
 
-static wtf_size_t ReplaceRuleIfExistsInternal(
-    const StyleRuleBase* old_rule,
-    StyleRuleBase* new_rule,
-    HeapVector<Member<StyleRuleBase>>& child_rules) {
+template <typename ChildRulesType>
+static wtf_size_t ReplaceRuleIfExistsInternal(const StyleRuleBase* old_rule,
+                                              StyleRuleBase* new_rule,
+                                              ChildRulesType& child_rules) {
   for (wtf_size_t i = 0; i < child_rules.size(); ++i) {
     StyleRuleBase* rule = child_rules[i].Get();
     if (rule == old_rule) {
@@ -650,9 +650,8 @@
 }
 
 static bool ChildRulesHaveFailedOrCanceledSubresources(
-    const HeapVector<Member<StyleRuleBase>>& rules) {
-  for (unsigned i = 0; i < rules.size(); ++i) {
-    const StyleRuleBase* rule = rules[i].Get();
+    const base::span<const Member<StyleRuleBase>>& rules) {
+  for (const StyleRuleBase* rule : rules) {
     switch (rule->GetType()) {
       case StyleRuleBase::kStyle:
         if (To<StyleRule>(rule)->PropertiesHaveFailedOrCanceledSubresources()) {
diff --git a/third_party/blink/renderer/core/css/style_traversal_root_test.cc b/third_party/blink/renderer/core/css/style_traversal_root_test.cc
index dd3491e..663dee3 100644
--- a/third_party/blink/renderer/core/css/style_traversal_root_test.cc
+++ b/third_party/blink/renderer/core/css/style_traversal_root_test.cc
@@ -68,7 +68,7 @@
   void SetUp() final {
     document_ =
         Document::CreateForTest(execution_context_.GetExecutionContext());
-    elements_ = MakeGarbageCollected<HeapVector<Member<Element>, 7>>();
+    elements_ = MakeGarbageCollected<GCedHeapVector<Member<Element>, 7>>();
     for (size_t i = 0; i < kElementCount; i++) {
       elements_->push_back(GetDocument().CreateRawElement(html_names::kDivTag));
     }
@@ -96,7 +96,7 @@
   test::TaskEnvironment task_environment_;
   ScopedNullExecutionContext execution_context_;
   Persistent<Document> document_;
-  Persistent<HeapVector<Member<Element>, 7>> elements_;
+  Persistent<GCedHeapVector<Member<Element>, 7>> elements_;
 };
 
 TEST_F(StyleTraversalRootTest, Update_SingleRoot) {
diff --git a/third_party/blink/renderer/core/dom/part_root.cc b/third_party/blink/renderer/core/dom/part_root.cc
index 0449074..f3ca0b4 100644
--- a/third_party/blink/renderer/core/dom/part_root.cc
+++ b/third_party/blink/renderer/core/dom/part_root.cc
@@ -20,6 +20,9 @@
 
 namespace blink {
 
+PartRoot::PartRoot()
+    : cached_ordered_parts_(MakeGarbageCollected<PartList>()) {}
+
 void PartRoot::Trace(Visitor* visitor) const {
   visitor->Trace(cached_ordered_parts_);
 }
@@ -29,8 +32,8 @@
   if (cached_parts_list_dirty_) {
     return;
   }
-  DCHECK(!base::Contains(cached_ordered_parts_, &new_part));
-  cached_ordered_parts_.push_back(&new_part);
+  DCHECK(!base::Contains(*cached_ordered_parts_, &new_part));
+  cached_ordered_parts_->push_back(&new_part);
 }
 
 // If we're removing the first Part in the cached part list, then just remove
@@ -96,7 +99,7 @@
 
 void PartRoot::SwapPartsList(PartRoot& other) {
   DCHECK(!RuntimeEnabledFeatures::DOMPartsAPIMinimalEnabled());
-  cached_ordered_parts_.swap(other.cached_ordered_parts_);
+  cached_ordered_parts_->swap(*other.cached_ordered_parts_);
   std::swap(cached_parts_list_dirty_, other.cached_parts_list_dirty_);
 }
 
@@ -116,7 +119,7 @@
 void PartRoot::RebuildPartsList() {
   DCHECK(!RuntimeEnabledFeatures::DOMPartsAPIMinimalEnabled());
   DCHECK(cached_parts_list_dirty_);
-  cached_ordered_parts_.clear();
+  cached_ordered_parts_->clear();
   // Then traverse the tree under the root container and add parts in the order
   // they're found in the tree, and for the same Node, in the order they were
   // constructed.
@@ -169,8 +172,8 @@
         if (part->NodeToSortBy() != node) {
           continue;
         }
-        DCHECK(!base::Contains(cached_ordered_parts_, part));
-        cached_ordered_parts_.push_back(part);
+        DCHECK(!base::Contains(*cached_ordered_parts_, part));
+        cached_ordered_parts_->push_back(part);
       }
     }
     node = next_node;
@@ -269,7 +272,7 @@
 
 const PartRoot::PartList& PartRoot::getParts() {
   if (RuntimeEnabledFeatures::DOMPartsAPIMinimalEnabled()) {
-    DCHECK(cached_ordered_parts_.empty());
+    DCHECK(cached_ordered_parts_->empty());
     DCHECK(!cached_parts_list_dirty_);
     auto* parts = MakeGarbageCollected<PartRoot::PartList>();
     BuildPartsList(*this, parts, nullptr, nullptr);
@@ -280,23 +283,23 @@
   } else {
     // Remove invalid cached parts.
     bool remove_invalid = false;
-    for (auto& part : cached_ordered_parts_) {
+    for (auto& part : *cached_ordered_parts_) {
       if (!part->IsValid()) {
         remove_invalid = true;
         break;
       }
     }
     if (remove_invalid) {
-      PartRoot::PartList new_list;
-      for (auto& part : cached_ordered_parts_) {
+      HeapVector<Member<Part>, 20> new_list;
+      for (auto& part : *cached_ordered_parts_) {
         if (part->IsValid()) {
           new_list.push_back(part);
         }
       }
-      cached_ordered_parts_.swap(new_list);
+      cached_ordered_parts_->swap(new_list);
     }
   }
-  return cached_ordered_parts_;
+  return *cached_ordered_parts_;
 }
 
 // static
diff --git a/third_party/blink/renderer/core/dom/part_root.h b/third_party/blink/renderer/core/dom/part_root.h
index 70aa7f8..ad4a825 100644
--- a/third_party/blink/renderer/core/dom/part_root.h
+++ b/third_party/blink/renderer/core/dom/part_root.h
@@ -60,20 +60,20 @@
   }
 
   // PartRoot API
-  typedef HeapVector<Member<Node>, 20> PartNodeList;
-  typedef HeapVector<Member<Part>, 20> PartList;
+  using PartNodeList = GCedHeapVector<Member<Node>, 20>;
+  using PartList = GCedHeapVector<Member<Part>, 20>;
   const PartList& getParts();
   const PartNodeList& getNodePartNodes();
   const PartNodeList& getChildNodePartNodes();
   virtual ContainerNode* rootContainer() const = 0;
 
  protected:
-  PartRoot() = default;
+  PartRoot();
   virtual const PartRoot* GetParentPartRoot() const = 0;
 
  private:
   void RebuildPartsList();
-  PartList cached_ordered_parts_;
+  Member<PartList> cached_ordered_parts_;
   bool cached_parts_list_dirty_{false};
 };
 
diff --git a/third_party/blink/renderer/core/dom/tree_ordered_map.cc b/third_party/blink/renderer/core/dom/tree_ordered_map.cc
index 5e60fcbc..d58b2ced 100644
--- a/third_party/blink/renderer/core/dom/tree_ordered_map.cc
+++ b/third_party/blink/renderer/core/dom/tree_ordered_map.cc
@@ -37,6 +37,7 @@
 #include "third_party/blink/renderer/core/html/html_map_element.h"
 #include "third_party/blink/renderer/core/html/html_slot_element.h"
 #include "third_party/blink/renderer/core/html_names.h"
+#include "third_party/blink/renderer/platform/heap/disallow_new_wrapper.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 
 namespace blink {
@@ -154,12 +155,13 @@
     const AtomicString& key,
     const TreeScope& scope) const {
   DCHECK(key);
-  DEFINE_STATIC_LOCAL(Persistent<HeapVector<Member<Element>>>, empty_vector,
-                      (MakeGarbageCollected<HeapVector<Member<Element>>>()));
+  using Holder = DisallowNewWrapper<HeapVector<Member<Element>>>;
+  DEFINE_STATIC_LOCAL(Persistent<Holder>, empty_holder,
+                      (MakeGarbageCollected<Holder>()));
 
   Map::iterator it = map_.find(key);
   if (it == map_.end())
-    return *empty_vector;
+    return empty_holder->Value();
 
   Member<MapEntry>& entry = it->value;
   DCHECK(entry->count);
diff --git a/third_party/blink/renderer/core/dom/tree_scope.cc b/third_party/blink/renderer/core/dom/tree_scope.cc
index 0516297..1b7048b 100644
--- a/third_party/blink/renderer/core/dom/tree_scope.cc
+++ b/third_party/blink/renderer/core/dom/tree_scope.cc
@@ -120,12 +120,13 @@
 
 const HeapVector<Member<Element>>& TreeScope::GetAllElementsById(
     const AtomicString& element_id) const {
-  DEFINE_STATIC_LOCAL(Persistent<HeapVector<Member<Element>>>, empty_vector,
-                      (MakeGarbageCollected<HeapVector<Member<Element>>>()));
+  using Holder = DisallowNewWrapper<HeapVector<Member<Element>>>;
+  DEFINE_STATIC_LOCAL(Persistent<Holder>, empty_holder,
+                      (MakeGarbageCollected<Holder>()));
   if (element_id.empty())
-    return *empty_vector;
+    return empty_holder->Value();
   if (!elements_by_id_)
-    return *empty_vector;
+    return empty_holder->Value();
   return elements_by_id_->GetAllElementsById(element_id, *this);
 }
 
diff --git a/third_party/blink/renderer/core/editing/editing_style.cc b/third_party/blink/renderer/core/editing/editing_style.cc
index 4ef5b33..434075d 100644
--- a/third_party/blink/renderer/core/editing/editing_style.cc
+++ b/third_party/blink/renderer/core/editing/editing_style.cc
@@ -69,6 +69,7 @@
 #include "third_party/blink/renderer/core/style/computed_style.h"
 #include "third_party/blink/renderer/core/style_property_shorthand.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
+#include "third_party/blink/renderer/platform/heap/disallow_new_wrapper.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 
@@ -1120,10 +1121,11 @@
 
 static const HeapVector<Member<HTMLElementEquivalent>>&
 HtmlElementEquivalents() {
-  DEFINE_STATIC_LOCAL(
-      Persistent<HeapVector<Member<HTMLElementEquivalent>>>,
-      html_element_equivalents,
-      (MakeGarbageCollected<HeapVector<Member<HTMLElementEquivalent>>>()));
+  using Holder = DisallowNewWrapper<HeapVector<Member<HTMLElementEquivalent>>>;
+  DEFINE_STATIC_LOCAL(Persistent<Holder>, html_element_equivalents_holder,
+                      (MakeGarbageCollected<Holder>()));
+  HeapVector<Member<HTMLElementEquivalent>>* html_element_equivalents =
+      &html_element_equivalents_holder->Value();
   if (!html_element_equivalents->size()) {
     html_element_equivalents->push_back(
         MakeGarbageCollected<HTMLElementEquivalent>(
@@ -1184,10 +1186,12 @@
 
 static const HeapVector<Member<HTMLAttributeEquivalent>>&
 HtmlAttributeEquivalents() {
-  DEFINE_STATIC_LOCAL(
-      Persistent<HeapVector<Member<HTMLAttributeEquivalent>>>,
-      html_attribute_equivalents,
-      (MakeGarbageCollected<HeapVector<Member<HTMLAttributeEquivalent>>>()));
+  using Holder =
+      DisallowNewWrapper<HeapVector<Member<HTMLAttributeEquivalent>>>;
+  DEFINE_STATIC_LOCAL(Persistent<Holder>, html_attribute_equivalents_holder,
+                      (MakeGarbageCollected<Holder>()));
+  HeapVector<Member<HTMLAttributeEquivalent>>* html_attribute_equivalents =
+      &html_attribute_equivalents_holder->Value();
   if (!html_attribute_equivalents->size()) {
     // elementIsStyledSpanOrHTMLEquivalent depends on the fact each
     // HTMLAttriuteEquivalent matches exactly one attribute of exactly one
diff --git a/third_party/blink/renderer/core/editing/markers/overlapping_document_marker_list_editor_test.cc b/third_party/blink/renderer/core/editing/markers/overlapping_document_marker_list_editor_test.cc
index 483ead9..4dcab623 100644
--- a/third_party/blink/renderer/core/editing/markers/overlapping_document_marker_list_editor_test.cc
+++ b/third_party/blink/renderer/core/editing/markers/overlapping_document_marker_list_editor_test.cc
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/core/editing/markers/suggestion_marker.h"
 #include "third_party/blink/renderer/core/editing/markers/suggestion_marker_list_impl.h"
 #include "third_party/blink/renderer/core/editing/markers/suggestion_marker_properties.h"
+#include "third_party/blink/renderer/platform/heap/disallow_new_wrapper.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 
 namespace blink {
@@ -16,8 +17,7 @@
 class OverlappingDocumentMarkerListEditorTest : public testing::Test {
  public:
   OverlappingDocumentMarkerListEditorTest()
-      : marker_list_(
-            MakeGarbageCollected<HeapVector<Member<DocumentMarker>>>()) {}
+      : marker_list_(MakeGarbageCollected<Holder>()) {}
 
  protected:
   DocumentMarker* CreateMarker(unsigned start_offset, unsigned end_offset) {
@@ -25,68 +25,73 @@
                                                   SuggestionMarkerProperties());
   }
 
-  Persistent<HeapVector<Member<DocumentMarker>>> marker_list_;
+  HeapVector<Member<DocumentMarker>>* marker_list() const {
+    return &marker_list_->Value();
+  }
+
+  using Holder = DisallowNewWrapper<HeapVector<Member<DocumentMarker>>>;
+  Persistent<Holder> marker_list_;
 };
 
 TEST_F(OverlappingDocumentMarkerListEditorTest, AddMarkersOverlapping) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(40, 60));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 30));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(70, 100));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 20));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 40));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(45, 70));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(35, 65));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(90, 100));
 
-  EXPECT_EQ(8u, marker_list_->size());
-  EXPECT_EQ(0u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(30u, marker_list_->at(0)->EndOffset());
-  EXPECT_EQ(0u, marker_list_->at(1)->StartOffset());
-  EXPECT_EQ(20u, marker_list_->at(1)->EndOffset());
-  EXPECT_EQ(0u, marker_list_->at(2)->StartOffset());
-  EXPECT_EQ(40u, marker_list_->at(2)->EndOffset());
-  EXPECT_EQ(35u, marker_list_->at(3)->StartOffset());
-  EXPECT_EQ(65u, marker_list_->at(3)->EndOffset());
-  EXPECT_EQ(40u, marker_list_->at(4)->StartOffset());
-  EXPECT_EQ(60u, marker_list_->at(4)->EndOffset());
-  EXPECT_EQ(45u, marker_list_->at(5)->StartOffset());
-  EXPECT_EQ(70u, marker_list_->at(5)->EndOffset());
-  EXPECT_EQ(70u, marker_list_->at(6)->StartOffset());
-  EXPECT_EQ(100u, marker_list_->at(6)->EndOffset());
-  EXPECT_EQ(90u, marker_list_->at(7)->StartOffset());
-  EXPECT_EQ(100u, marker_list_->at(7)->EndOffset());
+  EXPECT_EQ(8u, marker_list()->size());
+  EXPECT_EQ(0u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(30u, marker_list()->at(0)->EndOffset());
+  EXPECT_EQ(0u, marker_list()->at(1)->StartOffset());
+  EXPECT_EQ(20u, marker_list()->at(1)->EndOffset());
+  EXPECT_EQ(0u, marker_list()->at(2)->StartOffset());
+  EXPECT_EQ(40u, marker_list()->at(2)->EndOffset());
+  EXPECT_EQ(35u, marker_list()->at(3)->StartOffset());
+  EXPECT_EQ(65u, marker_list()->at(3)->EndOffset());
+  EXPECT_EQ(40u, marker_list()->at(4)->StartOffset());
+  EXPECT_EQ(60u, marker_list()->at(4)->EndOffset());
+  EXPECT_EQ(45u, marker_list()->at(5)->StartOffset());
+  EXPECT_EQ(70u, marker_list()->at(5)->EndOffset());
+  EXPECT_EQ(70u, marker_list()->at(6)->StartOffset());
+  EXPECT_EQ(100u, marker_list()->at(6)->EndOffset());
+  EXPECT_EQ(90u, marker_list()->at(7)->StartOffset());
+  EXPECT_EQ(100u, marker_list()->at(7)->EndOffset());
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest, MoveMarkers) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(30, 40));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 30));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(10, 40));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 20));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 40));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(20, 40));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(20, 30));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 10));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(10, 30));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(10, 20));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(11, 21));
 
   DocumentMarkerList* dst_list =
@@ -94,21 +99,21 @@
   // The markers with start and end offset < 11 should be moved to dst_list.
   // Markers that start before 11 and end at 11 or later should be removed.
   // Markers that start at 11 or later should not be moved.
-  OverlappingDocumentMarkerListEditor::MoveMarkers(marker_list_, 11, dst_list);
+  OverlappingDocumentMarkerListEditor::MoveMarkers(marker_list(), 11, dst_list);
 
-  EXPECT_EQ(4u, marker_list_->size());
+  EXPECT_EQ(4u, marker_list()->size());
 
-  EXPECT_EQ(11u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(21u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(11u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(21u, marker_list()->at(0)->EndOffset());
 
-  EXPECT_EQ(20u, marker_list_->at(1)->StartOffset());
-  EXPECT_EQ(40u, marker_list_->at(1)->EndOffset());
+  EXPECT_EQ(20u, marker_list()->at(1)->StartOffset());
+  EXPECT_EQ(40u, marker_list()->at(1)->EndOffset());
 
-  EXPECT_EQ(20u, marker_list_->at(2)->StartOffset());
-  EXPECT_EQ(30u, marker_list_->at(2)->EndOffset());
+  EXPECT_EQ(20u, marker_list()->at(2)->StartOffset());
+  EXPECT_EQ(30u, marker_list()->at(2)->EndOffset());
 
-  EXPECT_EQ(30u, marker_list_->at(3)->StartOffset());
-  EXPECT_EQ(40u, marker_list_->at(3)->EndOffset());
+  EXPECT_EQ(30u, marker_list()->at(3)->StartOffset());
+  EXPECT_EQ(40u, marker_list()->at(3)->EndOffset());
 
   DocumentMarkerVector dst_list_markers = dst_list->GetMarkers();
 
@@ -120,356 +125,356 @@
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest, RemoveMarkersNestedOverlap) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 10));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(10, 30));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(15, 20));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(20, 30));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(30, 40));
 
-  EXPECT_TRUE(
-      OverlappingDocumentMarkerListEditor::RemoveMarkers(marker_list_, 20, 10));
+  EXPECT_TRUE(OverlappingDocumentMarkerListEditor::RemoveMarkers(marker_list(),
+                                                                 20, 10));
 
-  EXPECT_EQ(3u, marker_list_->size());
+  EXPECT_EQ(3u, marker_list()->size());
 
-  EXPECT_EQ(0u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(10u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(0u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(10u, marker_list()->at(0)->EndOffset());
 
-  EXPECT_EQ(15u, marker_list_->at(1)->StartOffset());
-  EXPECT_EQ(20u, marker_list_->at(1)->EndOffset());
+  EXPECT_EQ(15u, marker_list()->at(1)->StartOffset());
+  EXPECT_EQ(20u, marker_list()->at(1)->EndOffset());
 
-  EXPECT_EQ(30u, marker_list_->at(2)->StartOffset());
-  EXPECT_EQ(40u, marker_list_->at(2)->EndOffset());
+  EXPECT_EQ(30u, marker_list()->at(2)->StartOffset());
+  EXPECT_EQ(40u, marker_list()->at(2)->EndOffset());
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest,
        RemoveMarkersTouchingEndpoints) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(30, 40));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(40, 50));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(10, 20));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 10));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(20, 30));
 
-  EXPECT_TRUE(
-      OverlappingDocumentMarkerListEditor::RemoveMarkers(marker_list_, 20, 10));
+  EXPECT_TRUE(OverlappingDocumentMarkerListEditor::RemoveMarkers(marker_list(),
+                                                                 20, 10));
 
-  EXPECT_EQ(4u, marker_list_->size());
+  EXPECT_EQ(4u, marker_list()->size());
 
-  EXPECT_EQ(0u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(10u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(0u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(10u, marker_list()->at(0)->EndOffset());
 
-  EXPECT_EQ(10u, marker_list_->at(1)->StartOffset());
-  EXPECT_EQ(20u, marker_list_->at(1)->EndOffset());
+  EXPECT_EQ(10u, marker_list()->at(1)->StartOffset());
+  EXPECT_EQ(20u, marker_list()->at(1)->EndOffset());
 
-  EXPECT_EQ(30u, marker_list_->at(2)->StartOffset());
-  EXPECT_EQ(40u, marker_list_->at(2)->EndOffset());
+  EXPECT_EQ(30u, marker_list()->at(2)->StartOffset());
+  EXPECT_EQ(40u, marker_list()->at(2)->EndOffset());
 
-  EXPECT_EQ(40u, marker_list_->at(3)->StartOffset());
-  EXPECT_EQ(50u, marker_list_->at(3)->EndOffset());
+  EXPECT_EQ(40u, marker_list()->at(3)->StartOffset());
+  EXPECT_EQ(50u, marker_list()->at(3)->EndOffset());
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest,
        RemoveMarkersOneCharacterIntoInterior) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(30, 40));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(40, 50));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(10, 20));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 10));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(20, 30));
 
-  EXPECT_TRUE(
-      OverlappingDocumentMarkerListEditor::RemoveMarkers(marker_list_, 19, 12));
+  EXPECT_TRUE(OverlappingDocumentMarkerListEditor::RemoveMarkers(marker_list(),
+                                                                 19, 12));
 
-  EXPECT_EQ(2u, marker_list_->size());
+  EXPECT_EQ(2u, marker_list()->size());
 
-  EXPECT_EQ(0u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(10u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(0u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(10u, marker_list()->at(0)->EndOffset());
 
-  EXPECT_EQ(40u, marker_list_->at(1)->StartOffset());
-  EXPECT_EQ(50u, marker_list_->at(1)->EndOffset());
+  EXPECT_EQ(40u, marker_list()->at(1)->StartOffset());
+  EXPECT_EQ(50u, marker_list()->at(1)->EndOffset());
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest,
        ShiftMarkers_ReplaceStartOfMarker) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 10));
 
   // Replace with shorter text
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 0, 5, 4);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 0, 5, 4);
 
-  EXPECT_EQ(1u, marker_list_->size());
-  EXPECT_EQ(0u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(9u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(1u, marker_list()->size());
+  EXPECT_EQ(0u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(9u, marker_list()->at(0)->EndOffset());
 
   // Replace with longer text
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 0, 4, 5);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 0, 4, 5);
 
-  EXPECT_EQ(1u, marker_list_->size());
-  EXPECT_EQ(0u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(10u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(1u, marker_list()->size());
+  EXPECT_EQ(0u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(10u, marker_list()->at(0)->EndOffset());
 
   // Replace with text of same length
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 0, 5, 5);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 0, 5, 5);
 
-  EXPECT_EQ(1u, marker_list_->size());
-  EXPECT_EQ(0u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(10u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(1u, marker_list()->size());
+  EXPECT_EQ(0u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(10u, marker_list()->at(0)->EndOffset());
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest,
        ShiftMarkers_ReplaceContainsStartOfMarker) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(5, 15));
 
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 0, 10, 10);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 0, 10, 10);
 
-  EXPECT_EQ(1u, marker_list_->size());
-  EXPECT_EQ(10u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(15u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(1u, marker_list()->size());
+  EXPECT_EQ(10u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(15u, marker_list()->at(0)->EndOffset());
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest,
        ShiftMarkers_ReplaceEndOfMarker) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 10));
 
   // Replace with shorter text
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 5, 5, 4);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 5, 5, 4);
 
-  EXPECT_EQ(1u, marker_list_->size());
-  EXPECT_EQ(0u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(9u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(1u, marker_list()->size());
+  EXPECT_EQ(0u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(9u, marker_list()->at(0)->EndOffset());
 
   // Replace with longer text
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 5, 4, 5);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 5, 4, 5);
 
-  EXPECT_EQ(1u, marker_list_->size());
-  EXPECT_EQ(0u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(10u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(1u, marker_list()->size());
+  EXPECT_EQ(0u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(10u, marker_list()->at(0)->EndOffset());
 
   // Replace with text of same length
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 5, 5, 5);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 5, 5, 5);
 
-  EXPECT_EQ(1u, marker_list_->size());
-  EXPECT_EQ(0u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(10u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(1u, marker_list()->size());
+  EXPECT_EQ(0u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(10u, marker_list()->at(0)->EndOffset());
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest,
        ShiftMarkers_ReplaceContainsEndOfMarker) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 10));
 
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 5, 10, 10);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 5, 10, 10);
 
-  EXPECT_EQ(1u, marker_list_->size());
-  EXPECT_EQ(0u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(5u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(1u, marker_list()->size());
+  EXPECT_EQ(0u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(5u, marker_list()->at(0)->EndOffset());
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest,
        ShiftMarkers_ReplaceEntireMarker) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 10));
 
   // Replace with shorter text
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 0, 10, 9);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 0, 10, 9);
 
-  EXPECT_EQ(1u, marker_list_->size());
-  EXPECT_EQ(0u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(9u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(1u, marker_list()->size());
+  EXPECT_EQ(0u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(9u, marker_list()->at(0)->EndOffset());
 
   // Replace with longer text
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 0, 9, 10);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 0, 9, 10);
 
-  EXPECT_EQ(1u, marker_list_->size());
-  EXPECT_EQ(0u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(10u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(1u, marker_list()->size());
+  EXPECT_EQ(0u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(10u, marker_list()->at(0)->EndOffset());
 
   // Replace with text of same length
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 0, 10, 10);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 0, 10, 10);
 
-  EXPECT_EQ(1u, marker_list_->size());
-  EXPECT_EQ(0u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(10u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(1u, marker_list()->size());
+  EXPECT_EQ(0u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(10u, marker_list()->at(0)->EndOffset());
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest,
        ShiftMarkers_ReplaceTextWithMarkerAtBeginning) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 10));
 
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 0, 15, 15);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 0, 15, 15);
 
-  EXPECT_EQ(0u, marker_list_->size());
+  EXPECT_EQ(0u, marker_list()->size());
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest,
        ShiftMarkers_ReplaceTextWithMarkerAtEnd) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(5, 15));
 
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 0, 15, 15);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 0, 15, 15);
 
-  EXPECT_EQ(0u, marker_list_->size());
+  EXPECT_EQ(0u, marker_list()->size());
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest, ShiftMarkers_Deletions) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 5));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(5, 10));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(10, 15));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(15, 20));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(20, 25));
 
   // Delete range containing the end of the second marker, the entire third
   // marker, and the start of the fourth marker
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 8, 9, 0);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 8, 9, 0);
 
-  EXPECT_EQ(4u, marker_list_->size());
+  EXPECT_EQ(4u, marker_list()->size());
 
-  EXPECT_EQ(0u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(5u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(0u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(5u, marker_list()->at(0)->EndOffset());
 
-  EXPECT_EQ(5u, marker_list_->at(1)->StartOffset());
-  EXPECT_EQ(8u, marker_list_->at(1)->EndOffset());
+  EXPECT_EQ(5u, marker_list()->at(1)->StartOffset());
+  EXPECT_EQ(8u, marker_list()->at(1)->EndOffset());
 
-  EXPECT_EQ(8u, marker_list_->at(2)->StartOffset());
-  EXPECT_EQ(11u, marker_list_->at(2)->EndOffset());
+  EXPECT_EQ(8u, marker_list()->at(2)->StartOffset());
+  EXPECT_EQ(11u, marker_list()->at(2)->EndOffset());
 
-  EXPECT_EQ(11u, marker_list_->at(3)->StartOffset());
-  EXPECT_EQ(16u, marker_list_->at(3)->EndOffset());
+  EXPECT_EQ(11u, marker_list()->at(3)->StartOffset());
+  EXPECT_EQ(16u, marker_list()->at(3)->EndOffset());
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest,
        ShiftMarkers_DeletionWithinNested) {
   // A marker that overlaps the range with markers that do not overlap
   // nested within it.
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(5, 35));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(7, 10));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(15, 25));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(30, 32));
 
   // Delete range overlapping the outermost marker and containing the
   // third marker.
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 15, 10, 0);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 15, 10, 0);
 
-  EXPECT_EQ(3u, marker_list_->size());
+  EXPECT_EQ(3u, marker_list()->size());
 
-  EXPECT_EQ(5u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(25u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(5u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(25u, marker_list()->at(0)->EndOffset());
 
-  EXPECT_EQ(7u, marker_list_->at(1)->StartOffset());
-  EXPECT_EQ(10u, marker_list_->at(1)->EndOffset());
+  EXPECT_EQ(7u, marker_list()->at(1)->StartOffset());
+  EXPECT_EQ(10u, marker_list()->at(1)->EndOffset());
 
-  EXPECT_EQ(20u, marker_list_->at(2)->StartOffset());
-  EXPECT_EQ(22u, marker_list_->at(2)->EndOffset());
+  EXPECT_EQ(20u, marker_list()->at(2)->StartOffset());
+  EXPECT_EQ(22u, marker_list()->at(2)->EndOffset());
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest,
        ShiftMarkers_DeleteExactlyOnMarker) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 10));
 
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 0, 10, 0);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 0, 10, 0);
 
-  EXPECT_EQ(0u, marker_list_->size());
+  EXPECT_EQ(0u, marker_list()->size());
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest,
        ShiftMarkers_InsertInMarkerInterior) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 5));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(5, 10));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(10, 15));
 
   // insert in middle of second marker
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 7, 0, 5);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 7, 0, 5);
 
-  EXPECT_EQ(3u, marker_list_->size());
+  EXPECT_EQ(3u, marker_list()->size());
 
-  EXPECT_EQ(0u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(5u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(0u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(5u, marker_list()->at(0)->EndOffset());
 
-  EXPECT_EQ(5u, marker_list_->at(1)->StartOffset());
-  EXPECT_EQ(15u, marker_list_->at(1)->EndOffset());
+  EXPECT_EQ(5u, marker_list()->at(1)->StartOffset());
+  EXPECT_EQ(15u, marker_list()->at(1)->EndOffset());
 
-  EXPECT_EQ(15u, marker_list_->at(2)->StartOffset());
-  EXPECT_EQ(20u, marker_list_->at(2)->EndOffset());
+  EXPECT_EQ(15u, marker_list()->at(2)->StartOffset());
+  EXPECT_EQ(20u, marker_list()->at(2)->EndOffset());
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest,
        ShiftMarkers_InsertBetweenMarkers) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 5));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(5, 10));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(10, 15));
 
   // insert before second marker
-  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list_, 5, 0, 5);
+  OverlappingDocumentMarkerListEditor::ShiftMarkers(marker_list(), 5, 0, 5);
 
-  EXPECT_EQ(3u, marker_list_->size());
+  EXPECT_EQ(3u, marker_list()->size());
 
-  EXPECT_EQ(0u, marker_list_->at(0)->StartOffset());
-  EXPECT_EQ(5u, marker_list_->at(0)->EndOffset());
+  EXPECT_EQ(0u, marker_list()->at(0)->StartOffset());
+  EXPECT_EQ(5u, marker_list()->at(0)->EndOffset());
 
-  EXPECT_EQ(10u, marker_list_->at(1)->StartOffset());
-  EXPECT_EQ(15u, marker_list_->at(1)->EndOffset());
+  EXPECT_EQ(10u, marker_list()->at(1)->StartOffset());
+  EXPECT_EQ(15u, marker_list()->at(1)->EndOffset());
 
-  EXPECT_EQ(15u, marker_list_->at(2)->StartOffset());
-  EXPECT_EQ(20u, marker_list_->at(2)->EndOffset());
+  EXPECT_EQ(15u, marker_list()->at(2)->StartOffset());
+  EXPECT_EQ(20u, marker_list()->at(2)->EndOffset());
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest,
        MarkersIntersectingRange_RangeContainingNoMarkers) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 10));
 
   OverlappingDocumentMarkerListEditor::MarkerList markers_intersecting_range =
       OverlappingDocumentMarkerListEditor::MarkersIntersectingRange(
-          *marker_list_, 10, 15);
+          *marker_list(), 10, 15);
   EXPECT_EQ(0u, markers_intersecting_range.size());
 }
 
 TEST_F(OverlappingDocumentMarkerListEditorTest,
        MarkersIntersectingRange_TouchingStart) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 9));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(1, 9));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 10));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(1, 10));
 
   OverlappingDocumentMarkerListEditor::MarkerList markers_intersecting_range =
       OverlappingDocumentMarkerListEditor::MarkersIntersectingRange(
-          *marker_list_, 0, 1);
+          *marker_list(), 0, 1);
 
   EXPECT_EQ(2u, markers_intersecting_range.size());
 
@@ -482,18 +487,18 @@
 
 TEST_F(OverlappingDocumentMarkerListEditorTest,
        MarkersIntersectingRange_TouchingEnd) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 9));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(1, 9));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(0, 10));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(1, 10));
 
   OverlappingDocumentMarkerListEditor::MarkerList markers_intersecting_range =
       OverlappingDocumentMarkerListEditor::MarkersIntersectingRange(
-          *marker_list_, 9, 10);
+          *marker_list(), 9, 10);
 
   EXPECT_EQ(2u, markers_intersecting_range.size());
 
@@ -506,12 +511,12 @@
 
 TEST_F(OverlappingDocumentMarkerListEditorTest,
        MarkersIntersectingRange_CollapsedRange) {
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(5, 10));
 
   OverlappingDocumentMarkerListEditor::MarkerList markers_intersecting_range =
       OverlappingDocumentMarkerListEditor::MarkersIntersectingRange(
-          *marker_list_, 7, 7);
+          *marker_list(), 7, 7);
   EXPECT_EQ(1u, markers_intersecting_range.size());
 
   EXPECT_EQ(5u, markers_intersecting_range[0]->StartOffset());
@@ -522,18 +527,18 @@
        MarkersIntersectingRange_NestedMarkers) {
   // A marker that overlaps the range with markers that do not overlap
   // nested within it.
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(5, 35));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(7, 10));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(15, 25));
-  OverlappingDocumentMarkerListEditor::AddMarker(marker_list_,
+  OverlappingDocumentMarkerListEditor::AddMarker(marker_list(),
                                                  CreateMarker(30, 32));
 
   OverlappingDocumentMarkerListEditor::MarkerList markers_intersecting_range =
       OverlappingDocumentMarkerListEditor::MarkersIntersectingRange(
-          *marker_list_, 15, 25);
+          *marker_list(), 15, 25);
   EXPECT_EQ(2u, markers_intersecting_range.size());
 
   EXPECT_EQ(5u, markers_intersecting_range[0]->StartOffset());
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc
index f4a1ed7..de39a68 100644
--- a/third_party/blink/renderer/core/frame/local_dom_window.cc
+++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -1653,6 +1653,10 @@
   if (!page)
     return 0;
 
+  if (RuntimeEnabledFeatures::ReduceScreenSizeEnabled()) {
+    return 0;
+  }
+
   ChromeClient& chrome_client = page->GetChromeClient();
   if (page->GetSettings().GetReportScreenSizeInPhysicalPixelsQuirk()) {
     return static_cast<int>(
@@ -1671,6 +1675,10 @@
   if (!page)
     return 0;
 
+  if (RuntimeEnabledFeatures::ReduceScreenSizeEnabled()) {
+    return 0;
+  }
+
   ChromeClient& chrome_client = page->GetChromeClient();
   if (page->GetSettings().GetReportScreenSizeInPhysicalPixelsQuirk()) {
     return static_cast<int>(
diff --git a/third_party/blink/renderer/core/frame/screen.cc b/third_party/blink/renderer/core/frame/screen.cc
index 4399f5ed..77f7437 100644
--- a/third_party/blink/renderer/core/frame/screen.cc
+++ b/third_party/blink/renderer/core/frame/screen.cc
@@ -42,6 +42,14 @@
 
 namespace {
 
+bool ShouldReduceScreenSize(const LocalDOMWindow* window) {
+  CHECK(window);
+
+  // TODO(408932088): Take the current state of the window management permission
+  // (`mojom::blink::PermissionName::WINDOW_MANAGEMENT`) into account here.
+  return RuntimeEnabledFeatures::ReduceScreenSizeEnabled();
+}
+
 }  // namespace
 
 Screen::Screen(LocalDOMWindow* window, int64_t display_id)
@@ -100,12 +108,22 @@
 int Screen::height() const {
   if (!DomWindow())
     return 0;
+
+  if (ShouldReduceScreenSize(DomWindow())) {
+    return DomWindow()->innerHeight();
+  }
+
   return GetRect(/*available=*/false).height();
 }
 
 int Screen::width() const {
   if (!DomWindow())
     return 0;
+
+  if (ShouldReduceScreenSize(DomWindow())) {
+    return DomWindow()->innerWidth();
+  }
+
   return GetRect(/*available=*/false).width();
 }
 
@@ -122,24 +140,44 @@
 int Screen::availLeft() const {
   if (!DomWindow())
     return 0;
+
+  if (ShouldReduceScreenSize(DomWindow())) {
+    return 0;
+  }
+
   return GetRect(/*available=*/true).x();
 }
 
 int Screen::availTop() const {
   if (!DomWindow())
     return 0;
+
+  if (ShouldReduceScreenSize(DomWindow())) {
+    return 0;
+  }
+
   return GetRect(/*available=*/true).y();
 }
 
 int Screen::availHeight() const {
   if (!DomWindow())
     return 0;
+
+  if (ShouldReduceScreenSize(DomWindow())) {
+    return DomWindow()->innerHeight();
+  }
+
   return GetRect(/*available=*/true).height();
 }
 
 int Screen::availWidth() const {
   if (!DomWindow())
     return 0;
+
+  if (ShouldReduceScreenSize(DomWindow())) {
+    return DomWindow()->innerWidth();
+  }
+
   return GetRect(/*available=*/true).width();
 }
 
diff --git a/third_party/blink/renderer/core/frame/use_counter_impl.cc b/third_party/blink/renderer/core/frame/use_counter_impl.cc
index d17c944..d0aad4b8 100644
--- a/third_party/blink/renderer/core/frame/use_counter_impl.cc
+++ b/third_party/blink/renderer/core/frame/use_counter_impl.cc
@@ -148,6 +148,8 @@
     context_ = kFileContext;
   } else if (url.ProtocolIsInHTTPFamily()) {
     context_ = kDefaultContext;
+  } else if (url.IsAboutBlankURL() || url.IsAboutSrcdocURL()) {
+    context_ = kAboutBlankOrSrcdoc;
   } else {
     // UseCounter is disabled for all other URL schemes.
     context_ = kDisabledContext;
@@ -281,6 +283,10 @@
     case kFileContext:
       UMA_HISTOGRAM_ENUMERATION("Blink.UseCounter.File.Features", feature);
       return;
+    case kAboutBlankOrSrcdoc:
+      UMA_HISTOGRAM_ENUMERATION("Blink.UseCounter.AboutBlankOrSrcdoc.Features",
+                                feature);
+      return;
     case kDisabledContext:
       NOTREACHED();
   }
diff --git a/third_party/blink/renderer/core/frame/use_counter_impl.h b/third_party/blink/renderer/core/frame/use_counter_impl.h
index 113423ef..16861e7 100644
--- a/third_party/blink/renderer/core/frame/use_counter_impl.h
+++ b/third_party/blink/renderer/core/frame/use_counter_impl.h
@@ -77,6 +77,9 @@
     kExtensionContext,
     // Context for file:// URLs.
     kFileContext,
+    // Counters for about:blank and about:srcdoc pages, which can host
+    // non-trivial html content.
+    kAboutBlankOrSrcdoc,
     // Context when counters should be disabled (eg, internal pages such as
     // about, devtools, etc).
     kDisabledContext
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
index b06f3a7..ca6c4496 100644
--- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
+++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
@@ -2129,7 +2129,21 @@
       return nullptr;
     }
 
-    if (resource_provider && resource_provider->IsValid()) {
+    if (resource_provider) {
+      if (!resource_provider->IsValid()) {
+        // The canvas context is not lost but the provider is invalid. This
+        // happens if the GPU process dies in the middle of a render task. The
+        // canvas is notified of GPU context losses via the
+        // `NotifyGpuContextLost` callback and restoration happens in
+        // `TryRestoreContextEvent`. Both callbacks are executed in their own
+        // separate task. If the GPU context goes invalid in the middle of a
+        // render task, the canvas won't immediately know about it and canvas
+        // APIs will continue using the provider that is now invalid. We can
+        // early return here, trying to re-create the provider right away would
+        // just fail. We need to let `TryRestoreContextEvent` wait for the GPU
+        // process to up again.
+        return nullptr;
+      }
       return resource_provider;
     }
 
@@ -2179,16 +2193,6 @@
   RasterModeHint adjusted_hint = want_acceleration ? RasterModeHint::kPreferGPU
                                                    : RasterModeHint::kPreferCPU;
 
-  if (CcLayer() && adjusted_hint == RasterModeHint::kPreferGPU &&
-      !hibernation_handler.IsHibernating()) {
-    // In this case re-creation will happen through
-    // CanvasRenderingContext2D::Restore(). Restore() attempts to recreate the
-    // ResourceProvider at most four times in two seconds before it clears all
-    // state (including the CC layer) by calling DiscardResourceProvider() on
-    // this object.
-    return nullptr;
-  }
-
   // We call GetOrCreateCanvasResourceProviderImpl directly here to prevent a
   // circular callstack.
   CanvasResourceProvider* resource_provider =
diff --git a/third_party/blink/renderer/core/html/custom/element_internals.cc b/third_party/blink/renderer/core/html/custom/element_internals.cc
index 49be5fb..5a64a96 100644
--- a/third_party/blink/renderer/core/html/custom/element_internals.cc
+++ b/third_party/blink/renderer/core/html/custom/element_internals.cc
@@ -369,7 +369,7 @@
 
 void ElementInternals::SetElementArrayAttribute(
     const QualifiedName& attribute,
-    const HeapVector<Member<Element>>* given_elements) {
+    const GCedHeapVector<Member<Element>>* given_elements) {
   if (!given_elements) {
     explicitly_set_attr_elements_map_.erase(attribute);
     setAttribute(attribute, g_empty_atom);
@@ -377,7 +377,8 @@
   }
 
   FrozenArray<Element>* frozen_elements =
-      MakeGarbageCollected<FrozenArray<Element>>((std::move(*given_elements)));
+      MakeGarbageCollected<FrozenArray<Element>>(
+          HeapVector<Member<Element>>(std::move(*given_elements)));
   explicitly_set_attr_elements_map_.Set(attribute, frozen_elements);
 
   // Ensure that the appropriate updates are made in the AXObjectCache, and that
@@ -398,7 +399,7 @@
   return GetElementArrayAttribute(html_names::kAriaControlsAttr);
 }
 void ElementInternals::setAriaControlsElements(
-    HeapVector<Member<Element>>* given_elements) {
+    GCedHeapVector<Member<Element>>* given_elements) {
   SetElementArrayAttribute(html_names::kAriaControlsAttr, given_elements);
 }
 
@@ -406,7 +407,7 @@
   return GetElementArrayAttribute(html_names::kAriaDescribedbyAttr);
 }
 void ElementInternals::setAriaDescribedByElements(
-    HeapVector<Member<Element>>* given_elements) {
+    GCedHeapVector<Member<Element>>* given_elements) {
   SetElementArrayAttribute(html_names::kAriaDescribedbyAttr, given_elements);
 }
 
@@ -414,7 +415,7 @@
   return GetElementArrayAttribute(html_names::kAriaDetailsAttr);
 }
 void ElementInternals::setAriaDetailsElements(
-    HeapVector<Member<Element>>* given_elements) {
+    GCedHeapVector<Member<Element>>* given_elements) {
   SetElementArrayAttribute(html_names::kAriaDetailsAttr, given_elements);
 }
 
@@ -422,7 +423,7 @@
   return GetElementArrayAttribute(html_names::kAriaErrormessageAttr);
 }
 void ElementInternals::setAriaErrorMessageElements(
-    HeapVector<Member<Element>>* given_elements) {
+    GCedHeapVector<Member<Element>>* given_elements) {
   SetElementArrayAttribute(html_names::kAriaErrormessageAttr, given_elements);
 }
 
@@ -430,7 +431,7 @@
   return GetElementArrayAttribute(html_names::kAriaFlowtoAttr);
 }
 void ElementInternals::setAriaFlowToElements(
-    HeapVector<Member<Element>>* given_elements) {
+    GCedHeapVector<Member<Element>>* given_elements) {
   SetElementArrayAttribute(html_names::kAriaFlowtoAttr, given_elements);
 }
 
@@ -438,7 +439,7 @@
   return GetElementArrayAttribute(html_names::kAriaLabelledbyAttr);
 }
 void ElementInternals::setAriaLabelledByElements(
-    HeapVector<Member<Element>>* given_elements) {
+    GCedHeapVector<Member<Element>>* given_elements) {
   SetElementArrayAttribute(html_names::kAriaLabelledbyAttr, given_elements);
 }
 
@@ -446,7 +447,7 @@
   return GetElementArrayAttribute(html_names::kAriaOwnsAttr);
 }
 void ElementInternals::setAriaOwnsElements(
-    HeapVector<Member<Element>>* given_elements) {
+    GCedHeapVector<Member<Element>>* given_elements) {
   SetElementArrayAttribute(html_names::kAriaOwnsAttr, given_elements);
 }
 
diff --git a/third_party/blink/renderer/core/html/custom/element_internals.h b/third_party/blink/renderer/core/html/custom/element_internals.h
index 58510b5..5ea16b0 100644
--- a/third_party/blink/renderer/core/html/custom/element_internals.h
+++ b/third_party/blink/renderer/core/html/custom/element_internals.h
@@ -76,24 +76,27 @@
   Element* GetElementAttribute(const QualifiedName& attribute) const;
   void SetElementArrayAttribute(
       const QualifiedName& attribute,
-      const HeapVector<Member<Element>>* given_elements);
+      const GCedHeapVector<Member<Element>>* given_elements);
   const FrozenArray<Element>* GetElementArrayAttribute(
       const QualifiedName& attribute) const;
 
   const FrozenArray<Element>* ariaControlsElements() const;
-  void setAriaControlsElements(HeapVector<Member<Element>>* given_elements);
+  void setAriaControlsElements(GCedHeapVector<Member<Element>>* given_elements);
   const FrozenArray<Element>* ariaDescribedByElements() const;
-  void setAriaDescribedByElements(HeapVector<Member<Element>>* given_elements);
+  void setAriaDescribedByElements(
+      GCedHeapVector<Member<Element>>* given_elements);
   const FrozenArray<Element>* ariaDetailsElements() const;
-  void setAriaDetailsElements(HeapVector<Member<Element>>* given_elements);
+  void setAriaDetailsElements(GCedHeapVector<Member<Element>>* given_elements);
   const FrozenArray<Element>* ariaErrorMessageElements() const;
-  void setAriaErrorMessageElements(HeapVector<Member<Element>>* given_elements);
+  void setAriaErrorMessageElements(
+      GCedHeapVector<Member<Element>>* given_elements);
   const FrozenArray<Element>* ariaFlowToElements() const;
-  void setAriaFlowToElements(HeapVector<Member<Element>>* given_elements);
+  void setAriaFlowToElements(GCedHeapVector<Member<Element>>* given_elements);
   const FrozenArray<Element>* ariaLabelledByElements() const;
-  void setAriaLabelledByElements(HeapVector<Member<Element>>* given_elements);
+  void setAriaLabelledByElements(
+      GCedHeapVector<Member<Element>>* given_elements);
   const FrozenArray<Element>* ariaOwnsElements() const;
-  void setAriaOwnsElements(HeapVector<Member<Element>>* given_elements);
+  void setAriaOwnsElements(GCedHeapVector<Member<Element>>* given_elements);
 
   bool HasAttribute(const QualifiedName& attribute) const;
   bool HasAnyAttribute() const { return !accessibility_semantics_map_.empty(); }
diff --git a/third_party/blink/renderer/core/html/html_permission_element.cc b/third_party/blink/renderer/core/html/html_permission_element.cc
index fe457dd5..e04e0e0c 100644
--- a/third_party/blink/renderer/core/html/html_permission_element.cc
+++ b/third_party/blink/renderer/core/html/html_permission_element.cc
@@ -857,7 +857,7 @@
       IsBorderSufficientlyDistinctFromBackgroundColor(builder.CloneStyle());
 
   if (unlimited_width_allowed) {
-    if (builder.PaddingRight().IsSpecified() &&
+    if (builder.PaddingRight().HasOnlyFixedAndPercent() &&
         !builder.PaddingRight().IsZero() &&
         builder.PaddingLeft() != builder.PaddingRight()) {
       AddConsoleError(
@@ -874,9 +874,10 @@
     // If width is set to auto and there is left padding specified, we will
     // respect the padding (up to a certain maximum), otherwise the padding has
     // no effect. We treat height and top/bottom padding similarly.
-    if (builder.Width().IsAuto() && builder.PaddingLeft().IsSpecified() &&
+    if (builder.Width().IsAuto() &&
+        builder.PaddingLeft().HasOnlyFixedAndPercent() &&
         !builder.PaddingLeft().IsZero()) {
-      if (builder.PaddingRight().IsSpecified() &&
+      if (builder.PaddingRight().HasOnlyFixedAndPercent() &&
           !builder.PaddingRight().IsZero() &&
           builder.PaddingLeft() != builder.PaddingRight()) {
         AddConsoleError(
@@ -898,9 +899,10 @@
     }
   }
 
-  if (builder.Height().IsAuto() && builder.PaddingTop().IsSpecified() &&
+  if (builder.Height().IsAuto() &&
+      builder.PaddingTop().HasOnlyFixedAndPercent() &&
       !builder.PaddingTop().IsZero()) {
-    if (builder.PaddingBottom().IsSpecified() &&
+    if (builder.PaddingBottom().HasOnlyFixedAndPercent() &&
         !builder.PaddingBottom().IsZero() &&
         builder.PaddingTop() != builder.PaddingBottom()) {
       AddConsoleError(
diff --git a/third_party/blink/renderer/core/layout/layout_custom_scrollbar_part.cc b/third_party/blink/renderer/core/layout/layout_custom_scrollbar_part.cc
index b7af01d2..c0c56bb 100644
--- a/third_party/blink/renderer/core/layout/layout_custom_scrollbar_part.cc
+++ b/third_party/blink/renderer/core/layout/layout_custom_scrollbar_part.cc
@@ -112,7 +112,7 @@
                                            int container_size) const {
   NOT_DESTROYED();
   if (!length.HasAutoOrContentOrIntrinsic() && !length.HasStretch()) {
-    CHECK(length.IsSpecified());
+    CHECK(length.HasOnlyFixedAndPercent());
     return MinimumValueForLength(length, LayoutUnit(container_size)).ToInt();
   }
   return CustomScrollbarTheme::GetCustomScrollbarTheme()->ScrollbarThickness(
diff --git a/third_party/blink/renderer/core/layout/layout_image.cc b/third_party/blink/renderer/core/layout/layout_image.cc
index 8e14edb6..ca4446e 100644
--- a/third_party/blink/renderer/core/layout/layout_image.cc
+++ b/third_party/blink/renderer/core/layout/layout_image.cc
@@ -374,8 +374,8 @@
 bool LayoutImage::IsUnsizedImage() const {
   NOT_DESTROYED();
   const ComputedStyle& style = this->StyleRef();
-  const auto explicit_width = style.LogicalWidth().IsSpecified();
-  const auto explicit_height = style.LogicalHeight().IsSpecified();
+  const auto explicit_width = style.LogicalWidth().HasOnlyFixedAndPercent();
+  const auto explicit_height = style.LogicalHeight().HasOnlyFixedAndPercent();
   bool has_aspect_ratio =
       style.AspectRatio().GetType() == EAspectRatioType::kRatio;
   const bool is_fixed_size =
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.cc b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
index fc97035..6ebd09d 100644
--- a/third_party/blink/renderer/core/loader/frame_fetch_context.cc
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
@@ -843,22 +843,16 @@
     probe::SetDevToolsIds(Probe(), request, options.initiator_info);
   }
 
-  if (!RuntimeEnabledFeatures::PreloadLinkRelDataUrlsEnabled()) {
-    CHECK(!has_preloaded_response_candidate);
-    // CSP may change the url, if Upgrade-Insecure-Request is enforced for
-    // mixed content.
-    ModifyRequestForMixedContentUpgrade(request);
-    if (!request.Url().IsValid()) {
-      return;
-    }
+  // CSP may change the url, if Upgrade-Insecure-Request is enforced for
+  // mixed content.
+  ModifyRequestForMixedContentUpgrade(request);
+  if (!request.Url().IsValid()) {
+    return;
   }
-  const bool has_inspector_agents =
-      CoreProbeSink::HasAgentsGlobal(CoreProbeSink::kInspectorEmulationAgent |
-                                     CoreProbeSink::kInspectorNetworkAgent);
-  if (!has_preloaded_response_candidate || has_inspector_agents) {
-    SetFirstPartyCookie(request);
-  }
-  if (has_inspector_agents) {
+
+  SetFirstPartyCookie(request);
+  if (CoreProbeSink::HasAgentsGlobal(CoreProbeSink::kInspectorEmulationAgent |
+                                     CoreProbeSink::kInspectorNetworkAgent)) {
     request.SetRequiresUpgradeForLoader();
   }
   if (document_loader_->ForceFetchCacheMode()) {
diff --git a/third_party/blink/renderer/core/loader/worker_fetch_context.cc b/third_party/blink/renderer/core/loader/worker_fetch_context.cc
index b92111a..b1112b6 100644
--- a/third_party/blink/renderer/core/loader/worker_fetch_context.cc
+++ b/third_party/blink/renderer/core/loader/worker_fetch_context.cc
@@ -250,9 +250,7 @@
     ResourceRequest& request,
     FetchParameters::HasPreloadedResponseCandidate
         has_preloaded_response_candidate) {
-  if (!RuntimeEnabledFeatures::PreloadLinkRelDataUrlsEnabled()) {
-    ModifyRequestForMixedContentUpgrade(request);
-  }
+  ModifyRequestForMixedContentUpgrade(request);
   request.SetTopFrameOrigin(GetTopFrameOrigin());
 }
 
diff --git a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc
index b95ec43..0d60b50 100644
--- a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc
+++ b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.cc
@@ -539,8 +539,21 @@
     return nullptr;
   }
 
-  if (ResourceProvider()) {
-    return ResourceProvider();
+  if (CanvasResourceProvider* provider = ResourceProvider()) {
+    if (!provider->IsValid()) {
+      // The canvas context is not lost but the provider is invalid. This
+      // happens if the GPU process dies in the middle of a render task. The
+      // canvas is notified of GPU context losses via the `NotifyGpuContextLost`
+      // callback and restoration happens in `TryRestoreContextEvent`. Both
+      // callbacks are executed in their own separate task. If the GPU context
+      // goes invalid in the middle of a render task, the canvas won't
+      // immediately know about it and canvas APIs will continue using the
+      // provider that is now invalid. We can early return here, trying to
+      // re-create the provider right away would just fail. We need to let
+      // `TryRestoreContextEvent` wait for the GPU process to up again.
+      return nullptr;
+    }
+    return provider;
   }
 
   if (!IsValidImageSize(Size()) && !Size().IsEmpty()) {
diff --git a/third_party/blink/renderer/core/style/grid_track_size.h b/third_party/blink/renderer/core/style/grid_track_size.h
index 6f170c25..c1e6b84 100644
--- a/third_party/blink/renderer/core/style/grid_track_size.h
+++ b/third_party/blink/renderer/core/style/grid_track_size.h
@@ -134,13 +134,13 @@
 
   void CacheMinMaxTrackBreadthTypes() {
     min_track_breadth_is_auto_ = min_track_breadth_.IsAuto();
-    min_track_breadth_is_fixed_ = min_track_breadth_.IsSpecified();
+    min_track_breadth_is_fixed_ = min_track_breadth_.HasOnlyFixedAndPercent();
     min_track_breadth_is_flex_ = min_track_breadth_.IsFlex();
     min_track_breadth_is_max_content_ = min_track_breadth_.IsMaxContent();
     min_track_breadth_is_min_content_ = min_track_breadth_.IsMinContent();
 
     max_track_breadth_is_auto_ = max_track_breadth_.IsAuto();
-    max_track_breadth_is_fixed_ = max_track_breadth_.IsSpecified();
+    max_track_breadth_is_fixed_ = max_track_breadth_.HasOnlyFixedAndPercent();
     max_track_breadth_is_flex_ = max_track_breadth_.IsFlex();
     max_track_breadth_is_max_content_ = max_track_breadth_.IsMaxContent();
     max_track_breadth_is_min_content_ = max_track_breadth_.IsMinContent();
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_path_test.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_path_test.cc
index 30336213..e8e4a4b 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_path_test.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_path_test.cc
@@ -14,7 +14,6 @@
 #include "third_party/blink/renderer/platform/heap/member.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/testing/task_environment.h"
-#include "third_party/skia/include/core/SkPath.h"
 #include "ui/gfx/geometry/skia_conversions.h"
 
 // GoogleTest macros trigger a bug in IWYU:
@@ -76,10 +75,10 @@
   path->lineTo(end.x(), end.y());
   EXPECT_TRUE(path->IsLine());
 
-  SkPath sk_path;
-  sk_path.moveTo(gfx::PointFToSkPoint(start));
-  sk_path.lineTo(gfx::PointFToSkPoint(end));
-  Path path_from_sk_path(sk_path);
+  PathBuilder path_builder;
+  path_builder.MoveTo(start);
+  path_builder.LineTo(end);
+  Path path_from_sk_path(path_builder.Finalize());
 
   EXPECT_EQ(path->BoundingRect(), path_from_sk_path.BoundingRect());
 }
@@ -123,10 +122,10 @@
   const gfx::PointF next(2, 3);
   path->moveTo(next.x(), next.y());
 
-  SkPath sk_path;
-  sk_path.moveTo(gfx::PointFToSkPoint(start));
-  sk_path.moveTo(gfx::PointFToSkPoint(next));
-  Path path_from_sk_path(sk_path);
+  PathBuilder path_builder;
+  path_builder.MoveTo(start);
+  path_builder.MoveTo(next);
+  Path path_from_sk_path(path_builder.Finalize());
 
   EXPECT_EQ(path->GetPath(), path_from_sk_path);
 }
diff --git a/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc b/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc
index 05bd35e..0142cdb 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc
+++ b/third_party/blink/renderer/modules/credentialmanagement/authentication_credentials_container.cc
@@ -1217,7 +1217,7 @@
           "to the credential manager.");
     case AuthenticatorStatus::IMMEDIATE_NOT_FOUND:
       return MakeGarbageCollected<DOMException>(
-          DOMExceptionCode::kNotFoundError,
+          DOMExceptionCode::kNotAllowedError,
           "No immediate discoverable credentials are found.");
   }
   return nullptr;
diff --git a/third_party/blink/renderer/modules/csspaint/css_paint_definition.cc b/third_party/blink/renderer/modules/csspaint/css_paint_definition.cc
index 96e52ce..2fab4dd 100644
--- a/third_party/blink/renderer/modules/csspaint/css_paint_definition.cc
+++ b/third_party/blink/renderer/modules/csspaint/css_paint_definition.cc
@@ -120,7 +120,7 @@
   // invalid image.
   if (paint_
           ->Invoke(instance_.Get(isolate), rendering_context, paint_size,
-                   style_map, *paint_arguments)
+                   style_map, CSSStyleValueVector(std::move(*paint_arguments)))
           .IsNothing()) {
     return PaintRecord();
   }
diff --git a/third_party/blink/renderer/modules/direct_sockets/socket.cc b/third_party/blink/renderer/modules/direct_sockets/socket.cc
index 5cc55ed..e1420d13 100644
--- a/third_party/blink/renderer/modules/direct_sockets/socket.cc
+++ b/third_party/blink/renderer/modules/direct_sockets/socket.cc
@@ -91,6 +91,8 @@
 
   ExecutionContext* execution_context = ExecutionContext::From(script_state);
   if (execution_context->IsWindow()) {
+    // TODO(crbug.com/407883159): Replace IsFeatureEnabled() with
+    // CrossOriginIsolatedCapability() once Chrome Apps are deprecated.
     if (!execution_context->IsIsolatedContext() ||
         !execution_context->IsFeatureEnabled(
             network::mojom::PermissionsPolicyFeature::kCrossOriginIsolated)) {
@@ -108,8 +110,11 @@
     }
     return true;
   } else if (execution_context->IsWorkerGlobalScope()) {
-    if (!execution_context->CrossOriginIsolatedCapability() ||
-        !execution_context->IsIsolatedContext()) {
+    // TODO(crbug.com/407883159): Replace IsFeatureEnabled() with
+    // CrossOriginIsolatedCapability() once Chrome Apps are deprecated.
+    if (!execution_context->IsIsolatedContext() ||
+        !execution_context->IsFeatureEnabled(
+            network::mojom::PermissionsPolicyFeature::kCrossOriginIsolated)) {
       exception_state.ThrowDOMException(
           DOMExceptionCode::kNotAllowedError,
           "Frame is not sufficiently isolated to use Direct Sockets.");
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
index acb05ac..6f3f25c5 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -6248,49 +6248,6 @@
     video_renderer = local_video_renderer.get();
   }
 
-  // Format of source VideoFrame may be 16-bit format, e.g. Y16
-  // format. glCopyTextureCHROMIUM requires the source texture to be in
-  // 8-bit format. Converting 16-bits formatted source texture to 8-bits
-  // formatted texture will cause precision lost. So, uploading such video
-  // texture to half float or float texture can not use GPU-GPU path.
-  if (use_copy_texture_chromium) {
-    DCHECK(Extensions3DUtil::CanUseCopyTextureCHROMIUM(params.target));
-    DCHECK_EQ(params.xoffset, 0);
-    DCHECK_EQ(params.yoffset, 0);
-    DCHECK_EQ(params.zoffset, 0);
-
-    viz::RasterContextProvider* raster_context_provider = nullptr;
-    if (auto wrapper = SharedGpuContext::ContextProviderWrapper()) {
-      raster_context_provider =
-          wrapper->ContextProvider().RasterContextProvider();
-    }
-
-    // Go through the fast path doing a GPU-GPU textures copy without a readback
-    // to system memory if possible.  Otherwise, it will fall back to the normal
-    // SW path.
-
-    if (media_video_frame->HasSharedImage() &&
-        video_renderer->CopyVideoFrameTexturesToGLTexture(
-            raster_context_provider, ContextGL(), media_video_frame,
-            params.target, texture->Object(), adjusted_internalformat,
-            params.format, params.type, params.level,
-            params.GetDestinationAlphaType(), params.GetDestinationOrigin())) {
-      return;
-    }
-
-    // For certain video frame formats (e.g. I420/YUV), if they start on the CPU
-    // (e.g. video camera frames): upload them to the GPU, do a GPU decode, and
-    // then copy into the target texture.
-    if (!media_video_frame->HasSharedImage() &&
-        video_renderer->CopyVideoFrameYUVDataToGLTexture(
-            raster_context_provider, ContextGL(), media_video_frame,
-            params.target, texture->Object(), adjusted_internalformat,
-            params.format, params.type, params.level,
-            params.GetDestinationAlphaType(), params.GetDestinationOrigin())) {
-      return;
-    }
-  }
-
   if (source_image_rect_is_default && media_video_frame->IsMappable() &&
       media_video_frame->format() == media::PIXEL_FORMAT_Y16 &&
       unpack_color_space_is_srgb) {
@@ -6320,6 +6277,47 @@
       return;
     }
   }
+  // Format of source VideoFrame may be 16-bit format, e.g. Y16
+  // format. glCopyTextureCHROMIUM requires the source texture to be in
+  // 8-bit format. Converting 16-bits formatted source texture to 8-bits
+  // formatted texture will cause precision lost. So, uploading such video
+  // texture to half float or float texture can not use GPU-GPU path.
+  else if (use_copy_texture_chromium) {
+    DCHECK(Extensions3DUtil::CanUseCopyTextureCHROMIUM(params.target));
+    DCHECK_EQ(params.xoffset, 0);
+    DCHECK_EQ(params.yoffset, 0);
+    DCHECK_EQ(params.zoffset, 0);
+
+    viz::RasterContextProvider* raster_context_provider = nullptr;
+    if (auto wrapper = SharedGpuContext::ContextProviderWrapper()) {
+      raster_context_provider =
+          wrapper->ContextProvider().RasterContextProvider();
+    }
+
+    // For certain video frame formats (e.g. I420/YUV), if they start on the CPU
+    // (e.g. video camera frames): upload them to the GPU, do a GPU decode, and
+    // then copy into the target texture.
+    if (!media_video_frame->HasSharedImage() &&
+        video_renderer->CopyVideoFrameYUVDataToGLTexture(
+            raster_context_provider, ContextGL(), media_video_frame,
+            params.target, texture->Object(), adjusted_internalformat,
+            params.format, params.type, params.level,
+            params.GetDestinationAlphaType(), params.GetDestinationOrigin())) {
+      return;
+    }
+
+    // Go through the fast path doing a GPU-GPU textures copy without a readback
+    // to system memory if possible.  Otherwise, it will fall back to the normal
+    // SW path.
+    if (media_video_frame->HasSharedImage() &&
+        video_renderer->CopyVideoFrameTexturesToGLTexture(
+            raster_context_provider, ContextGL(), media_video_frame,
+            params.target, texture->Object(), adjusted_internalformat,
+            params.format, params.type, params.level,
+            params.GetDestinationAlphaType(), params.GetDestinationOrigin())) {
+      return;
+    }
+  }
 
   // TODO(crbug.com/1175907): Double check that the premultiply alpha settings
   // are all correct below. When we go through the CanvasResourceProvider for
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 2cf7fac..9177c89c 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
@@ -842,8 +842,10 @@
     return false;
   }
 
+  gpu::SyncToken sync_token;
   auto dst_client_si =
-      resource_provider->GetBackingClientSharedImageForOverwrite();
+      resource_provider->GetBackingClientSharedImageForExternalWrite(
+          &sync_token, gpu::SharedImageUsageSet());
   if (!dst_client_si) {
     return false;
   }
@@ -862,8 +864,6 @@
   DCHECK(reservation.texture);
   wgpu::Texture reserved_texture = wgpu::Texture::Acquire(reservation.texture);
 
-  gpu::SyncToken sync_token;
-  ri->GenUnverifiedSyncTokenCHROMIUM(sync_token.GetData());
   webgpu->WaitSyncTokenCHROMIUM(sync_token.GetConstData());
   wgpu::TextureUsage usage =
       wgpu::TextureUsage::CopyDst | wgpu::TextureUsage::RenderAttachment;
diff --git a/third_party/blink/renderer/platform/geometry/length.cc b/third_party/blink/renderer/platform/geometry/length.cc
index 2ef1f2d..7d4e04d 100644
--- a/third_party/blink/renderer/platform/geometry/length.cc
+++ b/third_party/blink/renderer/platform/geometry/length.cc
@@ -125,8 +125,8 @@
 Length Length::BlendMixedTypes(const Length& from,
                                double progress,
                                ValueRange range) const {
-  DCHECK(from.IsSpecified());
-  DCHECK(IsSpecified());
+  DCHECK(from.CanConvertToCalculation());
+  DCHECK(CanConvertToCalculation());
   return Length(
       AsCalculationValue()->Blend(*from.AsCalculationValue(), progress, range));
 }
@@ -168,12 +168,12 @@
 Length Length::SubtractFromOneHundredPercent() const {
   if (IsPercent())
     return Length::Percent(100 - Percent());
-  DCHECK(IsSpecified());
+  DCHECK(CanConvertToCalculation());
   return Length(AsCalculationValue()->SubtractFromOneHundredPercent());
 }
 
 Length Length::Add(const Length& other) const {
-  CHECK(IsSpecified());
+  CHECK(CanConvertToCalculation());
   if (IsFixed() && other.IsFixed()) {
     return Length::Fixed(Pixels() + other.Pixels());
   }
diff --git a/third_party/blink/renderer/platform/geometry/length.h b/third_party/blink/renderer/platform/geometry/length.h
index ab1bf2f..8abdc3c 100644
--- a/third_party/blink/renderer/platform/geometry/length.h
+++ b/third_party/blink/renderer/platform/geometry/length.h
@@ -296,13 +296,17 @@
   bool HasMinIntrinsic() const { return IsMinIntrinsic(); }
   bool HasFitContent() const;
 
-  // IsSpecified() is true for any Lengths that are a fixed length, a percent,
-  // or a calc() expression.  Note that this *includes* calc-size()
+  // CanConvertToCalculation() is true for any Lengths that are a fixed length,
+  // a percent, or a calc() expression.  Note that this *includes* calc-size()
   // expressions that contain sizing keywords, which may not be what you want.
-  // You may want HasOnlyFixedAndPercent instead.
-  // TODO(https://crbug.com/406530491): Audit remaining callers of
-  // IsSpecified().
-  bool IsSpecified() const {
+  //
+  // Compare to HasOnlyFixedAndPercent.  (The difference is relevant only when
+  // sizing keywords may be present.)
+  //
+  // Note that in some contexts sizing keywords can be converted to
+  // calculation expressions, but this function does *not* return true for
+  // those cases; the caller is required to convert appropriately.
+  bool CanConvertToCalculation() const {
     return GetType() == kFixed || GetType() == kPercent ||
            GetType() == kCalculated;
   }
@@ -311,6 +315,8 @@
   // a percent, or calc() expressions that consist only of those.  (This
   // excludes calc() expressions with calc-size() that depend on sizing
   // keywords.)
+  // Compare to CanConvertToCalculation.  (The difference is relevant only
+  // when sizing keywords may be present.)
   bool HasOnlyFixedAndPercent() const;
 
   bool IsCalculated() const { return GetType() == kCalculated; }
@@ -353,8 +359,8 @@
   bool IsDeviceHeight() const { return GetType() == kDeviceHeight; }
 
   Length Blend(const Length& from, double progress, ValueRange range) const {
-    DCHECK(IsSpecified());
-    DCHECK(from.IsSpecified());
+    DCHECK(CanConvertToCalculation());
+    DCHECK(from.CanConvertToCalculation());
 
     if (progress == 0.0)
       return from;
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
index 1c240f1..56e5d984 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -1370,33 +1370,6 @@
   }
 
   const ResourceType resource_type = factory.GetType();
-  auto preloads_list_iterator = preloads_.end();
-  bool is_stale_revalidation = params.IsStaleRevalidation();
-
-  if (RuntimeEnabledFeatures::PreloadLinkRelDataUrlsEnabled()) {
-    Context().ModifyRequestForMixedContentUpgrade(resource_request);
-    if (!resource_request.Url().IsValid()) {
-      auto* resource = ResourceForBlockedRequest(
-          params, factory, ResourceRequestBlockedReason::kOther, client);
-      StorePerformanceTimingInitiatorInformation(
-          resource, params.GetRenderBlockingBehavior());
-      auto info = resource_timing_info_map_.Take(resource);
-      if (!info.is_null()) {
-        PopulateAndAddResourceTimingInfo(
-            resource, info,
-            /*response_end=*/base::TimeTicks::Now());
-      }
-      return resource;
-    }
-
-    resource_request.SetCanChangeUrl(false);
-    if (!is_stale_revalidation && !archive_) {
-      preloads_list_iterator =
-          preloads_.find(PreloadKey(params.Url(), resource_type));
-      params.SetIsPreloadedResponseCandidatePresent(preloads_list_iterator !=
-                                                    preloads_.end());
-    }
-  }
 
   WebScopedVirtualTimePauser pauser;
 
@@ -1416,6 +1389,19 @@
     return resource;
   }
 
+  auto preloads_list_iterator = preloads_.end();
+  bool is_stale_revalidation = params.IsStaleRevalidation();
+
+  if (RuntimeEnabledFeatures::PreloadLinkRelDataUrlsEnabled()) {
+    resource_request.SetCanChangeUrl(false);
+    if (!is_stale_revalidation && !archive_) {
+      preloads_list_iterator =
+          preloads_.find(PreloadKey(params.Url(), resource_type));
+      params.SetIsPreloadedResponseCandidatePresent(preloads_list_iterator !=
+                                                    preloads_.end());
+    }
+  }
+
   Resource* resource = nullptr;
   RevalidationPolicy policy = RevalidationPolicy::kLoad;
 
@@ -3571,11 +3557,8 @@
     return fetcher_.UpdateRequestForTransparentPlaceholderImage(params_);
   }
   ResourceRequest& resource_request = params_.MutableResourceRequest();
-  if (!RuntimeEnabledFeatures::PreloadLinkRelDataUrlsEnabled() &&
-      !params_.IsPreloadedResponseCandidatePresent()) {
-    bundle_url_for_uuid_resources_ =
-        fetcher_.PrepareRequestForWebBundle(resource_request);
-  }
+  bundle_url_for_uuid_resources_ =
+      fetcher_.PrepareRequestForWebBundle(resource_request);
 
   ResourceType resource_type = factory_.GetType();
   const ResourceLoaderOptions& options = params_.Options();
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_request_utils.cc b/third_party/blink/renderer/platform/loader/fetch/resource_request_utils.cc
index 0300dd4..ce40926 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_request_utils.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_request_utils.cc
@@ -220,8 +220,8 @@
   const ReportingDisposition reporting_disposition =
       CalculateReportingDisposition(params);
 
-  if (!RuntimeEnabledFeatures::PreloadLinkRelDataUrlsEnabled() &&
-      !params.IsPreloadedResponseCandidatePresent() &&
+  if (!params.IsPreloadedResponseCandidatePresent() ||
+      !RuntimeEnabledFeatures::PreloadLinkRelDataUrlsEnabled() ||
       !RuntimeEnabledFeatures::BypassCSPForPreloadsEnabled()) {
     // Note that resource_request.GetRedirectInfo() may be non-null here since
     // e.g. ThreadableLoader may create a new Resource from a ResourceRequest
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 4091e414..510d41f 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -658,6 +658,7 @@
       // Enables bypassing CSP checks when we consume a preload.
       // https://crbug.com/348442535
       name: "BypassCSPForPreloads",
+      status: "experimental",
     },
     {
       // Bypasses the enforcement of the Page Embedded Permission Control
@@ -3421,6 +3422,7 @@
       // Used to allow preloading data: URLs with link rel=preload.
       // https://crbug.com/348442535
       name: "PreloadLinkRelDataUrls",
+      status: "experimental",
     },
     {
       // Used to allow chrome://flags to turn off prerendering. (Without using
@@ -3581,6 +3583,13 @@
       base_feature: "none",
     },
     {
+      // If enabled, the screen sizes reported through the `Screen` interface
+      // will be limited to the size of the viewport unless Window Management
+      // permission has been granted.
+      name: "ReduceScreenSize",
+      settable_from_internals: true,
+    },
+    {
       // If enabled, the deviceModel will be reduced to "K" and the
       // androidVersion will be reduced to a static "10" string in android
       // User-Agent string.
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index fe4c70a..0361013 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1066,7 +1066,8 @@
       "external/wpt/FileAPI/BlobURL/cross-partition.https.html",
       "external/wpt/FileAPI/BlobURL/cross-partition-worker-creation.https.html",
       "external/wpt/FileAPI/BlobURL/cross-partition-navigation.https.html",
-      "external/wpt/storage-access-api/storage-access-beyond-cookies.blobStorage.sub.https.window.html"
+      "external/wpt/storage-access-api/storage-access-beyond-cookies.blobStorage.sub.https.window.html",
+      "external/wpt/storage-access-api/storage-access-beyond-cookies.BlobURLDedicatedWorker.sub.https.tentative.window.html"
     ],
     "args": ["--enable-features=BlockCrossPartitionBlobUrlFetching,EnforceNoopenerOnBlobURLNavigation"],
     "expires": "Sep 1, 2025",
@@ -4309,6 +4310,61 @@
     ]
    },
    {
+    "prefix": "preload-link-rel-dataurls-disabled",
+    "owners": ["nidhijaju@chromium.org"],
+    "platforms": ["Linux", "Mac", "Win"],
+    "bases": [
+      "wpt_internal/content-security-policy/reporting-api/reporting-api-report-only-sends-reports-on-violation.https.sub.html",
+      "wpt_internal/content-security-policy/securitypolicyviolation/input-time.https.html",
+      "external/wpt/content-security-policy/inside-worker",
+      "external/wpt/content-security-policy/reporting-api/reporting-api-report-only-sends-reports-on-violation.https.sub.html",
+      "external/wpt/content-security-policy/reporting",
+      "external/wpt/content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html",
+      "external/wpt/content-security-policy/securitypolicyviolation/upgrade-insecure-requests-reporting.https.html",
+      "http/tests/inspector-protocol/issues/content-security-policy-issue-report-only.js",
+      "http/tests/inspector-protocol/issues/mixed-content-issue-creation-img.js",
+      "http/tests/inspector-protocol/no-crash-with-stack-id-and-stale-while-revalidate.js",
+      "http/tests/security/contentSecurityPolicy/nonces/style-reportonly-allowed.php",
+      "external/wpt/upgrade-insecure-requests/gen/iframe-blank-inherit.meta/upgrade",
+      "external/wpt/upgrade-insecure-requests/gen/sharedworker-classic-data.http-rp/upgrade",
+      "external/wpt/upgrade-insecure-requests/gen/srcdoc-inherit.meta/upgrade",
+      "external/wpt/upgrade-insecure-requests/gen/top.http-rp/upgrade",
+      "external/wpt/upgrade-insecure-requests/gen/top.meta/upgrade"
+    ],
+    "args": [
+      "--disable-features=PreloadLinkRelDataUrls,BypassCSPForPreloads"
+    ],
+    "expires": "Jul 3, 2025"
+   },
+   {
+    "prefix": "bypass-csp-for-preloads-disabled",
+    "owners": ["nidhijaju@chromium.org"],
+    "platforms": ["Linux", "Mac", "Win"],
+    "bases": [
+      "wpt_internal/content-security-policy/reporting-api/reporting-api-report-only-sends-reports-on-violation.https.sub.html",
+      "wpt_internal/content-security-policy/securitypolicyviolation/input-time.https.html",
+      "external/wpt/content-security-policy/inside-worker",
+      "external/wpt/content-security-policy/reporting-api/reporting-api-report-only-sends-reports-on-violation.https.sub.html",
+      "external/wpt/content-security-policy/reporting",
+      "external/wpt/content-security-policy/script-src/script-src-report-only-policy-works-with-external-hash-policy.html",
+      "external/wpt/content-security-policy/securitypolicyviolation/upgrade-insecure-requests-reporting.https.html",
+      "http/tests/inspector-protocol/issues/content-security-policy-issue-report-only.js",
+      "http/tests/inspector-protocol/issues/mixed-content-issue-creation-img.js",
+      "http/tests/inspector-protocol/no-crash-with-stack-id-and-stale-while-revalidate.js",
+      "http/tests/security/contentSecurityPolicy/nonces/style-reportonly-allowed.php",
+      "external/wpt/upgrade-insecure-requests/gen/iframe-blank-inherit.meta/upgrade",
+      "external/wpt/upgrade-insecure-requests/gen/sharedworker-classic-data.http-rp/upgrade",
+      "external/wpt/upgrade-insecure-requests/gen/srcdoc-inherit.meta/upgrade",
+      "external/wpt/upgrade-insecure-requests/gen/top.http-rp/upgrade",
+      "external/wpt/upgrade-insecure-requests/gen/top.meta/upgrade"
+    ],
+    "args": [
+      "--enable-features=PreloadLinkRelDataUrls",
+      "--disable-features=BypassCSPForPreloads"
+    ],
+    "expires": "Jul 3, 2025"
+   },
+   {
     "prefix": "delegates-focus-text-control-disabled",
     "owners": ["dizhangg@google.com"],
     "platforms": ["Linux", "Mac", "Win"],
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index 62e361f..5923860 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -165417,7 +165417,7 @@
       ]
      ],
      "column-height-005.html": [
-      "e131d62ee5dbeb8f13e68427983f0bc85d2c99c0",
+      "73303e275a80aec37e6910e6a0b7f62baafdee60",
       [
        null,
        [
@@ -165481,6 +165481,45 @@
        {}
       ]
      ],
+     "column-height-010.html": [
+      "8c7e8d5b0f166e34c05e2b3e1c97f2750f12a3ef",
+      [
+       null,
+       [
+        [
+         "/css/reference/ref-filled-green-100px-square.xht",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "column-height-011.html": [
+      "37495a15a097b8927fcda5f46c83060652b77c82",
+      [
+       null,
+       [
+        [
+         "/css/reference/ref-filled-green-100px-square.xht",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
+     "column-height-012.html": [
+      "b663ea981ce34a0b04348e9b4185bd56a3f4e314",
+      [
+       null,
+       [
+        [
+         "/css/reference/ref-filled-green-100px-square.xht",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "column-pseudo-background-color.html": [
       "f321b1076eb58fcc00add55ab9f7dacd9daa2fba",
       [
@@ -310496,6 +310535,19 @@
        {}
       ]
      ],
+     "svg-percent-stroke-width-viewbox-update.html": [
+      "cc88e9276f2bd61bc78849c3f0fa38dd0311ca8a",
+      [
+       null,
+       [
+        [
+         "/svg/painting/svg-percent-stroke-width-viewbox-update-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "svg-with-outline.html": [
       "56ed98083a62a4ec00d05c6e99d5b7b55bd15658",
       [
@@ -424648,6 +424700,10 @@
       "0d760d18dce03df5917086ccb0253a8ced421e36",
       []
      ],
+     "svg-percent-stroke-width-viewbox-update-ref.html": [
+      "6e7c2b23af64a07229297eb728b489cbf467c943",
+      []
+     ],
      "svg-with-outline-ref.html": [
       "6729a2595bf569a310d0b534f4d2d44b1b54af48",
       []
@@ -428505,6 +428561,10 @@
       ]
      },
      "Animation": {
+      "commitStyles.tentative-expected.txt": [
+       "b4b70f68b0a79162309dc4fde868691a6d18479a",
+       []
+      ],
       "style-change-events-expected.txt": [
        "d7ed0e9c69aabad5bce0994fcb12fe873102934f",
        []
@@ -428617,6 +428677,10 @@
        "d1ee52a55302caa898b78a6af1bb392df1472616",
        []
       ],
+      "finishing-an-animation-expected.txt": [
+       "64bf532d363264f1043c6c4f070ba93c0beefb05",
+       []
+      ],
       "infinite-duration-animation-ref.html": [
        "6b358bd4e7f3eb2e15d18246ec5722860a903a47",
        []
@@ -539622,7 +539686,7 @@
      ]
     ],
     "XMLSerializer-serializeToString.html": [
-     "ad65c9fafb370de6d482bd0166bc030453750b4d",
+     "c3b704bf18825c27e74c5db8177fa178925c9b26",
      [
       null,
       {}
@@ -744990,7 +745054,14 @@
        ]
       ],
       "commitStyles.html": [
-       "9a7dbea8b8649bb4580e60fef1e1530a84f2b13f",
+       "26c8342e6f24b70d0acc81f4e62865b8cce6b261",
+       [
+        null,
+        {}
+       ]
+      ],
+      "commitStyles.tentative.html": [
+       "8b7d089ae34fcc7660c153e61a571b547b94e141",
        [
         null,
         {}
@@ -768354,7 +768425,7 @@
       ]
      ],
      "pooling.https.any.js": [
-      "cf62a0e95bcd97dea07790b7073928d0076dacec",
+      "f385aab1f154387bbe35b171927d29684c8d5120",
       [
        "webnn/conformance_tests/pooling.https.any.html?cpu",
        {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transforms/3d-point-mapping-coplanar.html b/third_party/blink/web_tests/external/wpt/css/css-transforms/3d-point-mapping-coplanar.html
new file mode 100644
index 0000000..0ae0ab1e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-transforms/3d-point-mapping-coplanar.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html>
+<title>Hit test coplanar elements</title>
+<link rel="help" href="https://svgwg.org/svg2-draft/interact.html#hit-testing">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<style type="text/css" media="screen">
+  body {
+    margin: 0;
+  }
+
+  .test {
+    display: inline-block;
+    height: 300px;
+    width: 300px;
+    margin: 20px;
+  }
+
+  .container {
+    position: relative;
+    height: 260px;
+    width: 260px;
+    margin: 20px;
+  }
+
+  .box {
+    position: absolute;
+    top: 20px;
+    left: 30px;
+    height: 100px;
+    width: 200px;
+    transform: translateZ(20px);
+  }
+
+  #box1 {
+    background-color: #DDD;
+  }
+
+  #box2 {
+    background-color: #CCC;
+  }
+
+  #box3 {
+    background-color: #BBB;
+    top: 60px;
+  }
+
+  #box4 {
+    background-color: #AAA;
+    top: 100px;
+  }
+</style>
+
+<body>
+  <div class="test">
+    <div class="container" id="box1">
+      <div class="box" id="box2"></div>
+      <div class="box" id="box3"></div>
+      <div class="box" id="box4"></div>
+    </div>
+  </div>
+</body>
+
+<script>
+  class Point {
+    constructor(x, y) {
+      this.x = x;
+      this.y = y;
+    }
+  };
+  const tests = [{
+      expectedElemId: 'box1',
+      points: [
+        new Point(59, 52),
+        new Point(278, 59),
+        new Point(58, 260),
+        new Point(281, 269),
+      ],
+    },
+    {
+      expectedElemId: 'box2',
+      points: [
+        new Point(82, 68),
+        new Point(109, 80),
+        new Point(189, 71),
+        new Point(268, 98)
+      ],
+    },
+    {
+      expectedElemId: 'box3',
+      points: [
+        new Point(73, 101),
+        new Point(128, 136),
+        new Point(206, 102),
+        new Point(268, 138),
+      ]
+    },
+    {
+      expectedElemId: 'box4',
+      points: [
+        new Point(73, 144),
+        new Point(72, 232),
+        new Point(265, 146),
+        new Point(264, 232),
+      ]
+    },
+  ];
+
+  tests.forEach(testcase => {
+    test(t => {
+      const expectedElem = document.getElementById(testcase.expectedElemId);
+      for (const point of testcase.points) {
+        const hitElem = document.elementFromPoint(point.x, point.y);
+        assert_equals(hitElem, expectedElem,
+          `point (${point.x}, ${point.y}) is inside element ${testcase.expectedElemId}`);
+      }
+    }, `${document.title}, hittesting ${testcase.expectedElemId})`);
+  });
+</script>
+
+</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.createImageBitmap.p3.rgba.unorm8.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.createImageBitmap.p3.rgba.unorm8.html
new file mode 100644
index 0000000..09d12ff
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.createImageBitmap.p3.rgba.unorm8.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<meta charset="UTF-8">
+<title>Canvas test: 2d.imageData.createImageBitmap.p3.rgba.unorm8</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.imageData.createImageBitmap.p3.rgba.unorm8</h1>
+<p class="desc">Verify round-trip of 8-bit P3 data ImageData through ImageBitmap</p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+
+<ul id="d"></ul>
+<script>
+promise_test(async t => {
+
+  var canvas = document.getElementById('c');
+  var ctx = canvas.getContext('2d', {colorSpace: "srgb", colorType:"float16"});
+
+  const expectedColor = [ 255, 0, 0, 255 ];
+  var imageData = new ImageData(10, 10, {colorSpace:"display-p3", pixelFormat:"rgba-unorm8"});
+  for (let y = 0; y < imageData.height; ++y) {
+    for (let x = 0; x < imageData.width; ++x) {
+      for (let c = 0; c < 4; ++c) {
+        imageData.data[4*(x + y*imageData.width) + c] = expectedColor[c];
+      }
+    }
+  }
+  var bitmap = await createImageBitmap(imageData);
+  ctx.drawImage(bitmap, 0, 0);
+  var pixel = ctx.getImageData(0, 0, 1, 1, {colorSpace:"display-p3", pixelFormat:"rgba-unorm8"});
+  for (let c = 0; c < 4; ++c) {
+    assert_approx_equals(pixel.data[c], expectedColor[c], 2);
+  }
+
+}, "Verify round-trip of 8-bit P3 data ImageData through ImageBitmap");
+</script>
+
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.float16.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.float16.html
new file mode 100644
index 0000000..61519eb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.float16.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<meta charset="UTF-8">
+<title>Canvas test: 2d.imageData.createImageBitmap.srgb.rgba.float16</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.imageData.createImageBitmap.srgb.rgba.float16</h1>
+<p class="desc">Verify round-trip of 16-bit float sRGB data ImageData through ImageBitmap</p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+
+<ul id="d"></ul>
+<script>
+promise_test(async t => {
+
+  var canvas = document.getElementById('c');
+  var ctx = canvas.getContext('2d', {colorSpace: "srgb", colorType:"float16"});
+
+  const expectedColor = [ 1.0, 2.0, -1.0, 1.0 ];
+  var imageData = new ImageData(10, 10, {colorSpace:"srgb", pixelFormat:"rgba-float16"});
+  for (let y = 0; y < imageData.height; ++y) {
+    for (let x = 0; x < imageData.width; ++x) {
+      for (let c = 0; c < 4; ++c) {
+        imageData.data[4*(x + y*imageData.width) + c] = expectedColor[c];
+      }
+    }
+  }
+  var bitmap = await createImageBitmap(imageData);
+  ctx.drawImage(bitmap, 0, 0);
+  var pixel = ctx.getImageData(0, 0, 1, 1, {colorSpace:"srgb", pixelFormat:"rgba-float16"});
+  for (let c = 0; c < 4; ++c) {
+    assert_approx_equals(pixel.data[c], expectedColor[c], 0.01);
+  }
+
+}, "Verify round-trip of 16-bit float sRGB data ImageData through ImageBitmap");
+</script>
+
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.unorm8.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.unorm8.html
new file mode 100644
index 0000000..eee3846
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.unorm8.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<meta charset="UTF-8">
+<title>Canvas test: 2d.imageData.createImageBitmap.srgb.rgba.unorm8</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.imageData.createImageBitmap.srgb.rgba.unorm8</h1>
+<p class="desc">Verify round-trip of 8-bit sRGB data ImageData through ImageBitmap</p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+
+<ul id="d"></ul>
+<script>
+promise_test(async t => {
+
+  var canvas = document.getElementById('c');
+  var ctx = canvas.getContext('2d', {colorSpace: "srgb", colorType:"float16"});
+
+  const expectedColor = [ 32, 64, 128, 255 ];
+  var imageData = new ImageData(10, 10, {colorSpace:"srgb", pixelFormat:"rgba-unorm8"});
+  for (let y = 0; y < imageData.height; ++y) {
+    for (let x = 0; x < imageData.width; ++x) {
+      for (let c = 0; c < 4; ++c) {
+        imageData.data[4*(x + y*imageData.width) + c] = expectedColor[c];
+      }
+    }
+  }
+  var bitmap = await createImageBitmap(imageData);
+  ctx.drawImage(bitmap, 0, 0);
+  var pixel = ctx.getImageData(0, 0, 1, 1, {colorSpace:"srgb", pixelFormat:"rgba-unorm8"});
+  for (let c = 0; c < 4; ++c) {
+    assert_approx_equals(pixel.data[c], expectedColor[c], 2);
+  }
+
+}, "Verify round-trip of 8-bit sRGB data ImageData through ImageBitmap");
+</script>
+
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.object.ctor.pixelFormat.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.object.ctor.pixelFormat.html
new file mode 100644
index 0000000..9d4c4cc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.object.ctor.pixelFormat.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<meta charset="UTF-8">
+<title>Canvas test: 2d.imageData.object.ctor.pixelFormat</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.imageData.object.ctor.pixelFormat</h1>
+<p class="desc">Testing ImageData constructor pixelFormat behaviors</p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+
+<ul id="d"></ul>
+<script>
+var t = async_test("Testing ImageData constructor pixelFormat behaviors");
+_addTest(function(canvas, ctx) {
+
+  function setRGBA(imageData, i, rgba)
+  {
+      var s = i * 4;
+      imageData[s] = rgba[0];
+      imageData[s + 1] = rgba[1];
+      imageData[s + 2] = rgba[2];
+      imageData[s + 3] = rgba[3];
+  }
+
+  function getRGBA(imageData, i)
+  {
+      var result = [];
+      var s = i * 4;
+      for (var j = 0; j < 4; j++) {
+          result[j] = imageData[s + j];
+      }
+      return result;
+  }
+
+  function assertArrayEquals(actual, expected)
+  {
+      _assertSame(typeof actual, "object", "typeof actual", "\"object\"");
+      _assertDifferent(actual, null, "actual", "null");
+      _assertSame("length" in actual, true, "\"length\" in actual", "true");
+      _assertSame(actual.length, expected.length, "actual.length", "expected.length");
+      for (var i = 0; i < actual.length; i++) {
+          _assertSame(actual.hasOwnProperty(i), expected.hasOwnProperty(i), "actual.hasOwnProperty(i)", "expected.hasOwnProperty(i)");
+          _assertSame(actual[i], expected[i], "actual[\""+(i)+"\"]", "expected[\""+(i)+"\"]");
+      }
+  }
+
+  _assertDifferent(ImageData, undefined, "ImageData", "undefined");
+  imageData = new ImageData(100, 50);
+  _assertSame(imageData.pixelFormat, "rgba-unorm8", "imageData.pixelFormat", "\"rgba-unorm8\"");
+
+  imageData = new ImageData(100, 50, {pixelFormat:"rgba-float16"});
+  _assertSame(imageData.pixelFormat, "rgba-float16", "imageData.pixelFormat", "\"rgba-float16\"");
+  var testColor = [0, -1, 0.5, 1024];
+  setRGBA(imageData.data, 4, testColor);
+  assertArrayEquals(getRGBA(imageData.data, 4), testColor);
+
+  data = new Float16Array(200);
+  imageData = new ImageData(data, 10, 5, {pixelFormat:"rgba-float16"});
+  _assertSame(imageData.pixelFormat, "rgba-float16", "imageData.pixelFormat", "\"rgba-float16\"");
+  _assertSame(imageData.data, data, "imageData.data", "data");
+  assert_throws_dom("INVALID_STATE_ERR", function() { new ImageData(data, 10, 5, {pixelFormat:"rgba-unorm8"}); });
+  assert_throws_dom("INVALID_STATE_ERR", function() { new ImageData(data, 10, 5); });
+
+  data = new Uint8ClampedArray(200);
+  imageData = new ImageData(data, 10, 5);
+  _assertSame(imageData.pixelFormat, "rgba-unorm8", "imageData.pixelFormat", "\"rgba-unorm8\"");
+  _assertSame(imageData.data, data, "imageData.data", "data");
+  assert_throws_dom("INVALID_STATE_ERR", function() { new ImageData(data, 10, 5, {pixelFormat:"rgba-float16"}); });
+
+  assert_throws_js(TypeError, function() { new ImageData(data, 10, 5, {pixelFormat:"unorm8"}); });
+  assert_throws_js(TypeError, function() { new ImageData(data, 10, 5, {pixelFormat:"float16"}); });
+  assert_throws_js(TypeError, function() { new ImageData(data, 10, 5, {pixelFormat:"rgba8unorm"}); });
+  assert_throws_js(TypeError, function() { new ImageData(data, 10, 5, {pixelFormat:"rgba16float"}); });
+
+});
+</script>
+
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.object.properties.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.object.properties.html
index de586fd..72f314b 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.object.properties.html
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.object.properties.html
@@ -24,6 +24,8 @@
   _assertSame(typeof(imgdata.width), 'number', "typeof(imgdata.width)", "'number'");
   _assertSame(typeof(imgdata.height), 'number', "typeof(imgdata.height)", "'number'");
   _assertSame(typeof(imgdata.data), 'object', "typeof(imgdata.data)", "'object'");
+  _assertSame(typeof(imgdata.colorSpace), 'string', "typeof(imgdata.colorSpace)", "'string'");
+  _assertSame(typeof(imgdata.pixelFormat), 'string', "typeof(imgdata.pixelFormat)", "'string'");
 
 });
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.put.basic.rgba.float16.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.put.basic.rgba.float16.html
new file mode 100644
index 0000000..8307f7f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/pixel-manipulation/2d.imageData.put.basic.rgba.float16.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<meta charset="UTF-8">
+<title>Canvas test: 2d.imageData.put.basic.rgba.float16</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+<link rel="stylesheet" href="/html/canvas/resources/canvas-tests.css">
+<body class="show_output">
+
+<h1>2d.imageData.put.basic.rgba.float16</h1>
+<p class="desc">putImageData() puts 16-bit floating point image data from getImageData() onto the canvas</p>
+
+
+<p class="output">Actual output:</p>
+<canvas id="c" class="output" width="100" height="50"><p class="fallback">FAIL (fallback content)</p></canvas>
+
+<ul id="d"></ul>
+<script>
+var t = async_test("putImageData() puts 16-bit floating point image data from getImageData() onto the canvas");
+_addTest(function(canvas, ctx) {
+
+  ctx.fillStyle = 'color(display-p3 1 0 0)';
+  ctx.fillRect(0, 0, 100, 50)
+  var imgdata = ctx.getImageData(0, 0, 100, 50, {colorSpace:"srgb", pixelFormat:"rgba-float16"});
+  ctx.fillStyle = '#f00';
+  ctx.fillRect(0, 0, 100, 50)
+  ctx.putImageData(imgdata, 0, 0);
+  var pixel = ctx.getImageData(0, 0, 1, 1, {colorSpace:"display-p3", pixelFormat:"rgba-float16"});
+  assert_approx_equals(pixel.data[0], 1, 0.01);
+  assert_approx_equals(pixel.data[1], 0, 0.01);
+  assert_approx_equals(pixel.data[2], 0, 0.01);
+  assert_approx_equals(pixel.data[3], 1, 0.01);
+
+}, {colorSpace: "srgb", colorType: "float16"});
+</script>
+
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.to.srgb.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.to.srgb.html
index 8320a29..abfda62 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.to.srgb.html
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/wide-gamut-canvas/2d.color.space.p3.to.srgb.html
@@ -9,7 +9,7 @@
 <body class="show_output">
 
 <h1>2d.color.space.p3.to.srgb</h1>
-<p class="desc">test getImageData with srsb and uint8 from display p3 uint8 canvas</p>
+<p class="desc">test getImageData with srgb and uint8 from display p3 uint8 canvas</p>
 
 
 <p class="output">Actual output:</p>
@@ -17,7 +17,7 @@
 
 <ul id="d"></ul>
 <script>
-var t = async_test("test getImageData with srsb and uint8 from display p3 uint8 canvas");
+var t = async_test("test getImageData with srgb and uint8 from display p3 uint8 canvas");
 _addTest(function(canvas, ctx) {
 
   var color_style = 'rgb(50, 100, 150)';
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.p3.rgba.unorm8.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.p3.rgba.unorm8.html
new file mode 100644
index 0000000..4712a13
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.p3.rgba.unorm8.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<meta charset="UTF-8">
+<title>OffscreenCanvas test: 2d.imageData.createImageBitmap.p3.rgba.unorm8</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+
+<h1>2d.imageData.createImageBitmap.p3.rgba.unorm8</h1>
+<p class="desc">Verify round-trip of 8-bit P3 data ImageData through ImageBitmap</p>
+
+
+<script>
+promise_test(async t => {
+
+  var canvas = new OffscreenCanvas(100, 50);
+  var ctx = canvas.getContext('2d', {colorSpace: "srgb", colorType:"float16"});
+
+  const expectedColor = [ 255, 0, 0, 255 ];
+  var imageData = new ImageData(10, 10, {colorSpace:"display-p3", pixelFormat:"rgba-unorm8"});
+  for (let y = 0; y < imageData.height; ++y) {
+    for (let x = 0; x < imageData.width; ++x) {
+      for (let c = 0; c < 4; ++c) {
+        imageData.data[4*(x + y*imageData.width) + c] = expectedColor[c];
+      }
+    }
+  }
+  var bitmap = await createImageBitmap(imageData);
+  ctx.drawImage(bitmap, 0, 0);
+  var pixel = ctx.getImageData(0, 0, 1, 1, {colorSpace:"display-p3", pixelFormat:"rgba-unorm8"});
+  for (let c = 0; c < 4; ++c) {
+    assert_approx_equals(pixel.data[c], expectedColor[c], 2);
+  }
+
+}, "Verify round-trip of 8-bit P3 data ImageData through ImageBitmap");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.p3.rgba.unorm8.worker.js b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.p3.rgba.unorm8.worker.js
new file mode 100644
index 0000000..51034aa
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.p3.rgba.unorm8.worker.js
@@ -0,0 +1,29 @@
+// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
+// OffscreenCanvas test in a worker:2d.imageData.createImageBitmap.p3.rgba.unorm8
+// Description:Verify round-trip of 8-bit P3 data ImageData through ImageBitmap
+// Note:
+
+importScripts("/resources/testharness.js");
+importScripts("/html/canvas/resources/canvas-tests.js");
+
+promise_test(async t => {
+  var canvas = new OffscreenCanvas(100, 50);
+  var ctx = canvas.getContext('2d', {colorSpace: "srgb", colorType:"float16"});
+
+  const expectedColor = [ 255, 0, 0, 255 ];
+  var imageData = new ImageData(10, 10, {colorSpace:"display-p3", pixelFormat:"rgba-unorm8"});
+  for (let y = 0; y < imageData.height; ++y) {
+    for (let x = 0; x < imageData.width; ++x) {
+      for (let c = 0; c < 4; ++c) {
+        imageData.data[4*(x + y*imageData.width) + c] = expectedColor[c];
+      }
+    }
+  }
+  var bitmap = await createImageBitmap(imageData);
+  ctx.drawImage(bitmap, 0, 0);
+  var pixel = ctx.getImageData(0, 0, 1, 1, {colorSpace:"display-p3", pixelFormat:"rgba-unorm8"});
+  for (let c = 0; c < 4; ++c) {
+    assert_approx_equals(pixel.data[c], expectedColor[c], 2);
+  }
+}, "Verify round-trip of 8-bit P3 data ImageData through ImageBitmap");
+done();
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.float16.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.float16.html
new file mode 100644
index 0000000..3b31076
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.float16.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<meta charset="UTF-8">
+<title>OffscreenCanvas test: 2d.imageData.createImageBitmap.srgb.rgba.float16</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+
+<h1>2d.imageData.createImageBitmap.srgb.rgba.float16</h1>
+<p class="desc">Verify round-trip of 16-bit float sRGB data ImageData through ImageBitmap</p>
+
+
+<script>
+promise_test(async t => {
+
+  var canvas = new OffscreenCanvas(100, 50);
+  var ctx = canvas.getContext('2d', {colorSpace: "srgb", colorType:"float16"});
+
+  const expectedColor = [ 1.0, 2.0, -1.0, 1.0 ];
+  var imageData = new ImageData(10, 10, {colorSpace:"srgb", pixelFormat:"rgba-float16"});
+  for (let y = 0; y < imageData.height; ++y) {
+    for (let x = 0; x < imageData.width; ++x) {
+      for (let c = 0; c < 4; ++c) {
+        imageData.data[4*(x + y*imageData.width) + c] = expectedColor[c];
+      }
+    }
+  }
+  var bitmap = await createImageBitmap(imageData);
+  ctx.drawImage(bitmap, 0, 0);
+  var pixel = ctx.getImageData(0, 0, 1, 1, {colorSpace:"srgb", pixelFormat:"rgba-float16"});
+  for (let c = 0; c < 4; ++c) {
+    assert_approx_equals(pixel.data[c], expectedColor[c], 0.01);
+  }
+
+}, "Verify round-trip of 16-bit float sRGB data ImageData through ImageBitmap");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.float16.worker.js b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.float16.worker.js
new file mode 100644
index 0000000..c0e2b26
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.float16.worker.js
@@ -0,0 +1,29 @@
+// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
+// OffscreenCanvas test in a worker:2d.imageData.createImageBitmap.srgb.rgba.float16
+// Description:Verify round-trip of 16-bit float sRGB data ImageData through ImageBitmap
+// Note:
+
+importScripts("/resources/testharness.js");
+importScripts("/html/canvas/resources/canvas-tests.js");
+
+promise_test(async t => {
+  var canvas = new OffscreenCanvas(100, 50);
+  var ctx = canvas.getContext('2d', {colorSpace: "srgb", colorType:"float16"});
+
+  const expectedColor = [ 1.0, 2.0, -1.0, 1.0 ];
+  var imageData = new ImageData(10, 10, {colorSpace:"srgb", pixelFormat:"rgba-float16"});
+  for (let y = 0; y < imageData.height; ++y) {
+    for (let x = 0; x < imageData.width; ++x) {
+      for (let c = 0; c < 4; ++c) {
+        imageData.data[4*(x + y*imageData.width) + c] = expectedColor[c];
+      }
+    }
+  }
+  var bitmap = await createImageBitmap(imageData);
+  ctx.drawImage(bitmap, 0, 0);
+  var pixel = ctx.getImageData(0, 0, 1, 1, {colorSpace:"srgb", pixelFormat:"rgba-float16"});
+  for (let c = 0; c < 4; ++c) {
+    assert_approx_equals(pixel.data[c], expectedColor[c], 0.01);
+  }
+}, "Verify round-trip of 16-bit float sRGB data ImageData through ImageBitmap");
+done();
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.unorm8.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.unorm8.html
new file mode 100644
index 0000000..687ffc2a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.unorm8.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<meta charset="UTF-8">
+<title>OffscreenCanvas test: 2d.imageData.createImageBitmap.srgb.rgba.unorm8</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+
+<h1>2d.imageData.createImageBitmap.srgb.rgba.unorm8</h1>
+<p class="desc">Verify round-trip of 8-bit sRGB data ImageData through ImageBitmap</p>
+
+
+<script>
+promise_test(async t => {
+
+  var canvas = new OffscreenCanvas(100, 50);
+  var ctx = canvas.getContext('2d', {colorSpace: "srgb", colorType:"float16"});
+
+  const expectedColor = [ 32, 64, 128, 255 ];
+  var imageData = new ImageData(10, 10, {colorSpace:"srgb", pixelFormat:"rgba-unorm8"});
+  for (let y = 0; y < imageData.height; ++y) {
+    for (let x = 0; x < imageData.width; ++x) {
+      for (let c = 0; c < 4; ++c) {
+        imageData.data[4*(x + y*imageData.width) + c] = expectedColor[c];
+      }
+    }
+  }
+  var bitmap = await createImageBitmap(imageData);
+  ctx.drawImage(bitmap, 0, 0);
+  var pixel = ctx.getImageData(0, 0, 1, 1, {colorSpace:"srgb", pixelFormat:"rgba-unorm8"});
+  for (let c = 0; c < 4; ++c) {
+    assert_approx_equals(pixel.data[c], expectedColor[c], 2);
+  }
+
+}, "Verify round-trip of 8-bit sRGB data ImageData through ImageBitmap");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.unorm8.worker.js b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.unorm8.worker.js
new file mode 100644
index 0000000..77993c4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.createImageBitmap.srgb.rgba.unorm8.worker.js
@@ -0,0 +1,29 @@
+// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
+// OffscreenCanvas test in a worker:2d.imageData.createImageBitmap.srgb.rgba.unorm8
+// Description:Verify round-trip of 8-bit sRGB data ImageData through ImageBitmap
+// Note:
+
+importScripts("/resources/testharness.js");
+importScripts("/html/canvas/resources/canvas-tests.js");
+
+promise_test(async t => {
+  var canvas = new OffscreenCanvas(100, 50);
+  var ctx = canvas.getContext('2d', {colorSpace: "srgb", colorType:"float16"});
+
+  const expectedColor = [ 32, 64, 128, 255 ];
+  var imageData = new ImageData(10, 10, {colorSpace:"srgb", pixelFormat:"rgba-unorm8"});
+  for (let y = 0; y < imageData.height; ++y) {
+    for (let x = 0; x < imageData.width; ++x) {
+      for (let c = 0; c < 4; ++c) {
+        imageData.data[4*(x + y*imageData.width) + c] = expectedColor[c];
+      }
+    }
+  }
+  var bitmap = await createImageBitmap(imageData);
+  ctx.drawImage(bitmap, 0, 0);
+  var pixel = ctx.getImageData(0, 0, 1, 1, {colorSpace:"srgb", pixelFormat:"rgba-unorm8"});
+  for (let c = 0; c < 4; ++c) {
+    assert_approx_equals(pixel.data[c], expectedColor[c], 2);
+  }
+}, "Verify round-trip of 8-bit sRGB data ImageData through ImageBitmap");
+done();
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.object.properties.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.object.properties.html
index f936938b..5c334ce 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.object.properties.html
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.object.properties.html
@@ -25,6 +25,8 @@
   _assertSame(typeof(imgdata.width), 'number', "typeof(imgdata.width)", "'number'");
   _assertSame(typeof(imgdata.height), 'number', "typeof(imgdata.height)", "'number'");
   _assertSame(typeof(imgdata.data), 'object', "typeof(imgdata.data)", "'object'");
+  _assertSame(typeof(imgdata.colorSpace), 'string', "typeof(imgdata.colorSpace)", "'string'");
+  _assertSame(typeof(imgdata.pixelFormat), 'string', "typeof(imgdata.pixelFormat)", "'string'");
   t.done();
 
 });
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.object.properties.worker.js b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.object.properties.worker.js
index e428e0d..6c2026c 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.object.properties.worker.js
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.object.properties.worker.js
@@ -20,6 +20,8 @@
   _assertSame(typeof(imgdata.width), 'number', "typeof(imgdata.width)", "'number'");
   _assertSame(typeof(imgdata.height), 'number', "typeof(imgdata.height)", "'number'");
   _assertSame(typeof(imgdata.data), 'object', "typeof(imgdata.data)", "'object'");
+  _assertSame(typeof(imgdata.colorSpace), 'string', "typeof(imgdata.colorSpace)", "'string'");
+  _assertSame(typeof(imgdata.pixelFormat), 'string', "typeof(imgdata.pixelFormat)", "'string'");
   t.done();
 });
 done();
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.put.basic.rgba.float16.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.put.basic.rgba.float16.html
new file mode 100644
index 0000000..f8bd9ad8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.put.basic.rgba.float16.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. -->
+<meta charset="UTF-8">
+<title>OffscreenCanvas test: 2d.imageData.put.basic.rgba.float16</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/html/canvas/resources/canvas-tests.js"></script>
+
+<h1>2d.imageData.put.basic.rgba.float16</h1>
+<p class="desc">putImageData() puts 16-bit floating point image data from getImageData() onto the canvas</p>
+
+
+<script>
+var t = async_test("putImageData() puts 16-bit floating point image data from getImageData() onto the canvas");
+var t_pass = t.done.bind(t);
+var t_fail = t.step_func(function(reason) {
+    throw reason;
+});
+t.step(function() {
+
+  var canvas = new OffscreenCanvas(100, 50);
+  var ctx = canvas.getContext('2d', {colorSpace: "srgb", colorType: "float16"});
+
+  ctx.fillStyle = 'color(display-p3 1 0 0)';
+  ctx.fillRect(0, 0, 100, 50)
+  var imgdata = ctx.getImageData(0, 0, 100, 50, {colorSpace:"srgb", pixelFormat:"rgba-float16"});
+  ctx.fillStyle = '#f00';
+  ctx.fillRect(0, 0, 100, 50)
+  ctx.putImageData(imgdata, 0, 0);
+  var pixel = ctx.getImageData(0, 0, 1, 1, {colorSpace:"display-p3", pixelFormat:"rgba-float16"});
+  assert_approx_equals(pixel.data[0], 1, 0.01);
+  assert_approx_equals(pixel.data[1], 0, 0.01);
+  assert_approx_equals(pixel.data[2], 0, 0.01);
+  assert_approx_equals(pixel.data[3], 1, 0.01);
+  t.done();
+
+});
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.put.basic.rgba.float16.worker.js b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.put.basic.rgba.float16.worker.js
new file mode 100644
index 0000000..06496ea
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/pixel-manipulation/2d.imageData.put.basic.rgba.float16.worker.js
@@ -0,0 +1,32 @@
+// DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
+// OffscreenCanvas test in a worker:2d.imageData.put.basic.rgba.float16
+// Description:putImageData() puts 16-bit floating point image data from getImageData() onto the canvas
+// Note:
+
+importScripts("/resources/testharness.js");
+importScripts("/html/canvas/resources/canvas-tests.js");
+
+var t = async_test("putImageData() puts 16-bit floating point image data from getImageData() onto the canvas");
+var t_pass = t.done.bind(t);
+var t_fail = t.step_func(function(reason) {
+    throw reason;
+});
+t.step(function() {
+
+  var canvas = new OffscreenCanvas(100, 50);
+  var ctx = canvas.getContext('2d', {colorSpace: "srgb", colorType: "float16"});
+
+  ctx.fillStyle = 'color(display-p3 1 0 0)';
+  ctx.fillRect(0, 0, 100, 50)
+  var imgdata = ctx.getImageData(0, 0, 100, 50, {colorSpace:"srgb", pixelFormat:"rgba-float16"});
+  ctx.fillStyle = '#f00';
+  ctx.fillRect(0, 0, 100, 50)
+  ctx.putImageData(imgdata, 0, 0);
+  var pixel = ctx.getImageData(0, 0, 1, 1, {colorSpace:"display-p3", pixelFormat:"rgba-float16"});
+  assert_approx_equals(pixel.data[0], 1, 0.01);
+  assert_approx_equals(pixel.data[1], 0, 0.01);
+  assert_approx_equals(pixel.data[2], 0, 0.01);
+  assert_approx_equals(pixel.data[3], 1, 0.01);
+  t.done();
+});
+done();
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/wide-gamut-canvas/2d.color.space.p3.to.srgb.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/wide-gamut-canvas/2d.color.space.p3.to.srgb.html
index 0197c10a..7d22528 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/wide-gamut-canvas/2d.color.space.p3.to.srgb.html
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/wide-gamut-canvas/2d.color.space.p3.to.srgb.html
@@ -7,11 +7,11 @@
 <script src="/html/canvas/resources/canvas-tests.js"></script>
 
 <h1>2d.color.space.p3.to.srgb</h1>
-<p class="desc">test getImageData with srsb and uint8 from display p3 uint8 canvas</p>
+<p class="desc">test getImageData with srgb and uint8 from display p3 uint8 canvas</p>
 
 
 <script>
-var t = async_test("test getImageData with srsb and uint8 from display p3 uint8 canvas");
+var t = async_test("test getImageData with srgb and uint8 from display p3 uint8 canvas");
 var t_pass = t.done.bind(t);
 var t_fail = t.step_func(function(reason) {
     throw reason;
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/wide-gamut-canvas/2d.color.space.p3.to.srgb.worker.js b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/wide-gamut-canvas/2d.color.space.p3.to.srgb.worker.js
index da84a68..13ee21933 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/wide-gamut-canvas/2d.color.space.p3.to.srgb.worker.js
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/wide-gamut-canvas/2d.color.space.p3.to.srgb.worker.js
@@ -1,12 +1,12 @@
 // DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py.
 // OffscreenCanvas test in a worker:2d.color.space.p3.to.srgb
-// Description:test getImageData with srsb and uint8 from display p3 uint8 canvas
+// Description:test getImageData with srgb and uint8 from display p3 uint8 canvas
 // Note:
 
 importScripts("/resources/testharness.js");
 importScripts("/html/canvas/resources/canvas-tests.js");
 
-var t = async_test("test getImageData with srsb and uint8 from display p3 uint8 canvas");
+var t = async_test("test getImageData with srgb and uint8 from display p3 uint8 canvas");
 var t_pass = t.done.bind(t);
 var t_fail = t.step_func(function(reason) {
     throw reason;
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/color_space.yaml b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/color_space.yaml
index 0582f495..118ca1e 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/color_space.yaml
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/color_space.yaml
@@ -17,7 +17,7 @@
     assert_approx_equals(pixel[3], pixel_expected[3], 2);
 
 - name: 2d.color.space.p3.to.srgb
-  desc: test getImageData with srsb and uint8 from display p3 uint8 canvas
+  desc: test getImageData with srgb and uint8 from display p3 uint8 canvas
   attributes: '{colorSpace: "display-p3"}'
   code: |
     var color_style = 'rgb(50, 100, 150)';
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/pixel-manipulation.yaml b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/pixel-manipulation.yaml
index 6721f5f..0dfa9a4 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/pixel-manipulation.yaml
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml/pixel-manipulation.yaml
@@ -158,6 +158,69 @@
     @assert imgdata1.width === imgdata2.width;
     @assert imgdata1.height === imgdata2.height;
 
+- name: 2d.imageData.createImageBitmap.srgb.rgba.unorm8
+  desc: Verify round-trip of 8-bit sRGB data ImageData through ImageBitmap
+  attributes: '{colorSpace: "srgb", colorType:"float16"}'
+  test_type: promise
+  code: |
+    const expectedColor = [ 32, 64, 128, 255 ];
+    var imageData = new ImageData(10, 10, {colorSpace:"srgb", pixelFormat:"rgba-unorm8"});
+    for (let y = 0; y < imageData.height; ++y) {
+      for (let x = 0; x < imageData.width; ++x) {
+        for (let c = 0; c < 4; ++c) {
+          imageData.data[4*(x + y*imageData.width) + c] = expectedColor[c];
+        }
+      }
+    }
+    var bitmap = await createImageBitmap(imageData);
+    ctx.drawImage(bitmap, 0, 0);
+    var pixel = ctx.getImageData(0, 0, 1, 1, {colorSpace:"srgb", pixelFormat:"rgba-unorm8"});
+    for (let c = 0; c < 4; ++c) {
+      assert_approx_equals(pixel.data[c], expectedColor[c], 2);
+    }
+
+- name: 2d.imageData.createImageBitmap.srgb.rgba.float16
+  desc: Verify round-trip of 16-bit float sRGB data ImageData through ImageBitmap
+  attributes: '{colorSpace: "srgb", colorType:"float16"}'
+  test_type: promise
+  code: |
+    const expectedColor = [ 1.0, 2.0, -1.0, 1.0 ];
+    var imageData = new ImageData(10, 10, {colorSpace:"srgb", pixelFormat:"rgba-float16"});
+    for (let y = 0; y < imageData.height; ++y) {
+      for (let x = 0; x < imageData.width; ++x) {
+        for (let c = 0; c < 4; ++c) {
+          imageData.data[4*(x + y*imageData.width) + c] = expectedColor[c];
+        }
+      }
+    }
+    var bitmap = await createImageBitmap(imageData);
+    ctx.drawImage(bitmap, 0, 0);
+    var pixel = ctx.getImageData(0, 0, 1, 1, {colorSpace:"srgb", pixelFormat:"rgba-float16"});
+    for (let c = 0; c < 4; ++c) {
+      assert_approx_equals(pixel.data[c], expectedColor[c], 0.01);
+    }
+
+- name: 2d.imageData.createImageBitmap.p3.rgba.unorm8
+  desc: Verify round-trip of 8-bit P3 data ImageData through ImageBitmap
+  attributes: '{colorSpace: "srgb", colorType:"float16"}'
+  test_type: promise
+  code: |
+    const expectedColor = [ 255, 0, 0, 255 ];
+    var imageData = new ImageData(10, 10, {colorSpace:"display-p3", pixelFormat:"rgba-unorm8"});
+    for (let y = 0; y < imageData.height; ++y) {
+      for (let x = 0; x < imageData.width; ++x) {
+        for (let c = 0; c < 4; ++c) {
+          imageData.data[4*(x + y*imageData.width) + c] = expectedColor[c];
+        }
+      }
+    }
+    var bitmap = await createImageBitmap(imageData);
+    ctx.drawImage(bitmap, 0, 0);
+    var pixel = ctx.getImageData(0, 0, 1, 1, {colorSpace:"display-p3", pixelFormat:"rgba-unorm8"});
+    for (let c = 0; c < 4; ++c) {
+      assert_approx_equals(pixel.data[c], expectedColor[c], 2);
+    }
+
 - name: 2d.imageData.create.and.resize
   desc: Verify no crash when resizing an image bitmap to zero.
   canvas_types: ['HtmlCanvas']
@@ -482,6 +545,8 @@
     @assert typeof(imgdata.width) === 'number';
     @assert typeof(imgdata.height) === 'number';
     @assert typeof(imgdata.data) === 'object';
+    @assert typeof(imgdata.colorSpace) === 'string';
+    @assert typeof(imgdata.pixelFormat) === 'string';
 
 - name: 2d.imageData.object.readonly
   desc: ImageData objects properties are read-only
@@ -606,6 +671,69 @@
         @assert throws TypeError new ImageData(new Uint16Array(new SharedArrayBuffer(32)), 4, 2);
     }
 
+- name: 2d.imageData.object.ctor.pixelFormat
+  canvas_types: ['HtmlCanvas']
+  desc: Testing ImageData constructor pixelFormat behaviors
+  code: |
+    function setRGBA(imageData, i, rgba)
+    {
+        var s = i * 4;
+        imageData[s] = rgba[0];
+        imageData[s + 1] = rgba[1];
+        imageData[s + 2] = rgba[2];
+        imageData[s + 3] = rgba[3];
+    }
+
+    function getRGBA(imageData, i)
+    {
+        var result = [];
+        var s = i * 4;
+        for (var j = 0; j < 4; j++) {
+            result[j] = imageData[s + j];
+        }
+        return result;
+    }
+
+    function assertArrayEquals(actual, expected)
+    {
+        @assert typeof actual === "object";
+        @assert actual !== null;
+        @assert "length" in actual === true;
+        @assert actual.length === expected.length;
+        for (var i = 0; i < actual.length; i++) {
+            @assert actual.hasOwnProperty(i) === expected.hasOwnProperty(i);
+            @assert actual[i] === expected[i];
+        }
+    }
+
+    @assert ImageData !== undefined;
+    imageData = new ImageData(100, 50);
+    @assert imageData.pixelFormat === "rgba-unorm8";
+
+    imageData = new ImageData(100, 50, {pixelFormat:"rgba-float16"});
+    @assert imageData.pixelFormat === "rgba-float16";
+    var testColor = [0, -1, 0.5, 1024];
+    setRGBA(imageData.data, 4, testColor);
+    assertArrayEquals(getRGBA(imageData.data, 4), testColor);
+
+    data = new Float16Array(200);
+    imageData = new ImageData(data, 10, 5, {pixelFormat:"rgba-float16"});
+    @assert imageData.pixelFormat === "rgba-float16";
+    @assert imageData.data === data;
+    @assert throws INVALID_STATE_ERR new ImageData(data, 10, 5, {pixelFormat:"rgba-unorm8"});
+    @assert throws INVALID_STATE_ERR new ImageData(data, 10, 5);
+
+    data = new Uint8ClampedArray(200);
+    imageData = new ImageData(data, 10, 5);
+    @assert imageData.pixelFormat === "rgba-unorm8";
+    @assert imageData.data === data;
+    @assert throws INVALID_STATE_ERR new ImageData(data, 10, 5, {pixelFormat:"rgba-float16"});
+
+    @assert throws TypeError new ImageData(data, 10, 5, {pixelFormat:"unorm8"});
+    @assert throws TypeError new ImageData(data, 10, 5, {pixelFormat:"float16"});
+    @assert throws TypeError new ImageData(data, 10, 5, {pixelFormat:"rgba8unorm"});
+    @assert throws TypeError new ImageData(data, 10, 5, {pixelFormat:"rgba16float"});
+
 - name: 2d.imageData.object.ctor.array
   desc: ImageData has a usable constructor
   canvas_types: ['HtmlCanvas']
@@ -776,6 +904,22 @@
     @assert pixel 50,25 ==~ 0,255,0,255;
   expected: green
 
+- name: 2d.imageData.put.basic.rgba.float16
+  desc: putImageData() puts 16-bit floating point image data from getImageData() onto the canvas
+  attributes: '{colorSpace: "srgb", colorType: "float16"}'
+  code: |
+    ctx.fillStyle = 'color(display-p3 1 0 0)';
+    ctx.fillRect(0, 0, 100, 50)
+    var imgdata = ctx.getImageData(0, 0, 100, 50, {colorSpace:"srgb", pixelFormat:"rgba-float16"});
+    ctx.fillStyle = '#f00';
+    ctx.fillRect(0, 0, 100, 50)
+    ctx.putImageData(imgdata, 0, 0);
+    var pixel = ctx.getImageData(0, 0, 1, 1, {colorSpace:"display-p3", pixelFormat:"rgba-float16"});
+    assert_approx_equals(pixel.data[0], 1, 0.01);
+    assert_approx_equals(pixel.data[1], 0, 0.01);
+    assert_approx_equals(pixel.data[2], 0, 0.01);
+    assert_approx_equals(pixel.data[3], 1, 0.01);
+
 - name: 2d.imageData.put.created
   desc: putImageData() puts image data from createImageData() onto the canvas
   code: |
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/resources/storage-access-beyond-cookies-iframe-iframe.html b/third_party/blink/web_tests/external/wpt/storage-access-api/resources/storage-access-beyond-cookies-iframe-iframe.html
index 44ac9cd..9c0bd01 100644
--- a/third_party/blink/web_tests/external/wpt/storage-access-api/resources/storage-access-beyond-cookies-iframe-iframe.html
+++ b/third_party/blink/web_tests/external/wpt/storage-access-api/resources/storage-access-beyond-cookies-iframe-iframe.html
@@ -310,6 +310,68 @@
         handle_shared_worker.port.postMessage("Same-origin handle access");
         break;
       }
+      case "BlobURLDedicatedWorker": {
+        const fetch_unsuccessful_response = "fetch_unsuccessful";
+        const fetch_successful_response = "fetch_successful";
+
+        const can_blob_url_be_fetched_js = `
+          onmessage = async (e) => {
+            const blob_url = e.data;
+            try {
+              const blob = await fetch(blob_url).then(response => response.blob());
+              await blob.text();
+              postMessage("${fetch_successful_response}");
+            } catch(e) {
+              postMessage("${fetch_unsuccessful_response}");
+            }
+          };
+        `;
+
+        // case 1: create dedicated worker w/o granting storage access
+        const worker_blob_url = new Blob([can_blob_url_be_fetched_js], { type: 'text/javascript' });
+        const third_party_blob_url = URL.createObjectURL(worker_blob_url);
+
+        const worker_1 = new Worker(third_party_blob_url);
+
+        await MaybeSetStorageAccess("*", "*", "allowed");
+        const handle = await test_driver.bless("fake user interaction", () => document.requestStorageAccess({all: true}));
+
+        const worker_blob = new Blob(["potato"]);
+        const first_party_blob_url = handle.createObjectURL(worker_blob);
+
+        const worker_response_promise = new Promise((resolve) => {
+          worker_1.onmessage = (e) => { resolve(e.data) };
+          worker_1.postMessage(first_party_blob_url);
+        });
+
+        const worker_response = await worker_response_promise;
+        if (worker_response === fetch_unsuccessful_response) {
+          message = "Dedicated worker expectedly failed fetching first-party blob URL from a third-party context without granting storage access.";
+        } else if (worker_response === fetch_successful_response) {
+          message = "Dedicated worker unexpectedly fetched first-party blob URL from a third-party context without granting storage access.";
+          break;
+        }
+
+        // case 2: create dedicated worker after storage access is granted
+        const worker_2 = new Worker(third_party_blob_url);
+        const worker_response_promise2 = new Promise((resolve) => {
+          worker_2.onmessage = (e) => { resolve(e.data) };
+          worker_2.postMessage(first_party_blob_url);
+        });
+        const worker_response2 = await worker_response_promise2;
+
+        URL.revokeObjectURL(third_party_blob_url);
+        handle.revokeObjectURL(first_party_blob_url);
+        worker_2.terminate();
+
+        if (worker_response2 === fetch_unsuccessful_response) {
+          message = "Dedicated worker unexpectedly failed fetching first-party blob URL from a third-party context with granting storage access.";
+          break;
+        } else if (worker_response2 === fetch_successful_response) {
+          message = "Blob URL DedicatedWorker tests completed successfully.";
+        }
+        break;
+      }
       case "unpartitioned": {
         await MaybeSetStorageAccess("*", "*", "allowed");
         await test_driver.set_permission({ name: 'storage-access' }, 'denied');
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/resources/storage-access-beyond-cookies-iframe.sub.html b/third_party/blink/web_tests/external/wpt/storage-access-api/resources/storage-access-beyond-cookies-iframe.sub.html
index 7d43a06bc..45fd60b 100644
--- a/third_party/blink/web_tests/external/wpt/storage-access-api/resources/storage-access-beyond-cookies-iframe.sub.html
+++ b/third_party/blink/web_tests/external/wpt/storage-access-api/resources/storage-access-beyond-cookies-iframe.sub.html
@@ -133,6 +133,9 @@
         shared_worker.port.postMessage("Cross-origin handle access");
         break;
       }
+      case "BlobURLDedicatedWorker": {
+        break;
+      }
       case "unpartitioned": {
         const channel = handle.BroadcastChannel(id);
         channel.postMessage("Cross-origin handle access");
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/storage-access-beyond-cookies.BlobURLDedicatedWorker.sub.https.tentative.window-expected.txt b/third_party/blink/web_tests/external/wpt/storage-access-api/storage-access-beyond-cookies.BlobURLDedicatedWorker.sub.https.tentative.window-expected.txt
new file mode 100644
index 0000000..29c9c65
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/storage-access-api/storage-access-beyond-cookies.BlobURLDedicatedWorker.sub.https.tentative.window-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] Verify that if the third-party context creates a blob URL using the StorageAccessHandle and sends it to the dedicated worker, the dedicated worker fetch succeeds.
+  assert_equals: expected "Blob URL DedicatedWorker tests completed successfully." but got "Dedicated worker unexpectedly fetched first-party blob URL from a third-party context without granting storage access."
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/storage-access-api/storage-access-beyond-cookies.BlobURLDedicatedWorker.sub.https.tentative.window.js b/third_party/blink/web_tests/external/wpt/storage-access-api/storage-access-beyond-cookies.BlobURLDedicatedWorker.sub.https.tentative.window.js
new file mode 100644
index 0000000..2d04c2ee
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/storage-access-api/storage-access-beyond-cookies.BlobURLDedicatedWorker.sub.https.tentative.window.js
@@ -0,0 +1,22 @@
+// META: script=/resources/testdriver.js
+// META: script=/resources/testdriver-vendor.js
+
+'use strict';
+
+async_test(t => {
+  // Set up a message listener that simply calls t.done() when a message is received.
+  window.addEventListener("message", t.step_func(e => {
+    if (e.data.type != "result") {
+      return;
+    }
+    assert_equals(e.data.message, "Blob URL DedicatedWorker tests completed successfully.");
+    t.done();
+  }));
+
+  // Create an iframe that's cross-site with top-frame.
+  const id = Date.now();
+  let iframe = document.createElement("iframe");
+  iframe.src = "https://{{hosts[alt][]}}:{{ports[https][0]}}/storage-access-api/resources/storage-access-beyond-cookies-iframe.sub.html?type=BlobURLDedicatedWorker&id=" + id;
+  document.body.appendChild(iframe);
+
+}, "Verify that if the third-party context creates a blob URL using the StorageAccessHandle and sends it to the dedicated worker, the dedicated worker fetch succeeds.");
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/commitStyles.html b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/commitStyles.html
index 9a7dbea..26c8342e 100644
--- a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/commitStyles.html
+++ b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/commitStyles.html
@@ -24,431 +24,31 @@
   );
 }
 
-test(t => {
-  const div = createDiv(t);
-  div.style.opacity = '0.1';
-
-  const animation = div.animate(
-    { opacity: 0.2 },
-    { duration: 1, fill: 'forwards' }
-  );
-  animation.finish();
-
-  animation.commitStyles();
-
-  // Cancel the animation so we can inspect the underlying style
-  animation.cancel();
-
-  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.2);
-}, 'Commits styles');
+// -------------------------
+// Tests covering elements not capable of having a style attribute
+// --------------------
 
 test(t => {
-  const div = createDiv(t);
-  div.style.translate = '100px';
-  div.style.rotate = '45deg';
-  div.style.scale = '2';
-
-  const animation = div.animate(
-    { translate: '200px',
-      rotate: '90deg',
-      scale: 3 },
-    { duration: 1, fill: 'forwards' }
-  );
-  animation.finish();
-
-  animation.commitStyles();
-
-  // Cancel the animation so we can inspect the underlying style
-  animation.cancel();
-
-  assert_equals(getComputedStyle(div).translate, '200px');
-  assert_equals(getComputedStyle(div).rotate, '90deg');
-  assert_numeric_style_equals(getComputedStyle(div).scale, 3);
-}, 'Commits styles for individual transform properties');
-
-promise_test(async t => {
-  const div = createDiv(t);
-  div.style.opacity = '0.1';
-
-  const animA = div.animate(
-    { opacity: 0.2 },
-    { duration: 1, fill: 'forwards' }
-  );
-  const animB = div.animate(
-    { opacity: 0.3 },
+  const animation = createDiv(t).animate(
+    { opacity: 0 },
     { duration: 1, fill: 'forwards' }
   );
 
-  await animA.finished;
-
-  animB.cancel();
-
-  animA.commitStyles();
-
-  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.2);
-}, 'Commits styles for an animation that has been removed');
-
-test(t => {
-  const div = createDiv(t);
-  div.style.margin = '10px';
-
-  const animation = div.animate(
-    { margin: '20px' },
-    { duration: 1, fill: 'forwards' }
+  const nonStyleElement = document.createElementNS(
+    'http://example.org/test',
+    'test'
   );
-  animation.finish();
+  document.body.appendChild(nonStyleElement);
+  animation.effect.target = nonStyleElement;
 
-  animation.commitStyles();
-
-  animation.cancel();
-
-  assert_equals(div.style.marginLeft, '20px');
-}, 'Commits shorthand styles');
-
-test(t => {
-  const div = createDiv(t);
-  div.style.marginLeft = '10px';
-
-  const animation = div.animate(
-    { marginInlineStart: '20px' },
-    { duration: 1, fill: 'forwards' }
-  );
-  animation.finish();
-
-  animation.commitStyles();
-
-  animation.cancel();
-
-  assert_equals(getComputedStyle(div).marginLeft, '20px');
-}, 'Commits logical properties');
-
-test(t => {
-  const div = createDiv(t);
-  div.style.marginLeft = '10px';
-
-  const animation = div.animate(
-    { marginInlineStart: '20px' },
-    { duration: 1, fill: 'forwards' }
-  );
-  animation.finish();
-
-  animation.commitStyles();
-
-  animation.cancel();
-
-  assert_equals(div.style.marginLeft, '20px');
-}, 'Commits logical properties as physical properties');
-
-test(t => {
-  const div = createDiv(t);
-  div.style.marginLeft = '10px';
-
-  const animation = div.animate({ opacity: [0.2, 0.7] }, 1000);
-  animation.currentTime = 500;
-  animation.commitStyles();
-  animation.cancel();
-
-  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.45);
-}, 'Commits values calculated mid-interval');
-
-test(t => {
-  const div = createDiv(t);
-  div.style.setProperty('--target', '0.5');
-
-  const animation = div.animate(
-    { opacity: 'var(--target)' },
-    { duration: 1, fill: 'forwards' }
-  );
-  animation.finish();
-  animation.commitStyles();
-  animation.cancel();
-
-  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.5);
-
-  // Changes to the variable should have no effect
-  div.style.setProperty('--target', '1');
-
-  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.5);
-}, 'Commits variable references as their computed values');
-
-
-test(t => {
-  const div = createDiv(t);
-  div.style.setProperty('--target', '0.5');
-  div.style.opacity = 'var(--target)';
-  const animation = div.animate(
-    { '--target': 0.8 },
-    { duration: 1, fill: 'forwards' }
-  );
-  animation.finish();
-  animation.commitStyles();
-  animation.cancel();
-
-  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.8);
-}, 'Commits custom variables');
-
-test(t => {
-  const div = createDiv(t);
-  div.style.fontSize = '10px';
-
-  const animation = div.animate(
-    { width: '10em' },
-    { duration: 1, fill: 'forwards' }
-  );
-  animation.finish();
-  animation.commitStyles();
-  animation.cancel();
-
-  assert_numeric_style_equals(getComputedStyle(div).width, 100);
-
-  div.style.fontSize = '20px';
-  assert_numeric_style_equals(getComputedStyle(div).width, 100,
-      "Changes to the font-size should have no effect");
-}, 'Commits em units as pixel values');
-
-test(t => {
-  const div = createDiv(t);
-  div.style.fontSize = '10px';
-
-  const animation = div.animate(
-    { lineHeight: '1.5' },
-    { duration: 1, fill: 'forwards' }
-  );
-  animation.finish();
-  animation.commitStyles();
-  animation.cancel();
-
-  assert_numeric_style_equals(getComputedStyle(div).lineHeight, 15);
-  assert_equals(div.style.lineHeight, "1.5", "line-height is committed as a relative value");
-
-  div.style.fontSize = '20px';
-  assert_numeric_style_equals(getComputedStyle(div).lineHeight, 30,
-      "Changes to the font-size should affect the committed line-height");
-
-}, 'Commits relative line-height');
-
-test(t => {
-  const div = createDiv(t);
-  const animation = div.animate(
-    { transform: 'translate(20px, 20px)' },
-    { duration: 1, fill: 'forwards' }
-  );
-  animation.finish();
-  animation.commitStyles();
-  animation.cancel();
-  assert_equals(getComputedStyle(div).transform, 'matrix(1, 0, 0, 1, 20, 20)');
-}, 'Commits transforms');
-
-test(t => {
-  const div = createDiv(t);
-  const animation = div.animate(
-    { transform: 'translate(20px, 20px)' },
-    { duration: 1, fill: 'forwards' }
-  );
-  animation.finish();
-  animation.commitStyles();
-  animation.cancel();
-  assert_equals(div.style.transform, 'translate(20px, 20px)');
-}, 'Commits transforms as a transform list');
-
-test(t => {
-  const div = createDiv(t);
-  div.style.width = '200px';
-  div.style.height = '200px';
-
-  const animation = div.animate({ transform: ["translate(100%, 0%)", "scale(3)"] }, 1000);
-  animation.currentTime = 500;
-  animation.commitStyles();
-  animation.cancel();
-
-  // TODO(https://github.com/w3c/csswg-drafts/issues/2854):
-  // We can't check the committed value directly since it is not specced yet in this case,
-  // but it should still produce the correct resolved value.
-  assert_equals(getComputedStyle(div).transform, "matrix(2, 0, 0, 2, 100, 0)",
-      "Resolved transform is correct after commit.");
-}, 'Commits matrix-interpolated relative transforms');
-
-test(t => {
-  const div = createDiv(t);
-  div.style.width = '200px';
-  div.style.height = '200px';
-
-  const animation = div.animate({ transform: ["none", "none"] }, 1000);
-  animation.currentTime = 500;
-  animation.commitStyles();
-  animation.cancel();
-
-  assert_equals(div.style.transform, "none",
-      "Resolved transform is correct after commit.");
-}, 'Commits "none" transform');
-
-promise_test(async t => {
-  const div = createDiv(t);
-  div.style.opacity = '0.1';
-
-  const animA = div.animate(
-    { opacity: '0.2' },
-    { duration: 1, fill: 'forwards' }
-  );
-  const animB = div.animate(
-    { opacity: '0.2', composite: 'add' },
-    { duration: 1, fill: 'forwards' }
-  );
-  const animC = div.animate(
-    { opacity: '0.3', composite: 'add' },
-    { duration: 1, fill: 'forwards' }
-  );
-
-  animA.persist();
-  animB.persist();
-
-  await animB.finished;
-
-  // The values above have been chosen such that various error conditions
-  // produce results that all differ from the desired result:
-  //
-  //  Expected result:
-  //
-  //    animA + animB = 0.4
-  //
-  //  Likely error results:
-  //
-  //    <underlying> = 0.1
-  //    (Commit didn't work at all)
-  //
-  //    animB = 0.2
-  //    (Didn't add at all when resolving)
-  //
-  //    <underlying> + animB = 0.3
-  //    (Added to the underlying value instead of lower-priority animations when
-  //    resolving)
-  //
-  //    <underlying> + animA + animB = 0.5
-  //    (Didn't respect the composite mode of lower-priority animations)
-  //
-  //    animA + animB + animC = 0.7
-  //    (Resolved the whole stack, not just up to the target effect)
-  //
-
-  animB.commitStyles();
-
-  animA.cancel();
-  animB.cancel();
-  animC.cancel();
-
-  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.4);
-}, 'Commits the intermediate value of an animation in the middle of stack');
-
-promise_test(async t => {
-  const div = createDiv(t);
-  div.style.opacity = '0.1';
-
-  const animA = div.animate(
-    { opacity: '0.2', composite: 'add' },
-    { duration: 1, fill: 'forwards' }
-  );
-  const animB = div.animate(
-    { opacity: '0.2', composite: 'add' },
-    { duration: 1, fill: 'forwards' }
-  );
-  const animC = div.animate(
-    { opacity: '0.3', composite: 'add' },
-    { duration: 1, fill: 'forwards' }
-  );
-
-  animA.persist();
-  animB.persist();
-  await animB.finished;
-
-  // The error cases are similar to the above test with one additional case;
-  // verifying that the animations composite on top of the correct underlying
-  // base style.
-  //
-  //  Expected result:
-  //
-  //  <underlying> + animA + animB = 0.5
-  //
-  //  Additional error results:
-  //
-  //    <underlying> + animA + animB + animC + animA + animB = 1.0 (saturates)
-  //    (Added to the computed value instead of underlying value when
-  //    resolving)
-  //
-  //    animA + animB = 0.4
-  //    Failed to composite on top of underlying value.
-  //
-
-  animB.commitStyles();
-
-  animA.cancel();
-  animB.cancel();
-  animC.cancel();
-
-  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.5);
-}, 'Commit composites on top of the underlying value');
-
-promise_test(async t => {
-  const div = createDiv(t);
-  div.style.opacity = '0.1';
-
-  // Setup animation
-  const animation = div.animate(
-    { opacity: 0.2 },
-    { duration: 1, fill: 'forwards' }
-  );
-  animation.finish();
-
-  // Setup observer
-  const mutationRecords = [];
-  const observer = new MutationObserver(mutations => {
-    mutationRecords.push(...mutations);
+  assert_throws_dom('NoModificationAllowedError', () => {
+    animation.commitStyles();
   });
-  observer.observe(div, { attributes: true, attributeOldValue: true });
 
-  animation.commitStyles();
-
-  // Wait for mutation records to be dispatched
-  await Promise.resolve();
-
-  assert_equals(mutationRecords.length, 1, 'Should have one mutation record');
-
-  const mutation = mutationRecords[0];
-  assert_equals(mutation.type, 'attributes');
-  assert_equals(mutation.oldValue, 'opacity: 0.1;');
-
-  observer.disconnect();
-}, 'Triggers mutation observers when updating style');
-
-promise_test(async t => {
-  const div = createDiv(t);
-  div.style.opacity = '0.2';
-
-  // Setup animation
-  const animation = div.animate(
-    { opacity: 0.2 },
-    { duration: 1, fill: 'forwards' }
-  );
-  animation.finish();
-
-  // Setup observer
-  const mutationRecords = [];
-  const observer = new MutationObserver(mutations => {
-    mutationRecords.push(...mutations);
-  });
-  observer.observe(div, { attributes: true });
-
-  animation.commitStyles();
-
-  // Wait for mutation records to be dispatched
-  await Promise.resolve();
-
-  assert_equals(mutationRecords.length, 0, 'Should have no mutation records');
-
-  observer.disconnect();
-}, 'Does NOT trigger mutation observers when the change to style is redundant');
+  nonStyleElement.remove();
+}, 'Throws if the target element is not something with a style attribute');
 
 test(t => {
-
   const div = createDiv(t);
   div.classList.add('pseudo');
   const animation = div.animate(
@@ -462,22 +62,37 @@
 }, 'Throws if the target element is a pseudo element');
 
 test(t => {
-  const animation = createDiv(t).animate(
+  const div = createDiv(t);
+  div.classList.add('pseudo');
+  const animation = div.animate(
     { opacity: 0 },
-    { duration: 1, fill: 'forwards' }
+    { duration: 1, fill: 'forwards', pseudoElement: '::before' }
   );
 
-  const nonStyleElement
-    = document.createElementNS('http://example.org/test', 'test');
-  document.body.appendChild(nonStyleElement);
-  animation.effect.target = nonStyleElement;
+  div.remove();
 
   assert_throws_dom('NoModificationAllowedError', () => {
     animation.commitStyles();
   });
+}, 'Checks the pseudo element condition before the not rendered condition');
 
-  nonStyleElement.remove();
-}, 'Throws if the target element is not something with a style attribute');
+// -------------------------
+// Tests covering elements that are not being rendered
+// -------------------------
+
+test(t => {
+  const div = createDiv(t);
+  const animation = div.animate(
+    { opacity: 0 },
+    { duration: 1, fill: 'forwards' }
+  );
+
+  div.remove();
+
+  assert_throws_dom('InvalidStateError', () => {
+    animation.commitStyles();
+  });
+}, 'Throws if the target effect is disconnected');
 
 test(t => {
   const div = createDiv(t);
@@ -544,34 +159,472 @@
   });
 }, 'Treats display:contents in a display:none subtree as not rendered');
 
+// -------------------------
+// Tests covering various parts of the active interval
+// -------------------------
+
 test(t => {
   const div = createDiv(t);
+  div.style.opacity = '0.1';
+
   const animation = div.animate(
-    { opacity: 0 },
+    { opacity: 0.2 },
+    { duration: 1, fill: 'forwards' }
+  );
+  animation.finish();
+
+  animation.commitStyles();
+
+  // Cancel the animation so we can inspect the underlying style
+  animation.cancel();
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.2);
+}, 'Commits styles');
+
+test(t => {
+  const div = createDiv(t);
+  div.style.marginLeft = '10px';
+
+  const animation = div.animate({ opacity: [0.2, 0.7] }, 1000);
+  animation.currentTime = 500;
+  animation.commitStyles();
+  animation.cancel();
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.45);
+}, 'Commits values calculated mid-interval');
+
+// -------------------------
+// Tests covering various parts of the stack
+// -------------------------
+
+promise_test(async t => {
+  const div = createDiv(t);
+  div.style.opacity = '0.1';
+
+  const animA = div.animate(
+    { opacity: '0.2' },
+    { duration: 1, fill: 'forwards' }
+  );
+  const animB = div.animate(
+    { opacity: '0.2', composite: 'add' },
+    { duration: 1, fill: 'forwards' }
+  );
+  const animC = div.animate(
+    { opacity: '0.3', composite: 'add' },
     { duration: 1, fill: 'forwards' }
   );
 
-  div.remove();
+  animA.persist();
+  animB.persist();
 
-  assert_throws_dom('InvalidStateError', () => {
-    animation.commitStyles();
-  });
-}, 'Throws if the target effect is disconnected');
+  await animB.finished;
+
+  // The values above have been chosen such that various error conditions
+  // produce results that all differ from the desired result:
+  //
+  //  Expected result:
+  //
+  //    animA + animB = 0.4
+  //
+  //  Likely error results:
+  //
+  //    <underlying> = 0.1
+  //    (Commit didn't work at all)
+  //
+  //    animB = 0.2
+  //    (Didn't add at all when resolving)
+  //
+  //    <underlying> + animB = 0.3
+  //    (Added to the underlying value instead of lower-priority animations when
+  //    resolving)
+  //
+  //    <underlying> + animA + animB = 0.5
+  //    (Didn't respect the composite mode of lower-priority animations)
+  //
+  //    animA + animB + animC = 0.7
+  //    (Resolved the whole stack, not just up to the target effect)
+  //
+
+  animB.commitStyles();
+
+  animA.cancel();
+  animB.cancel();
+  animC.cancel();
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.4);
+}, 'Commits the intermediate value of an animation in the middle of stack');
+
+promise_test(async t => {
+  const div = createDiv(t);
+  div.style.opacity = '0.1';
+
+  const animA = div.animate(
+    { opacity: 0.2 },
+    { duration: 1, fill: 'forwards' }
+  );
+  const animB = div.animate(
+    { opacity: 0.3 },
+    { duration: 1, fill: 'forwards' }
+  );
+
+  await animA.finished;
+
+  animB.cancel();
+
+  animA.commitStyles();
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.2);
+}, 'Commits styles for an animation that has been removed');
+
+promise_test(async t => {
+  const div = createDiv(t);
+  div.style.opacity = '0.1';
+
+  const animA = div.animate(
+    { opacity: '0.2', composite: 'add' },
+    { duration: 1, fill: 'forwards' }
+  );
+  const animB = div.animate(
+    { opacity: '0.2', composite: 'add' },
+    { duration: 1, fill: 'forwards' }
+  );
+  const animC = div.animate(
+    { opacity: '0.3', composite: 'add' },
+    { duration: 1, fill: 'forwards' }
+  );
+
+  animA.persist();
+  animB.persist();
+  await animB.finished;
+
+  // The error cases are similar to the above test with one additional case;
+  // verifying that the animations composite on top of the correct underlying
+  // base style.
+  //
+  //  Expected result:
+  //
+  //  <underlying> + animA + animB = 0.5
+  //
+  //  Additional error results:
+  //
+  //    <underlying> + animA + animB + animC + animA + animB = 1.0 (saturates)
+  //    (Added to the computed value instead of underlying value when
+  //    resolving)
+  //
+  //    animA + animB = 0.4
+  //    Failed to composite on top of underlying value.
+  //
+
+  animB.commitStyles();
+
+  animA.cancel();
+  animB.cancel();
+  animC.cancel();
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.5);
+}, 'Commit composites on top of the underlying value');
+
+// -------------------------
+// Tests covering handling of logical properties
+// -------------------------
 
 test(t => {
   const div = createDiv(t);
-  div.classList.add('pseudo');
+  div.style.marginLeft = '10px';
+
   const animation = div.animate(
-    { opacity: 0 },
-    { duration: 1, fill: 'forwards', pseudoElement: '::before' }
+    { marginInlineStart: '20px' },
+    { duration: 1, fill: 'forwards' }
+  );
+  animation.finish();
+
+  animation.commitStyles();
+
+  animation.cancel();
+
+  assert_equals(getComputedStyle(div).marginLeft, '20px');
+}, 'Commits logical properties');
+
+test(t => {
+  const div = createDiv(t);
+  div.style.marginLeft = '10px';
+
+  const animation = div.animate(
+    { marginInlineStart: '20px' },
+    { duration: 1, fill: 'forwards' }
+  );
+  animation.finish();
+
+  animation.commitStyles();
+
+  animation.cancel();
+
+  assert_equals(div.style.marginLeft, '20px');
+}, 'Commits logical properties as physical properties');
+
+test(t => {
+  const div = createDiv(t);
+  div.style.fontSize = '10px';
+
+  const animation = div.animate(
+    { width: '10em' },
+    { duration: 1, fill: 'forwards' }
+  );
+  animation.finish();
+  animation.commitStyles();
+  animation.cancel();
+
+  assert_numeric_style_equals(getComputedStyle(div).width, 100);
+
+  div.style.fontSize = '20px';
+  assert_numeric_style_equals(
+    getComputedStyle(div).width,
+    100,
+    'Changes to the font-size should have no effect'
+  );
+}, 'Commits em units as pixel values');
+
+// -------------------------
+// Tests covering CSS variables
+// -------------------------
+
+test(t => {
+  const div = createDiv(t);
+  div.style.setProperty('--target', '0.5');
+  div.style.opacity = 'var(--target)';
+  const animation = div.animate(
+    { '--target': 0.8 },
+    { duration: 1, fill: 'forwards' }
+  );
+  animation.finish();
+  animation.commitStyles();
+  animation.cancel();
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.8);
+}, 'Commits custom variables');
+
+test(t => {
+  const div = createDiv(t);
+  div.style.setProperty('--target', '0.5');
+
+  const animation = div.animate(
+    { opacity: 'var(--target)' },
+    { duration: 1, fill: 'forwards' }
+  );
+  animation.finish();
+  animation.commitStyles();
+  animation.cancel();
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.5);
+
+  // Changes to the variable should have no effect
+  div.style.setProperty('--target', '1');
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.5);
+}, 'Commits variable references as their computed values');
+
+// -------------------------
+// Tests covering the composition of specific properties
+// (e.g. line-height, transforms)
+// -------------------------
+
+test(t => {
+  const div = createDiv(t);
+  div.style.fontSize = '10px';
+
+  const animation = div.animate(
+    { lineHeight: '1.5' },
+    { duration: 1, fill: 'forwards' }
+  );
+  animation.finish();
+  animation.commitStyles();
+  animation.cancel();
+
+  assert_numeric_style_equals(getComputedStyle(div).lineHeight, 15);
+  assert_equals(
+    div.style.lineHeight,
+    '1.5',
+    'line-height is committed as a relative value'
   );
 
-  div.remove();
+  div.style.fontSize = '20px';
+  assert_numeric_style_equals(
+    getComputedStyle(div).lineHeight,
+    30,
+    'Changes to the font-size should affect the committed line-height'
+  );
+}, 'Commits relative line-height');
 
-  assert_throws_dom('NoModificationAllowedError', () => {
-    animation.commitStyles();
+test(t => {
+  const div = createDiv(t);
+  const animation = div.animate(
+    { transform: 'translate(20px, 20px)' },
+    { duration: 1, fill: 'forwards' }
+  );
+  animation.finish();
+  animation.commitStyles();
+  animation.cancel();
+  assert_equals(
+    getComputedStyle(div).transform,
+    'matrix(1, 0, 0, 1, 20, 20)'
+  );
+}, 'Commits transforms');
+
+test(t => {
+  const div = createDiv(t);
+  div.style.translate = '100px';
+  div.style.rotate = '45deg';
+  div.style.scale = '2';
+
+  const animation = div.animate(
+    { translate: '200px', rotate: '90deg', scale: 3 },
+    { duration: 1, fill: 'forwards' }
+  );
+  animation.finish();
+
+  animation.commitStyles();
+
+  // Cancel the animation so we can inspect the underlying style
+  animation.cancel();
+
+  assert_equals(getComputedStyle(div).translate, '200px');
+  assert_equals(getComputedStyle(div).rotate, '90deg');
+  assert_numeric_style_equals(getComputedStyle(div).scale, 3);
+}, 'Commits styles for individual transform properties');
+
+test(t => {
+  const div = createDiv(t);
+  const animation = div.animate(
+    { transform: 'translate(20px, 20px)' },
+    { duration: 1, fill: 'forwards' }
+  );
+  animation.finish();
+  animation.commitStyles();
+  animation.cancel();
+  assert_equals(div.style.transform, 'translate(20px, 20px)');
+}, 'Commits transforms as a transform list');
+
+test(t => {
+  const div = createDiv(t);
+  div.style.width = '200px';
+  div.style.height = '200px';
+
+  const animation = div.animate(
+    { transform: ['translate(100%, 0%)', 'scale(3)'] },
+    1000
+  );
+  animation.currentTime = 500;
+  animation.commitStyles();
+  animation.cancel();
+
+  // TODO(https://github.com/w3c/csswg-drafts/issues/2854):
+  // We can't check the committed value directly since it is not specced yet in this case,
+  // but it should still produce the correct resolved value.
+  assert_equals(
+    getComputedStyle(div).transform,
+    'matrix(2, 0, 0, 2, 100, 0)',
+    'Resolved transform is correct after commit.'
+  );
+}, 'Commits matrix-interpolated relative transforms');
+
+test(t => {
+  const div = createDiv(t);
+  div.style.width = '200px';
+  div.style.height = '200px';
+
+  const animation = div.animate({ transform: ['none', 'none'] }, 1000);
+  animation.currentTime = 500;
+  animation.commitStyles();
+  animation.cancel();
+
+  assert_equals(
+    div.style.transform,
+    'none',
+    'Resolved transform is correct after commit.'
+  );
+}, "Commits 'none' transform");
+
+test(t => {
+  const div = createDiv(t);
+  div.style.margin = '10px';
+
+  const animation = div.animate(
+    { margin: '20px' },
+    { duration: 1, fill: 'forwards' }
+  );
+  animation.finish();
+
+  animation.commitStyles();
+
+  animation.cancel();
+
+  assert_equals(div.style.marginLeft, '20px');
+}, 'Commits shorthand styles');
+
+// -------------------------
+// Tests related to setting the style attributes
+// (e.g. mutation observer related ones)
+// -------------------------
+
+promise_test(async t => {
+  const div = createDiv(t);
+  div.style.opacity = '0.1';
+
+  // Setup animation
+  const animation = div.animate(
+    { opacity: 0.2 },
+    { duration: 1, fill: 'forwards' }
+  );
+  animation.finish();
+
+  // Setup observer
+  const mutationRecords = [];
+  const observer = new MutationObserver(mutations => {
+    mutationRecords.push(...mutations);
   });
-}, 'Checks the pseudo element condition before the not rendered condition');
+  observer.observe(div, { attributes: true, attributeOldValue: true });
+
+  animation.commitStyles();
+
+  // Wait for mutation records to be dispatched
+  await Promise.resolve();
+
+  assert_equals(mutationRecords.length, 1, 'Should have one mutation record');
+
+  const mutation = mutationRecords[0];
+  assert_equals(mutation.type, 'attributes');
+  assert_equals(mutation.oldValue, 'opacity: 0.1;');
+
+  observer.disconnect();
+}, 'Triggers mutation observers when updating style');
+
+promise_test(async t => {
+  const div = createDiv(t);
+  div.style.opacity = '0.2';
+
+  // Setup animation
+  const animation = div.animate(
+    { opacity: 0.2 },
+    { duration: 1, fill: 'forwards' }
+  );
+  animation.finish();
+
+  // Setup observer
+  const mutationRecords = [];
+  const observer = new MutationObserver(mutations => {
+    mutationRecords.push(...mutations);
+  });
+  observer.observe(div, { attributes: true });
+
+  animation.commitStyles();
+
+  // Wait for mutation records to be dispatched
+  await Promise.resolve();
+
+  assert_equals(mutationRecords.length, 0, 'Should have no mutation records');
+
+  observer.disconnect();
+}, 'Does NOT trigger mutation observers when the change to style is redundant');
 
 </script>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/commitStyles.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/commitStyles.tentative-expected.txt
new file mode 100644
index 0000000..b4b70f68
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/commitStyles.tentative-expected.txt
@@ -0,0 +1,37 @@
+This is a testharness.js-based test.
+[FAIL] Commits styles
+  assert_approx_equals: expected 0.2 +/- 0.0001 but got 0.1
+[FAIL] Commits styles for backwards animation
+  assert_approx_equals: expected 0.5 +/- 0.0001 but got 0.1
+[FAIL] Commits the intermediate value of an animation in the middle of stack
+  assert_approx_equals: expected 0.4 +/- 0.0001 but got 0.2
+[FAIL] Commits the intermediate value of an animation up to the middle of the stack
+  assert_approx_equals: expected 0.4 +/- 0.0001 but got 0.1
+[FAIL] Commits styles for an animation that has been removed
+  assert_approx_equals: expected 0.2 +/- 0.0001 but got 0.1
+[FAIL] Commit composites on top of the underlying value
+  assert_approx_equals: expected 0.5 +/- 0.0001 but got 0.3
+[FAIL] Commits logical properties
+  assert_equals: expected "20px" but got "10px"
+[FAIL] Commits logical properties as physical properties
+  assert_equals: expected "20px" but got "10px"
+[FAIL] Commits em units as pixel values
+  assert_approx_equals: expected 100 +/- 0.0001 but got 784
+[FAIL] Commits custom variables
+  assert_approx_equals: expected 0.8 +/- 0.0001 but got 0.5
+[FAIL] Commits variable references as their computed values
+  assert_approx_equals: expected 0.5 +/- 0.0001 but got 1
+[FAIL] Commits relative line-height
+  assert_approx_equals: expected 15 +/- 0.0001 but got NaN
+[FAIL] Commits transforms
+  assert_equals: expected "matrix(1, 0, 0, 1, 20, 20)" but got "none"
+[FAIL] Commits styles for individual transform properties
+  assert_equals: expected "200px" but got "100px"
+[FAIL] Commits transforms as a transform list
+  assert_equals: expected "translate(20px, 20px)" but got "none"
+[FAIL] Commits shorthand styles
+  assert_equals: expected "20px" but got "10px"
+[FAIL] Triggers mutation observers when updating style
+  assert_equals: Should have one mutation record expected 1 but got 0
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/commitStyles.tentative.html b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/commitStyles.tentative.html
new file mode 100644
index 0000000..8b7d089
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/web-animations/interfaces/Animation/commitStyles.tentative.html
@@ -0,0 +1,717 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Animation.commitStyles</title>
+<link rel="help" href="https://drafts.csswg.org/web-animations/#dom-animation-commitstyles">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../testcommon.js"></script>
+<style>
+.pseudo::before {content: '';}
+.pseudo::after {content: '';}
+.pseudo::marker {content: '';}
+</style>
+<body>
+<div id="log"></div>
+<script>
+
+// This file tests the proposed updated behavior of `Animation.commitStyles`.
+//
+// See: https://github.com/w3c/csswg-drafts/issues/5394
+//
+// If that proposal is merged into the spec, this file should replace the
+// existing `./commitStyles.html`.
+
+'use strict';
+
+function assert_numeric_style_equals(opacity, expected, description) {
+  return assert_approx_equals(
+    parseFloat(opacity),
+    expected,
+    0.0001,
+    description
+  );
+}
+
+// -------------------------
+// Tests covering elements not capable of having a style attribute
+// --------------------
+
+test(t => {
+  const animation = createDiv(t).animate(
+    { opacity: 0 },
+    { duration: 1 }
+  );
+
+  const nonStyleElement = document.createElementNS(
+    'http://example.org/test',
+    'test'
+  );
+  document.body.appendChild(nonStyleElement);
+  animation.effect.target = nonStyleElement;
+
+  assert_throws_dom('NoModificationAllowedError', () => {
+    animation.commitStyles();
+  });
+
+  nonStyleElement.remove();
+}, 'Throws if the target element is not something with a style attribute');
+
+test(t => {
+  const div = createDiv(t);
+  div.classList.add('pseudo');
+  const animation = div.animate(
+    { opacity: 0 },
+    { duration: 1, pseudoElement: '::before' }
+  );
+
+  assert_throws_dom('NoModificationAllowedError', () => {
+    animation.commitStyles();
+  });
+}, 'Throws if the target element is a pseudo element');
+
+test(t => {
+  const div = createDiv(t);
+  div.classList.add('pseudo');
+  const animation = div.animate(
+    { opacity: 0 },
+    { duration: 1, pseudoElement: '::before' }
+  );
+
+  div.remove();
+
+  assert_throws_dom('NoModificationAllowedError', () => {
+    animation.commitStyles();
+  });
+}, 'Checks the pseudo element condition before the not rendered condition');
+
+// -------------------------
+// Tests covering elements that are not being rendered
+// -------------------------
+
+test(t => {
+  const div = createDiv(t);
+  const animation = div.animate(
+    { opacity: 0 },
+    { duration: 1 }
+  );
+
+  div.remove();
+
+  assert_throws_dom('InvalidStateError', () => {
+    animation.commitStyles();
+  });
+}, 'Throws if the target effect is disconnected');
+
+test(t => {
+  const div = createDiv(t);
+  const animation = div.animate(
+    { opacity: 0 },
+    { duration: 1 }
+  );
+
+  div.style.display = 'none';
+
+  assert_throws_dom('InvalidStateError', () => {
+    animation.commitStyles();
+  });
+}, 'Throws if the target effect is display:none');
+
+test(t => {
+  const container = createDiv(t);
+  const div = createDiv(t);
+  container.append(div);
+
+  const animation = div.animate(
+    { opacity: 0 },
+    { duration: 1 }
+  );
+
+  container.style.display = 'none';
+
+  assert_throws_dom('InvalidStateError', () => {
+    animation.commitStyles();
+  });
+}, "Throws if the target effect's ancestor is display:none");
+
+test(t => {
+  const container = createDiv(t);
+  const div = createDiv(t);
+  container.append(div);
+
+  const animation = div.animate(
+    { opacity: 0 },
+    { duration: 1 }
+  );
+
+  container.style.display = 'contents';
+
+  // Should NOT throw
+  animation.commitStyles();
+}, 'Treats display:contents as rendered');
+
+test(t => {
+  const container = createDiv(t);
+  const div = createDiv(t);
+  container.append(div);
+
+  const animation = div.animate(
+    { opacity: 0 },
+    { duration: 1 }
+  );
+
+  div.style.display = 'contents';
+  container.style.display = 'none';
+
+  assert_throws_dom('InvalidStateError', () => {
+    animation.commitStyles();
+  });
+}, 'Treats display:contents in a display:none subtree as not rendered');
+
+// -------------------------
+// Tests covering various parts of the active interval
+// -------------------------
+
+test(t => {
+  const div = createDiv(t);
+  div.style.opacity = '0.1';
+
+  const animation = div.animate(
+    { opacity: 0.2 },
+    { duration: 1 }
+  );
+  animation.finish();
+
+  animation.commitStyles();
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.2);
+}, 'Commits styles');
+
+test(t => {
+    const div = createDiv(t);
+    div.style.opacity = '0.1';
+
+    const animation = div.animate(
+        { opacity: [0.5, 1] },
+        { duration: 1 }
+    );
+    animation.playbackRate = -1;
+    animation.finish();
+
+    animation.commitStyles();
+
+    assert_numeric_style_equals(getComputedStyle(div).opacity, 0.5);
+}, 'Commits styles for backwards animation');
+
+test(t => {
+  const div = createDiv(t);
+  div.style.marginLeft = '10px';
+
+  const animation = div.animate({ opacity: [0.2, 0.7] }, 1000);
+  animation.currentTime = 500;
+  animation.commitStyles();
+  animation.cancel();
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.45);
+}, 'Commits values calculated mid-interval');
+
+test(t => {
+  const div = createDiv(t);
+  div.style.opacity = '0';
+
+  const animation = div.animate(
+    { opacity: 1 },
+    { duration: 1000, delay: 1000 }
+  );
+  animation.currentTime = 500;
+  animation.commitStyles();
+  animation.cancel();
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0);
+}, 'Commits values during the start delay');
+
+test(t => {
+  const div = createDiv(t);
+  div.style.opacity = '0';
+
+  const animation = div.animate(
+    { opacity: 1 },
+    { duration: 1000, delay: 1000 }
+  );
+  animation.currentTime = 2100;
+  animation.commitStyles();
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0);
+}, 'Commits value after the active interval');
+
+// -------------------------
+// Tests covering various parts of the stack
+// -------------------------
+
+promise_test(async t => {
+  const div = createDiv(t);
+  div.style.opacity = '0.1';
+
+  const animA = div.animate(
+    { opacity: '0.2' },
+    { duration: 1, fill: 'forwards' }
+  );
+  const animB = div.animate(
+    { opacity: '0.2', composite: 'add' },
+    { duration: 1 }
+  );
+  const animC = div.animate(
+    { opacity: '0.3', composite: 'add' },
+    { duration: 1 }
+  );
+
+  animA.persist();
+  animB.persist();
+
+  await animB.finished;
+
+  // The values above have been chosen such that various error conditions
+  // produce results that all differ from the desired result:
+  //
+  //  Expected result:
+  //
+  //    animA + animB = 0.4
+  //
+  //  Likely error results:
+  //
+  //    <underlying> = 0.1
+  //    (Commit didn't work at all)
+  //
+  //    animB = 0.2
+  //    (Didn't add at all when resolving)
+  //
+  //    <underlying> + animB = 0.3
+  //    (Added to the underlying value instead of lower-priority animations when
+  //    resolving)
+  //
+  //    <underlying> + animA + animB = 0.5
+  //    (Didn't respect the composite mode of lower-priority animations)
+  //
+  //    animA + animB + animC = 0.7
+  //    (Resolved the whole stack, not just up to the target effect)
+  //
+
+  animB.commitStyles();
+
+  animA.cancel();
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.4);
+}, 'Commits the intermediate value of an animation in the middle of stack');
+
+promise_test(async t => {
+  const div = createDiv(t);
+  div.style.opacity = '0.1';
+
+  const animA = div.animate(
+    { opacity: '0.2' },
+    { duration: 1 }
+  );
+  const animB = div.animate(
+    { opacity: '0.2', composite: 'add' },
+    { duration: 1 }
+  );
+  const animC = div.animate(
+    { opacity: '0.3', composite: 'add' },
+    { duration: 1 }
+  );
+
+  animA.persist();
+  animB.persist();
+
+  await animB.finished;
+
+  // The values above have been chosen such that various error conditions
+  // produce results that all differ from the desired result:
+  //
+  //  Expected result:
+  //
+  //    animA + animB = 0.4
+  //
+  //  Likely error results:
+  //
+  //    <underlying> = 0.1
+  //    (Commit didn't work at all)
+  //
+  //    animB = 0.2
+  //    (Didn't add at all when resolving)
+  //
+  //    <underlying> + animB = 0.3
+  //    (Added to the underlying value instead of lower-priority animations when
+  //    resolving)
+  //
+  //    <underlying> + animA + animB = 0.5
+  //    (Didn't respect the composite mode of lower-priority animations)
+  //
+  //    animA + animB + animC = 0.7
+  //    (Resolved the whole stack, not just up to the target effect)
+  //
+
+  animA.commitStyles();
+  animB.commitStyles();
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.4);
+}, 'Commits the intermediate value of an animation up to the middle of the stack');
+
+promise_test(async t => {
+  const div = createDiv(t);
+  div.style.opacity = '0.1';
+
+  const animA = div.animate(
+    { opacity: 0.2 },
+    { duration: 1 }
+  );
+  const animB = div.animate(
+    { opacity: 0.3 },
+    { duration: 1 }
+  );
+
+  await animA.finished;
+
+  animB.cancel();
+
+  animA.commitStyles();
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.2);
+}, 'Commits styles for an animation that has been removed');
+
+promise_test(async t => {
+  const div = createDiv(t);
+  div.style.opacity = '0.1';
+
+  const animA = div.animate(
+    { opacity: '0.2', composite: 'add' },
+    { duration: 1, fill: 'forwards' }
+  );
+  const animB = div.animate(
+    { opacity: '0.2', composite: 'add' },
+    { duration: 1 }
+  );
+  const animC = div.animate(
+    { opacity: '0.3', composite: 'add' },
+    { duration: 1 }
+  );
+
+  animA.persist();
+  animB.persist();
+  await animB.finished;
+
+  // The error cases are similar to the above test with one additional case;
+  // verifying that the animations composite on top of the correct underlying
+  // base style.
+  //
+  //  Expected result:
+  //
+  //  <underlying> + animA + animB = 0.5
+  //
+  //  Additional error results:
+  //
+  //    <underlying> + animA + animB + animC + animA + animB = 1.0 (saturates)
+  //    (Added to the computed value instead of underlying value when
+  //    resolving)
+  //
+  //    animA + animB = 0.4
+  //    Failed to composite on top of underlying value.
+  //
+
+  animB.commitStyles();
+
+  animA.cancel();
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.5);
+}, 'Commit composites on top of the underlying value');
+
+// -------------------------
+// Tests covering handling of logical properties
+// -------------------------
+
+test(t => {
+  const div = createDiv(t);
+  div.style.marginLeft = '10px';
+
+  const animation = div.animate(
+    { marginInlineStart: '20px' },
+    { duration: 1 }
+  );
+  animation.finish();
+
+  animation.commitStyles();
+
+  assert_equals(getComputedStyle(div).marginLeft, '20px');
+}, 'Commits logical properties');
+
+test(t => {
+  const div = createDiv(t);
+  div.style.marginLeft = '10px';
+
+  const animation = div.animate(
+    { marginInlineStart: '20px' },
+    { duration: 1 }
+  );
+  animation.finish();
+
+  animation.commitStyles();
+
+  assert_equals(div.style.marginLeft, '20px');
+}, 'Commits logical properties as physical properties');
+
+test(t => {
+  const div = createDiv(t);
+  div.style.fontSize = '10px';
+
+  const animation = div.animate(
+    { width: '10em' },
+    { duration: 1 }
+  );
+  animation.finish();
+  animation.commitStyles();
+
+  assert_numeric_style_equals(getComputedStyle(div).width, 100);
+
+  div.style.fontSize = '20px';
+  assert_numeric_style_equals(
+    getComputedStyle(div).width,
+    100,
+    'Changes to the font-size should have no effect'
+  );
+}, 'Commits em units as pixel values');
+
+// -------------------------
+// Tests covering CSS variables
+// -------------------------
+
+test(t => {
+  const div = createDiv(t);
+  div.style.setProperty('--target', '0.5');
+  div.style.opacity = 'var(--target)';
+  const animation = div.animate(
+    { '--target': 0.8 },
+    { duration: 1 }
+  );
+  animation.finish();
+  animation.commitStyles();
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.8);
+}, 'Commits custom variables');
+
+test(t => {
+  const div = createDiv(t);
+  div.style.setProperty('--target', '0.5');
+
+  const animation = div.animate(
+    { opacity: 'var(--target)' },
+    { duration: 1 }
+  );
+  animation.finish();
+  animation.commitStyles();
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.5);
+
+  // Changes to the variable should have no effect
+  div.style.setProperty('--target', '1');
+
+  assert_numeric_style_equals(getComputedStyle(div).opacity, 0.5);
+}, 'Commits variable references as their computed values');
+
+// -------------------------
+// Tests covering the composition of specific properties
+// (e.g. line-height, transforms)
+// -------------------------
+
+test(t => {
+  const div = createDiv(t);
+  div.style.fontSize = '10px';
+
+  const animation = div.animate(
+    { lineHeight: '1.5' },
+    { duration: 1 }
+  );
+  animation.finish();
+  animation.commitStyles();
+
+  assert_numeric_style_equals(getComputedStyle(div).lineHeight, 15);
+  assert_equals(
+    div.style.lineHeight,
+    '1.5',
+    'line-height is committed as a relative value'
+  );
+
+  div.style.fontSize = '20px';
+  assert_numeric_style_equals(
+    getComputedStyle(div).lineHeight,
+    30,
+    'Changes to the font-size should affect the committed line-height'
+  );
+}, 'Commits relative line-height');
+
+test(t => {
+  const div = createDiv(t);
+  const animation = div.animate(
+    { transform: 'translate(20px, 20px)' },
+    { duration: 1 }
+  );
+  animation.finish();
+  animation.commitStyles();
+
+  assert_equals(
+    getComputedStyle(div).transform,
+    'matrix(1, 0, 0, 1, 20, 20)'
+  );
+}, 'Commits transforms');
+
+test(t => {
+  const div = createDiv(t);
+  div.style.translate = '100px';
+  div.style.rotate = '45deg';
+  div.style.scale = '2';
+
+  const animation = div.animate(
+    { translate: '200px', rotate: '90deg', scale: 3 },
+    { duration: 1 }
+  );
+  animation.finish();
+
+  animation.commitStyles();
+
+  assert_equals(getComputedStyle(div).translate, '200px');
+  assert_equals(getComputedStyle(div).rotate, '90deg');
+  assert_numeric_style_equals(getComputedStyle(div).scale, 3);
+}, 'Commits styles for individual transform properties');
+
+test(t => {
+  const div = createDiv(t);
+  const animation = div.animate(
+    { transform: 'translate(20px, 20px)' },
+    { duration: 1 }
+  );
+  animation.finish();
+  animation.commitStyles();
+
+  assert_equals(div.style.transform, 'translate(20px, 20px)');
+}, 'Commits transforms as a transform list');
+
+test(t => {
+  const div = createDiv(t);
+  div.style.width = '200px';
+  div.style.height = '200px';
+
+  const animation = div.animate(
+    { transform: ['translate(100%, 0%)', 'scale(3)'] },
+    1000
+  );
+  animation.currentTime = 500;
+  animation.commitStyles();
+  animation.cancel();
+
+  // TODO(https://github.com/w3c/csswg-drafts/issues/2854):
+  // We can't check the committed value directly since it is not specced yet in this case,
+  // but it should still produce the correct resolved value.
+  assert_equals(
+    getComputedStyle(div).transform,
+    'matrix(2, 0, 0, 2, 100, 0)',
+    'Resolved transform is correct after commit.'
+  );
+}, 'Commits matrix-interpolated relative transforms');
+
+test(t => {
+  const div = createDiv(t);
+  div.style.width = '200px';
+  div.style.height = '200px';
+
+  const animation = div.animate({ transform: ['none', 'none'] }, 1000);
+  animation.currentTime = 500;
+  animation.commitStyles();
+  animation.cancel();
+
+  assert_equals(
+    div.style.transform,
+    'none',
+    'Resolved transform is correct after commit.'
+  );
+}, "Commits 'none' transform");
+
+test(t => {
+  const div = createDiv(t);
+  div.style.margin = '10px';
+
+  const animation = div.animate(
+    { margin: '20px' },
+    { duration: 1 }
+  );
+  animation.finish();
+
+  animation.commitStyles();
+
+  assert_equals(div.style.marginLeft, '20px');
+}, 'Commits shorthand styles');
+
+// -------------------------
+// Tests related to setting the style attributes
+// (e.g. mutation observer related ones)
+// -------------------------
+
+promise_test(async t => {
+  const div = createDiv(t);
+  div.style.opacity = '0.1';
+
+  // Setup animation
+  const animation = div.animate(
+    { opacity: 0.2 },
+    { duration: 1 }
+  );
+  animation.finish();
+
+  // Setup observer
+  const mutationRecords = [];
+  const observer = new MutationObserver(mutations => {
+    mutationRecords.push(...mutations);
+  });
+  observer.observe(div, { attributes: true, attributeOldValue: true });
+
+  animation.commitStyles();
+
+  // Wait for mutation records to be dispatched
+  await Promise.resolve();
+
+  assert_equals(mutationRecords.length, 1, 'Should have one mutation record');
+
+  const mutation = mutationRecords[0];
+  assert_equals(mutation.type, 'attributes');
+  assert_equals(mutation.oldValue, 'opacity: 0.1;');
+
+  observer.disconnect();
+}, 'Triggers mutation observers when updating style');
+
+promise_test(async t => {
+  const div = createDiv(t);
+  div.style.opacity = '0.2';
+
+  // Setup animation
+  const animation = div.animate(
+    { opacity: 0.2 },
+    { duration: 1 }
+  );
+  animation.finish();
+
+  // Setup observer
+  const mutationRecords = [];
+  const observer = new MutationObserver(mutations => {
+    mutationRecords.push(...mutations);
+  });
+  observer.observe(div, { attributes: true });
+
+  animation.commitStyles();
+
+  // Wait for mutation records to be dispatched
+  await Promise.resolve();
+
+  assert_equals(mutationRecords.length, 0, 'Should have no mutation records');
+
+  observer.disconnect();
+}, 'Does NOT trigger mutation observers when the change to style is redundant');
+
+</script>
+</body>
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt b/third_party/blink/web_tests/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/platform/win/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt
rename to third_party/blink/web_tests/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt
diff --git a/third_party/blink/web_tests/platform/linux/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png b/third_party/blink/web_tests/platform/linux/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png
deleted file mode 100644
index f9c2096d..0000000
--- a/third_party/blink/web_tests/platform/linux/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac14-arm64/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png b/third_party/blink/web_tests/platform/mac-mac14-arm64/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png
deleted file mode 100644
index fd6dbf2..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14-arm64/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/cast.https.any_npu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/cast.https.any_npu-expected.txt
deleted file mode 100644
index e80c1f9..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/cast.https.any_npu-expected.txt
+++ /dev/null
@@ -1,73 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] cast float32 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast float32 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast float32 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast float32 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast float16 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast float16 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast float16 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast float16 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast int32 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int32 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int32 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to float32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to float16
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to int32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to float32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to float16
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to int32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to float32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to float16
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to int32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to float32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to float16
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to int32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any_npu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any_npu-expected.txt
deleted file mode 100644
index 33956e8..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any_npu-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] dequantizeLinear uint4 1D tensor with even input size
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'dequantizeLinear' on 'MLGraphBuilder': Unsupported data type uint4 for argument input, must be one of [int32, uint32, int8, uint8]."
-[FAIL] dequantizeLinear uint4 1D tensor with odd input size
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'dequantizeLinear' on 'MLGraphBuilder': Unsupported data type uint4 for argument input, must be one of [int32, uint32, int8, uint8]."
-[FAIL] dequantizeLinear uint4 4D constant tensor broadcasting zeroPoint
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'dequantizeLinear' on 'MLGraphBuilder': Unsupported data type uint4 for argument input, must be one of [int32, uint32, int8, uint8]."
-[FAIL] dequantizeLinear uint4 3D input with block_size = [1, 1, 2]
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'dequantizeLinear' on 'MLGraphBuilder': Unsupported data type uint4 for argument input, must be one of [int32, uint32, int8, uint8]."
-[FAIL] dequantizeLinear int4 1D tensor with even size
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'dequantizeLinear' on 'MLGraphBuilder': Unsupported data type int4 for argument input, must be one of [int32, uint32, int8, uint8]."
-[FAIL] dequantizeLinear int4 1D tensor with odd size
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'dequantizeLinear' on 'MLGraphBuilder': Unsupported data type int4 for argument input, must be one of [int32, uint32, int8, uint8]."
-[FAIL] per-tensor dequantizeLinear for int4 4D constant
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'dequantizeLinear' on 'MLGraphBuilder': Unsupported data type int4 for argument input, must be one of [int32, uint32, int8, uint8]."
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/cast.https.any_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/cast.https.any_gpu-expected.txt
deleted file mode 100644
index e80c1f9..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/cast.https.any_gpu-expected.txt
+++ /dev/null
@@ -1,73 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] cast float32 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast float32 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast float32 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast float32 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast float16 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast float16 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast float16 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast float16 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast int32 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int32 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int32 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to float32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to float16
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to int32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to float32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to float16
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to int32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to float32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to float16
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to int32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to float32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to float16
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to int32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any_gpu-expected.txt
deleted file mode 100644
index 33956e8..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any_gpu-expected.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] dequantizeLinear uint4 1D tensor with even input size
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'dequantizeLinear' on 'MLGraphBuilder': Unsupported data type uint4 for argument input, must be one of [int32, uint32, int8, uint8]."
-[FAIL] dequantizeLinear uint4 1D tensor with odd input size
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'dequantizeLinear' on 'MLGraphBuilder': Unsupported data type uint4 for argument input, must be one of [int32, uint32, int8, uint8]."
-[FAIL] dequantizeLinear uint4 4D constant tensor broadcasting zeroPoint
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'dequantizeLinear' on 'MLGraphBuilder': Unsupported data type uint4 for argument input, must be one of [int32, uint32, int8, uint8]."
-[FAIL] dequantizeLinear uint4 3D input with block_size = [1, 1, 2]
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'dequantizeLinear' on 'MLGraphBuilder': Unsupported data type uint4 for argument input, must be one of [int32, uint32, int8, uint8]."
-[FAIL] dequantizeLinear int4 1D tensor with even size
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'dequantizeLinear' on 'MLGraphBuilder': Unsupported data type int4 for argument input, must be one of [int32, uint32, int8, uint8]."
-[FAIL] dequantizeLinear int4 1D tensor with odd size
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'dequantizeLinear' on 'MLGraphBuilder': Unsupported data type int4 for argument input, must be one of [int32, uint32, int8, uint8]."
-[FAIL] per-tensor dequantizeLinear for int4 4D constant
-  promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'dequantizeLinear' on 'MLGraphBuilder': Unsupported data type int4 for argument input, must be one of [int32, uint32, int8, uint8]."
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/gru.https.any_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/gru.https.any_gpu-expected.txt
deleted file mode 100644
index 5b37deb..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/gru.https.any_gpu-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-All subtests passed and are omitted for brevity.
-See https://chromium.googlesource.com/chromium/src/+/HEAD/docs/testing/writing_web_tests.md#Text-Test-Baselines for details.
-Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/reduce_l2.https.any_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/reduce_l2.https.any_gpu-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/reduce_l2.https.any_gpu-expected.txt
rename to third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/reduce_l2.https.any_gpu-expected.txt
diff --git a/third_party/blink/web_tests/platform/mac-mac14/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt
deleted file mode 100644
index 5b37deb..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-All subtests passed and are omitted for brevity.
-See https://chromium.googlesource.com/chromium/src/+/HEAD/docs/testing/writing_web_tests.md#Text-Test-Baselines for details.
-Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/mac-mac14/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt
deleted file mode 100644
index 64bf532d..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] Finishing an animation fires finish event when a finish event listener is added as the finished promise resolves
-  assert_true: Timed out waiting for finish expected true got false
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/cast.https.any_npu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/cast.https.any_npu-expected.txt
deleted file mode 100644
index 2ada0c7..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/cast.https.any_npu-expected.txt
+++ /dev/null
@@ -1,77 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] cast float32 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast float32 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast float32 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast float32 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast float16 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast float16 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast float16 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast float16 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast int32 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int32 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int32 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to float32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to float16
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to int32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to float32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to float16
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to int32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int8 0D constant tensor to int32
-  assert_true: assert_array_approx_equals_ulp: test cast int32 actual 0 should be close enough to expected 17 by the acceptable 0 ULP distance, but they have 17 ULP distance expected true got false
-[FAIL] cast int8 1D constant tensor to int32
-  assert_true: assert_array_approx_equals_ulp: test cast int32 actual 0 should be close enough to expected 123 by the acceptable 0 ULP distance, but they have 123 ULP distance expected true got false
-[FAIL] cast int8 4D tensor to float32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to float16
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to int32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to float32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to float16
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to int32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any_npu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any_npu-expected.txt
index 2cf0321..33956e8 100644
--- a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any_npu-expected.txt
+++ b/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any_npu-expected.txt
@@ -1,6 +1,4 @@
 This is a testharness.js-based test.
-[FAIL] dequantizeLinear int8 4D constant tensor with block_size = [3, 2]
-  assert_true: assert_array_approx_equals_ulp: test dequantizeLinear float32 actual 0 should be close enough to expected -35.00859069824219 by the acceptable 1 ULP distance, but they have 1108084940 ULP distance expected true got false
 [FAIL] dequantizeLinear uint4 1D tensor with even input size
   promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'dequantizeLinear' on 'MLGraphBuilder': Unsupported data type uint4 for argument input, must be one of [int32, uint32, int8, uint8]."
 [FAIL] dequantizeLinear uint4 1D tensor with odd input size
diff --git a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/identity.https.any_npu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/identity.https.any_npu-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/identity.https.any_npu-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/reduce_product.https.any_npu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/reduce_product.https.any_npu-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/reduce_product.https.any_npu-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/reduce_sum.https.any_npu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/reduce_sum.https.any_npu-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/reduce_sum.https.any_npu-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/cast.https.any_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/cast.https.any_gpu-expected.txt
deleted file mode 100644
index 2ada0c7..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/cast.https.any_gpu-expected.txt
+++ /dev/null
@@ -1,77 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] cast float32 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast float32 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast float32 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast float32 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast float16 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast float16 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast float16 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast float16 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast int32 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int32 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int32 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, output 'output' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to float32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to float16
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to int32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast uint32 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint32 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to float32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to float16
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to int32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int64 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int64 must be one of [float32,float16,int32]."
-[FAIL] cast int8 0D constant tensor to int32
-  assert_true: assert_array_approx_equals_ulp: test cast int32 actual 0 should be close enough to expected 17 by the acceptable 0 ULP distance, but they have 17 ULP distance expected true got false
-[FAIL] cast int8 1D constant tensor to int32
-  assert_true: assert_array_approx_equals_ulp: test cast int32 actual 0 should be close enough to expected 123 by the acceptable 0 ULP distance, but they have 123 ULP distance expected true got false
-[FAIL] cast int8 4D tensor to float32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to float16
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to int32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast int8 4D tensor to uint8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type int8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to float32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to float16
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to int32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to uint32
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to int64
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-[FAIL] cast uint8 4D tensor to int8
-  promise_test: Unhandled rejection with value: object "TypeError: Unsupported data type, input 'input' data type uint8 must be one of [float32,float16,int32]."
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any_gpu-expected.txt
index 2cf0321..33956e8 100644
--- a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any_gpu-expected.txt
+++ b/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/dequantizeLinear.https.any_gpu-expected.txt
@@ -1,6 +1,4 @@
 This is a testharness.js-based test.
-[FAIL] dequantizeLinear int8 4D constant tensor with block_size = [3, 2]
-  assert_true: assert_array_approx_equals_ulp: test dequantizeLinear float32 actual 0 should be close enough to expected -35.00859069824219 by the acceptable 1 ULP distance, but they have 1108084940 ULP distance expected true got false
 [FAIL] dequantizeLinear uint4 1D tensor with even input size
   promise_test: Unhandled rejection with value: object "TypeError: Failed to execute 'dequantizeLinear' on 'MLGraphBuilder': Unsupported data type uint4 for argument input, must be one of [int32, uint32, int8, uint8]."
 [FAIL] dequantizeLinear uint4 1D tensor with odd input size
diff --git a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/gru.https.any_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/gru.https.any_gpu-expected.txt
deleted file mode 100644
index 05a88dd..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/gru.https.any_gpu-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] gru float32 tensors steps=2 with options.bias, options.recurrentBias, options.direction='both' and options.returnSequence=true
-  assert_true: assert_array_approx_equals_ulp: test gru float32 actual -2.213313102722168 should be close enough to expected -2.213315725326538 by the acceptable 6 ULP distance, but they have 11 ULP distance expected true got false
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/identity.https.any.serviceworker_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/identity.https.any.serviceworker_gpu-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/identity.https.any.serviceworker_gpu-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/identity.https.any.sharedworker_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/identity.https.any.sharedworker_gpu-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/identity.https.any.sharedworker_gpu-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/identity.https.any.worker_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/identity.https.any.worker_gpu-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/identity.https.any.worker_gpu-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/reduce_max.https.any_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/reduce_max.https.any_gpu-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/reduce_max.https.any_gpu-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/reduce_mean.https.any_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/reduce_mean.https.any_gpu-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/reduce_mean.https.any_gpu-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/reduce_min.https.any_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/reduce_min.https.any_gpu-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/reduce_min.https.any_gpu-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/reduce_sum.https.any_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/reduce_sum.https.any_gpu-expected.txt
deleted file mode 100644
index d2490db..0000000
--- a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/reduce_sum.https.any_gpu-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This is a testharness.js-based test.
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt
deleted file mode 100644
index 5b37deb..0000000
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-All subtests passed and are omitted for brevity.
-See https://chromium.googlesource.com/chromium/src/+/HEAD/docs/testing/writing_web_tests.md#Text-Test-Baselines for details.
-Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt
deleted file mode 100644
index 64bf532d..0000000
--- a/third_party/blink/web_tests/platform/mac-mac15-arm64/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] Finishing an animation fires finish event when a finish event listener is added as the finished promise resolves
-  assert_true: Timed out waiting for finish expected true got false
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt
deleted file mode 100644
index 8e20281..0000000
--- a/third_party/blink/web_tests/platform/mac/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] scroll-state(snapped) matching #snapped2 while scrolling
-  assert_equals: snapchanging has been called for #snapped2 expected (object) Element node <div id="snapped2" class="snapped">\n  <span id="target2">... but got (undefined) undefined
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png b/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png
deleted file mode 100644
index e8fbb97d..0000000
--- a/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png b/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png
deleted file mode 100644
index fe31a89..0000000
--- a/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/transforms/3d/point-mapping/3d-point-mapping-coplanar.html b/third_party/blink/web_tests/transforms/3d/point-mapping/3d-point-mapping-coplanar.html
deleted file mode 100644
index 851b9fc..0000000
--- a/third_party/blink/web_tests/transforms/3d/point-mapping/3d-point-mapping-coplanar.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<html>
-<head>
-  <title>Hit test coplanar elements</title>
-  <script src="point-mapping-helpers.js" type="text/javascript" charset="utf-8"></script>
-  
-  <script type="text/javascript" charset="utf-8">
-    
-    function test()
-    {
-      dispatchEvent(44, 44, 'box1', 1, 1);
-      dispatchEvent(70, 59, 'box2', 1, 1);
-      dispatchEvent(70, 101, 'box3', 1, 1);
-      dispatchEvent(70, 144, 'box4', 1, 1);
-    }
-    
-  </script>
-  <style type="text/css" media="screen">
-  
-    body {
-      margin: 0;
-      border: 1px solid black;
-      cursor: crosshair;
-    }
-
-    .test {
-      display: inline-block;
-      height: 300px;
-      width: 300px;
-      border: 1px solid black;
-      margin: 20px;
-    }
-
-    .box {
-      height: 200px;
-      width: 200px;
-      -webkit-box-sizing: border-box;
-      background-color: #DDD;
-      border: 1px solid black;
-    }
-
-    .box:hover {
-      outline: 3px solid orange;
-    }
-    
-    .container {
-      position: relative;
-      height: 260px;
-      width: 260px;
-      margin: 20px;
-      border: 1px solid black;
-      -webkit-box-sizing: border-box;
-      -webkit-perspective: 400;
-    }
-    
-    .transformed {
-      position: absolute;
-      top: 20px;
-      left: 30px;
-      height: 100px;
-      width: 200px;
-      border: 1px solid black;
-      background-color: #AAA;
-      -webkit-box-sizing: border-box;
-      transform: translateZ(20px);
-    }
-    
-    #results {
-      position: absolute;
-      left: 30px;
-      top: 400px;
-    }
-    
-    #mousepos {
-      position: absolute;
-      left: 30px;
-      top: 700px;
-      color: gray;
-      font-size: smaller;
-    }
-  </style>
-</head>
-<body onclick="clicked(event)">
-
-<div id="results"></div>
-<div class="test">
-  <!-- Simple transformed div in perpsective -->
-  <div class="container box" id="box1">
-    <div class="transformed box" id="box2"></div>
-    <div class="transformed box" id="box3" style="top: 60px;"></div>
-    <div class="transformed box" id="box4" style="top: 100px;"></div>
-  </div>
-</div>
-<p>When hit-testing coplanar elements, document order wins.</p>
-
-<div id="mousepos"></div>
-
-</body>
-</html>
diff --git a/third_party/blink/web_tests/virtual/bypass-csp-for-preloads-disabled/README.md b/third_party/blink/web_tests/virtual/bypass-csp-for-preloads-disabled/README.md
new file mode 100644
index 0000000..02ebd321
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/bypass-csp-for-preloads-disabled/README.md
@@ -0,0 +1,8 @@
+# virtual/bypass-csp-for-preloads-disabled
+
+This directory is for tests that need the BypassCSPForPreloads feature flag
+disabled to match the experimental behavior where CSP is not bypassed for
+preloads.
+Tests under `virtual/bypass-csp-for-preloads-disabled` are run with
+`--disable-features=BypassCSPForPreloads` and
+`--enable-features=PreloadLinkRelDataUrls`.
diff --git a/third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/identity.https.any.serviceworker_npu-expected.txt b/third_party/blink/web_tests/virtual/cross-partition-blob-url/external/wpt/storage-access-api/storage-access-beyond-cookies.BlobURLDedicatedWorker.sub.https.tentative.window-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/platform/mac-mac14/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/identity.https.any.serviceworker_npu-expected.txt
rename to third_party/blink/web_tests/virtual/cross-partition-blob-url/external/wpt/storage-access-api/storage-access-beyond-cookies.BlobURLDedicatedWorker.sub.https.tentative.window-expected.txt
diff --git a/third_party/blink/web_tests/virtual/preload-link-rel-dataurls-disabled/README.md b/third_party/blink/web_tests/virtual/preload-link-rel-dataurls-disabled/README.md
new file mode 100644
index 0000000..6219712
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/preload-link-rel-dataurls-disabled/README.md
@@ -0,0 +1,7 @@
+# virtual/preload-link-rel-dataurls-disabled
+
+This directory is for tests that need the PreloadLinkRelDataUrls feature flag
+disabled to match the experimental behavior where we do not support preloading
+data URLs.
+Tests under `virtual/preload-link-rel-dataurls-disabled` are run with
+`--disable-features=PreloadLinkRelDataUrls,BypassCSPForPreloads`.
diff --git a/third_party/blink/web_tests/wpt_internal/html/canvas/context-lost/2d-context-lost-and-reused-in-same-task-element.html b/third_party/blink/web_tests/wpt_internal/html/canvas/context-lost/2d-context-lost-and-reused-in-same-task-element.html
new file mode 100644
index 0000000..076c7ea
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/html/canvas/context-lost/2d-context-lost-and-reused-in-same-task-element.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./2d-context-lost-and-reused-in-same-task-impl.js"></script>
+<canvas id="canvas"></canvas>
+<script>
+/**
+ * Tests losing the GPU context and keep using an HTMLCanvasElement in the same
+ * task, before the canvas realizes that the context is lost.
+ */
+promise_test(async () => {
+  const canvas = document.getElementById('canvas');
+  await TestLosingAndReusingCanvasInSameTask(canvas);
+}, 'HTMLCanvasElement can be used in the same task the GPU process died.');
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/html/canvas/context-lost/2d-context-lost-and-reused-in-same-task-impl.js b/third_party/blink/web_tests/wpt_internal/html/canvas/context-lost/2d-context-lost-and-reused-in-same-task-impl.js
new file mode 100644
index 0000000..7265347
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/html/canvas/context-lost/2d-context-lost-and-reused-in-same-task-impl.js
@@ -0,0 +1,50 @@
+assert_true(!!window.chrome && !!chrome.gpuBenchmarking,
+  'This test requires chrome.gpuBenchmarking.');
+
+/**
+ * Test losing the GPU context and keep using the canvas in the same task,
+ * before the canvas realizes that the context is lost.
+ */
+async function TestLosingAndReusingCanvasInSameTask(canvas) {
+  const ctx = canvas.getContext('2d',
+                                // Stay on GPU acceleration despite read-backs.
+                                {willReadFrequently: false});
+
+  // Draw in the next frame to make sure a cc::Layer is created.
+  await new Promise(resolve => requestAnimationFrame(resolve));
+  ctx.fillStyle = 'red';
+  ctx.fillRect(0, 0, 100, 100);
+
+  // Lose context in the next frame.
+  await new Promise(resolve => requestAnimationFrame(resolve));
+  chrome.gpuBenchmarking.terminateGpuProcessNormally();
+
+  // Reading back an accelerated canvas requires a roundtrip to the GPU process,
+  // causing the implementation to realize it's no longer there.
+  ctx.getImageData(2, 2, 1, 1);
+
+  // The canvas is still unaware that the context is lost. Drawing to a GPU
+  // canvas is no-op regardless. Drawing to a software canvas still works.
+  assert_false(ctx.isContextLost(),
+               'The canvas context should not yet be lost.');
+  ctx.fillStyle = 'blue';
+  ctx.fillRect(0, 0, 100, 100);
+  if (internals.runtimeFlags.accelerated2dCanvasEnabled) {
+    assert_array_equals(
+        ctx.getImageData(2, 2, 1, 1).data, [0, 0, 0, 0],
+        'Draw calls should be no-ops after the GPU process dies.');
+  } else {
+    assert_array_equals(
+        ctx.getImageData(2, 2, 1, 1).data, [0, 0, 255, 255],
+        'Software canvas should still be usable after the GPU process dies.');
+  }
+
+  // Check that the context usable again after it's restored.
+  await new Promise(resolve => { canvas.oncontextrestored = resolve; });
+
+  ctx.fillStyle = 'lime';
+  ctx.fillRect(0, 0, 100, 100);
+  assert_array_equals(
+      ctx.getImageData(2, 2, 1, 1).data, [0, 255, 0, 255],
+      `The canvas should be usable after it's restored.`);
+}
diff --git a/third_party/blink/web_tests/wpt_internal/html/canvas/context-lost/2d-context-lost-and-reused-in-same-task-placeholder.html b/third_party/blink/web_tests/wpt_internal/html/canvas/context-lost/2d-context-lost-and-reused-in-same-task-placeholder.html
new file mode 100644
index 0000000..d7a4b23
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/html/canvas/context-lost/2d-context-lost-and-reused-in-same-task-placeholder.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./2d-context-lost-and-reused-in-same-task-impl.js"></script>
+<canvas id="canvas"></canvas>
+<script>
+/**
+ * Tests losing the GPU context and keep using an OffscreenCanvas with a
+ * placeholder in the same task, before the canvas realizes that the
+ * context is lost.
+ */
+promise_test(async () => {
+  const placeholder = document.getElementById('canvas');
+  const canvas = placeholder.transferControlToOffscreen();
+  await TestLosingAndReusingCanvasInSameTask(canvas);
+}, 'OffscreenCanvas with a placeholder can be used in the same task the GPU ' +
+   'process died.');
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/reduce_screen_size/screen.window.js b/third_party/blink/web_tests/wpt_internal/reduce_screen_size/screen.window.js
new file mode 100644
index 0000000..96d3f32
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/reduce_screen_size/screen.window.js
@@ -0,0 +1,44 @@
+// Testing the impact of the `ReduceScreenSize` flag.
+
+// Opens a new 300x400 window to `about:blank`, positioned at (100,200).
+function open_window(test) {
+  let popup = window.open("", "_blank", "popup, left=100, top=200, width=300, height=400");
+
+  assert_equals(popup.innerWidth, 300, "Inner Width");
+  assert_equals(popup.innerHeight, 400, "Inner Height");
+
+  test.add_cleanup(() => {
+    popup.close();
+  });
+
+  return popup;
+}
+
+test(t => {
+  let popup = open_window(t);
+  assert_not_equals(popup.screen.width, popup.innerWidth, "Width");
+  assert_not_equals(popup.screen.height, popup.innerHeight, "Height");
+  assert_not_equals(popup.screen.availWidth, popup.innerWidth, "Avail Width");
+  assert_not_equals(popup.screen.availHeight, popup.innerHeight, "Avail Height");
+  // `window.screen*` doesn't work in content_shell (and we force content_shell
+  // for `wpt_internal` tests).
+  //
+  // assert_equals(popup.screenX, 100, "screenX");
+  // assert_equals(popup.screenLeft, 100, "screenLeft");
+  // assert_equals(popup.screenY, 200, "screenY");
+  // assert_equals(popup.screenTop, 200, "screenY");
+}, "Verify default behavior.");
+
+test(t => {
+  internals.runtimeFlags.reduceScreenSizeEnabled = true;
+
+  let popup = open_window(t);
+  assert_equals(popup.screen.width, popup.innerWidth, "Width");
+  assert_equals(popup.screen.height, popup.innerHeight, "Height");
+  assert_equals(popup.screen.availWidth, popup.innerWidth, "Avail Width");
+  assert_equals(popup.screen.availHeight, popup.innerHeight, "Avail Height");
+  assert_equals(popup.screenX, 0, "screenX");
+  assert_equals(popup.screenLeft, 0, "screenLeft");
+  assert_equals(popup.screenY, 0, "screenY");
+  assert_equals(popup.screenTop, 0, "screenY");
+}, "Verify reduced behavior.");
diff --git a/third_party/catapult b/third_party/catapult
index c8d1e18..556571f 160000
--- a/third_party/catapult
+++ b/third_party/catapult
@@ -1 +1 @@
-Subproject commit c8d1e184668453ebd5841994a41cc07956fd8ab5
+Subproject commit 556571f9e93b7e4fe6f61c09b0281442722facef
diff --git a/third_party/chromite b/third_party/chromite
index 651eb6a..e30044c 160000
--- a/third_party/chromite
+++ b/third_party/chromite
@@ -1 +1 @@
-Subproject commit 651eb6a4e77910dcea6bb9ab5702c3d16e8477f0
+Subproject commit e30044c14db6ab8011e4bc692bfde46b13b7f5a4
diff --git a/third_party/cros_system_api b/third_party/cros_system_api
index dc032ea..485228a6 160000
--- a/third_party/cros_system_api
+++ b/third_party/cros_system_api
@@ -1 +1 @@
-Subproject commit dc032eaf82d4df9b66c0761a38a3ae914ed4e629
+Subproject commit 485228a6b2213da0e2dd27bf3f6ca29396ed699f
diff --git a/third_party/crossbench b/third_party/crossbench
index dd17e9a..f5a24fd 160000
--- a/third_party/crossbench
+++ b/third_party/crossbench
@@ -1 +1 @@
-Subproject commit dd17e9aa7ed59b8dfdebdcbd33c8a4c7356d16fe
+Subproject commit f5a24fd88bd5137b412f59477878d0782e19ff15
diff --git a/third_party/dawn b/third_party/dawn
index 1a17363..36be462 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit 1a17363f9499dd0054aba7bd372d469317ca1a73
+Subproject commit 36be4620f07d464268815b4933e91db34c99fee6
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index 2e5bee2..3b6a406 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit 2e5bee22ef25bd730a9853640716681e0e0a7656
+Subproject commit 3b6a4060c03f56f901cb39084b52b5ef1dea16fa
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium
index 34833fc..6a9470a 100644
--- a/third_party/freetype/README.chromium
+++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@
 Name: FreeType
 URL: http://www.freetype.org/
-Version: VER-2-13-3-75-g82090e67c
-Revision: 82090e67c24259c343c83fd9cefe6ff0be7a7eca
+Version: VER-2-13-3-76-gfc67794e1
+Revision: fc67794e159a852d5cbaadcaf3d36598435938cc
 CPEPrefix: cpe:/a:freetype:freetype:2.13.3
 License: FTL
 License File: src/docs/FTL.TXT
diff --git a/third_party/freetype/src b/third_party/freetype/src
index 82090e6..fc67794 160000
--- a/third_party/freetype/src
+++ b/third_party/freetype/src
@@ -1 +1 @@
-Subproject commit 82090e67c24259c343c83fd9cefe6ff0be7a7eca
+Subproject commit fc67794e159a852d5cbaadcaf3d36598435938cc
diff --git a/third_party/grpc/README.chromium b/third_party/grpc/README.chromium
index a87178a..8d8c742 100644
--- a/third_party/grpc/README.chromium
+++ b/third_party/grpc/README.chromium
@@ -6,14 +6,14 @@
 Revision: ff8d12a129eedc58f9602c9fa9d1c01a2a270d62
 Security Critical: yes
 Shipped: yes
-CPEPrefix: cpe:/a:grpc:grpc:1.49
+CPEPrefix: cpe:/a:grpc:grpc:1.71
 
 Please note that that the use of gRPC is not generally allowed within Chromium.
 Before integrating with this library, consult with the security team.
 See go/chrome-grpc-advice for more details.
 
 Steps to upgrade to a new version of GRPC, all relative to //third_party/grpc:
-1. Update revision and version information in this file. Version file can be
+1. Update revision, version and CPEPrefix in this file. The version can be
    found in the root BUILD file in gRPC repo.
 2. Run third_party/grpc/update.sh.
 3. Update the BUILD.gn file. ./generate_gn.sh is a script that tries to
diff --git a/third_party/openscreen/src b/third_party/openscreen/src
index db9e1ea..ddc89a0 160000
--- a/third_party/openscreen/src
+++ b/third_party/openscreen/src
@@ -1 +1 @@
-Subproject commit db9e1ea566813606ca055868be13f6ff4a760ab8
+Subproject commit ddc89a049295f3fa6ff01646c0a02eb747eba6af
diff --git a/third_party/perfetto b/third_party/perfetto
index 4df384a..745c6d3 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit 4df384ab8fd5cb376e392f6e245593f9ea221f2f
+Subproject commit 745c6d3fead9008f05ee73172e46d059863b5ab3
diff --git a/third_party/rust/chromium_crates_io/Cargo.lock b/third_party/rust/chromium_crates_io/Cargo.lock
index b5e8b04..6b1d3765 100644
--- a/third_party/rust/chromium_crates_io/Cargo.lock
+++ b/third_party/rust/chromium_crates_io/Cargo.lock
@@ -108,8 +108,8 @@
  "cxx",
  "cxxbridge-cmd",
  "fend-core",
- "ff",
  "font-types",
+ "group",
  "hex",
  "icu_capi",
  "icu_casemap",
@@ -351,6 +351,16 @@
 ]
 
 [[package]]
+name = "group"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "ff",
+ "rand_core 0.9.3",
+ "subtle",
+]
+
+[[package]]
 name = "hashbrown"
 version = "0.15.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/third_party/rust/chromium_crates_io/Cargo.toml b/third_party/rust/chromium_crates_io/Cargo.toml
index c3cecf5..aa2c1df 100644
--- a/third_party/rust/chromium_crates_io/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/Cargo.toml
@@ -49,9 +49,8 @@
 # for authenticated-pseudonyms.
 # TODO(crbug.com/404604413): Stop exposing this here when it becomes a
 # transitive dependency.
-[dependencies.ff]
+[dependencies.group]
 version = "0.13"
-default-features = false
 
 [dependencies.icu_capi]
 version = "2.0.0-beta2"
diff --git a/third_party/rust/chromium_crates_io/patches/group/0001-update-rand-core.patch b/third_party/rust/chromium_crates_io/patches/group/0001-update-rand-core.patch
new file mode 100644
index 0000000..e21bb79
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/patches/group/0001-update-rand-core.patch
@@ -0,0 +1,36 @@
+From 651b16e6b0ab5812450b60f953616ed82cc4187b Mon Sep 17 00:00:00 2001
+From: Theodore Olsauskas-Warren <sauski@google.com>
+Date: Fri, 4 Apr 2025 08:09:47 -0700
+Subject: [PATCH] update-rand-core
+
+TODO(crbug.com/408276016): Upstream this version bump into the group
+repository.
+
+---
+ .../rust/chromium_crates_io/vendor/group-v0_13/Cargo.toml       | 2 +-
+ .../rust/chromium_crates_io/vendor/group-v0_13/rust-toolchain   | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/group-v0_13/Cargo.toml
+index 059f0f76146a3..270336ad54355 100644
+--- a/third_party/rust/chromium_crates_io/vendor/group-v0_13/Cargo.toml
++++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/Cargo.toml
+@@ -35,7 +35,7 @@ optional = true
+ default-features = false
+ 
+ [dependencies.rand_core]
+-version = "0.6"
++version = "0.9"
+ default-features = false
+ 
+ [dependencies.rand_xorshift]
+diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/rust-toolchain b/third_party/rust/chromium_crates_io/vendor/group-v0_13/rust-toolchain
+index 3ebf789f5a8df..af92bdd9f58d1 100644
+--- a/third_party/rust/chromium_crates_io/vendor/group-v0_13/rust-toolchain
++++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/rust-toolchain
+@@ -1 +1 @@
+-1.56.0
++1.63.0
+-- 
+2.49.0.504.g3bcea36a83-goog
+
diff --git a/third_party/rust/chromium_crates_io/supply-chain/config.toml b/third_party/rust/chromium_crates_io/supply-chain/config.toml
index 3825a1d..05b71b03 100644
--- a/third_party/rust/chromium_crates_io/supply-chain/config.toml
+++ b/third_party/rust/chromium_crates_io/supply-chain/config.toml
@@ -161,6 +161,9 @@
 [policy."getrandom:0.2.15"]
 criteria = ["crypto-safe", "safe-to-run"]
 
+[policy."group:0.13.0"]
+criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
+
 [policy."hashbrown:0.15.2"]
 criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"]
 
diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/.cargo-checksum.json b/third_party/rust/chromium_crates_io/vendor/group-v0_13/.cargo-checksum.json
new file mode 100644
index 0000000..697c9ce
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{}}
diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/group-v0_13/.cargo_vcs_info.json
new file mode 100644
index 0000000..dbff4830
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/.cargo_vcs_info.json
@@ -0,0 +1,5 @@
+{
+  "git": {
+    "sha1": "090a7ec2f2fca9b4ddec05e39123e57dc0d73a2f"
+  }
+}
diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/.github/workflows/ci.yml b/third_party/rust/chromium_crates_io/vendor/group-v0_13/.github/workflows/ci.yml
new file mode 100644
index 0000000..c0ffd6d
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/.github/workflows/ci.yml
@@ -0,0 +1,100 @@
+name: CI checks
+
+on: [push, pull_request]
+
+jobs:
+  lint:
+    name: Lint
+    runs-on: ubuntu-latest
+
+    steps:
+      - uses: actions/checkout@v1
+      - uses: actions-rs/toolchain@v1
+        with:
+          toolchain: 1.56.0
+          override: true
+
+      # Ensure all code has been formatted with rustfmt
+      - run: rustup component add rustfmt
+      - name: Check formatting
+        uses: actions-rs/cargo@v1
+        with:
+          command: fmt
+          args: -- --check --color always
+
+  test:
+    name: Test on ${{ matrix.os }}
+    runs-on: ${{ matrix.os }}
+    strategy:
+      matrix:
+        os: [ubuntu-latest, windows-latest, macOS-latest]
+
+    steps:
+      - uses: actions/checkout@v1
+      - uses: actions-rs/toolchain@v1
+        with:
+          toolchain: 1.56.0
+          override: true
+      - name: cargo fetch
+        uses: actions-rs/cargo@v1
+        with:
+          command: fetch
+      - name: Build tests
+        uses: actions-rs/cargo@v1
+        with:
+          command: build
+          args: --verbose --release --tests
+      - name: Run tests
+        uses: actions-rs/cargo@v1
+        with:
+          command: test
+          args: --verbose --release
+      - name: Run --all-features tests
+        uses: actions-rs/cargo@v1
+        with:
+          command: test
+          args: --all-features --verbose --release
+
+  no-std:
+    name: Check no-std compatibility
+    runs-on: ubuntu-latest
+
+    steps:
+      - uses: actions/checkout@v1
+      - uses: actions-rs/toolchain@v1
+        with:
+          toolchain: 1.56.0
+          override: true
+      - run: rustup target add thumbv6m-none-eabi
+      - name: cargo fetch
+        uses: actions-rs/cargo@v1
+        with:
+          command: fetch
+      - name: Build
+        uses: actions-rs/cargo@v1
+        with:
+          command: build
+          args: --verbose --target thumbv6m-none-eabi --no-default-features
+
+  doc-links:
+    name: Nightly lint
+    runs-on: ubuntu-latest
+
+    steps:
+      - uses: actions/checkout@v1
+      - uses: actions-rs/toolchain@v1
+        with:
+          toolchain: nightly
+          override: true
+      - name: cargo fetch
+        uses: actions-rs/cargo@v1
+        with:
+          command: fetch
+
+      # Ensure intra-documentation links all resolve correctly
+      # Requires #![deny(intra_doc_link_resolution_failure)] in crate.
+      - name: Check intra-doc links
+        uses: actions-rs/cargo@v1
+        with:
+          command: doc
+          args: --document-private-items
diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/.gitignore b/third_party/rust/chromium_crates_io/vendor/group-v0_13/.gitignore
new file mode 100644
index 0000000..6936990
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/.gitignore
@@ -0,0 +1,3 @@
+/target
+**/*.rs.bk
+Cargo.lock
diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/CHANGELOG.md b/third_party/rust/chromium_crates_io/vendor/group-v0_13/CHANGELOG.md
new file mode 100644
index 0000000..aec3f6d
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/CHANGELOG.md
@@ -0,0 +1,77 @@
+# Changelog
+All notable changes to this library will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this library adheres to Rust's notion of
+[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## [Unreleased]
+
+## [0.13.0] - 2022-12-06
+### Changed
+- Bumped `ff` to `0.13`
+
+## [0.12.1] - 2022-10-13
+### Added
+- `group::{WnafBase, WnafScalar}` structs for caching precomputations of both
+  bases and scalars, for improved many-base many-scalar multiplication
+  performance.
+- `impl memuse::DynamicUsage for group::{Wnaf WnafBase, WnafScalar}`, behind the
+  new `wnaf-memuse` feature flag, to enable the heap usage of these types to be
+  measured at runtime.
+
+### Changed
+- Removed temporary allocations from `Wnaf` internals for improved performance.
+
+## [0.12.0] - 2022-05-04
+### Changed
+- MSRV is now 1.56.0.
+- Bumped `ff` to `0.12`
+
+## [0.11.0] - 2021-09-02
+### Fixed
+- The affine scalar multiplication bounds on the following traits had typos that
+  prevented multiplying by `&Self::Scalar`, which has now been fixed:
+  - `group::cofactor::{CofactorCurve::Affine, CofactorCurveAffine}`
+  - `group::prime::{PrimeCurve::Affine, PrimeCurveAffine}`
+
+### Added
+- `Copy + Send + Sync + 'static` bounds on `group::GroupEncoding::Repr`.
+
+### Changed
+- Bumped `ff` to 0.11.
+
+## [0.10.0] - 2021-06-01
+### Added
+- `group::ff`, which re-exports the `ff` crate to make version-matching easier.
+
+### Changed
+- MSRV is now 1.51.0.
+- Bumped `ff` to 0.10.
+
+### Removed
+- `group::cofactor::CofactorGroup::is_torsion_free` provided implementation
+  (trait implementors must now implement this method themselves). This avoids
+  a hard dependency on the `ff/bits` feature flag.
+
+## [0.9.0] - 2021-01-06
+### Changed
+- Bumped dependencies to `ff 0.9`, `rand_core 0.6`, `rand 0.8`.
+
+## [0.8.0] - 2020-09-08
+### Added
+- `no_std` support.
+
+### Changed
+- MSRV is now 1.44.0.
+- Bumped `ff` to 0.8.
+- `group::{wnaf, Wnaf, WnafGroup}` are now gated behind the (default-enabled)
+  `alloc` feature flag. The `byteorder` dependency is now optional.
+- `group::tests` is now gated behind the `tests` feature flag. The `rand` and
+  `rand_xorshift` dependencies are now optional.
+
+### Removed
+- `fmt::Display` bound from the following traits:
+  - `group::Group`
+  - `group::cofactor::CofactorCurveAffine`
+  - `group::prime::PrimeCurveAffine`
diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/COPYRIGHT b/third_party/rust/chromium_crates_io/vendor/group-v0_13/COPYRIGHT
new file mode 100644
index 0000000..849e327
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/COPYRIGHT
@@ -0,0 +1,14 @@
+Copyrights in the "group" library are retained by their contributors. No
+copyright assignment is required to contribute to the "group" library.
+
+The "group" library is licensed under either of
+
+ * Apache License, Version 2.0, (see ./LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
+ * MIT license (see ./LICENSE-MIT or http://opensource.org/licenses/MIT)
+
+at your option.
+
+Unless you explicitly state otherwise, any contribution intentionally
+submitted for inclusion in the work by you, as defined in the Apache-2.0
+license, shall be dual licensed as above, without any additional terms or
+conditions.
diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/group-v0_13/Cargo.toml
new file mode 100644
index 0000000..270336ad
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/Cargo.toml
@@ -0,0 +1,55 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g., crates.io) dependencies.
+#
+# If you are reading this file be aware that the original Cargo.toml
+# will likely look very different (and much more reasonable).
+# See Cargo.toml.orig for the original contents.
+
+[package]
+edition = "2021"
+name = "group"
+version = "0.13.0"
+authors = ["Sean Bowe <ewillbefull@gmail.com>", "Jack Grigg <jack@z.cash>"]
+description = "Elliptic curve group traits and utilities"
+homepage = "https://github.com/zkcrypto/group"
+documentation = "https://docs.rs/group/"
+readme = "README.md"
+license = "MIT/Apache-2.0"
+repository = "https://github.com/zkcrypto/group"
+resolver = "2"
+[dependencies.ff]
+version = "0.13"
+default-features = false
+
+[dependencies.memuse]
+version = "0.2"
+optional = true
+
+[dependencies.rand]
+version = "0.8"
+optional = true
+default-features = false
+
+[dependencies.rand_core]
+version = "0.9"
+default-features = false
+
+[dependencies.rand_xorshift]
+version = "0.3"
+optional = true
+
+[dependencies.subtle]
+version = "2.2.1"
+default-features = false
+
+[features]
+alloc = []
+default = ["alloc"]
+tests = ["alloc", "rand", "rand_xorshift"]
+wnaf-memuse = ["alloc", "memuse"]
+[badges.maintenance]
+status = "actively-developed"
diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/group-v0_13/Cargo.toml.orig
new file mode 100644
index 0000000..60c0854a
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/Cargo.toml.orig
@@ -0,0 +1,34 @@
+[package]
+name = "group"
+version = "0.13.0"
+authors = [
+    "Sean Bowe <ewillbefull@gmail.com>",
+    "Jack Grigg <jack@z.cash>",
+]
+readme = "README.md"
+license = "MIT/Apache-2.0"
+
+description = "Elliptic curve group traits and utilities"
+documentation = "https://docs.rs/group/"
+homepage = "https://github.com/zkcrypto/group"
+repository = "https://github.com/zkcrypto/group"
+edition = "2021"
+
+[dependencies]
+ff = { version = "0.13", default-features = false }
+rand = { version = "0.8", optional = true, default-features = false }
+rand_core = { version = "0.6", default-features = false }
+rand_xorshift = { version = "0.3", optional = true }
+subtle = { version = "2.2.1", default-features = false }
+
+# Crate for exposing the dynamic memory usage of the w-NAF structs.
+memuse = { version = "0.2", optional = true }
+
+[features]
+default = ["alloc"]
+alloc = []
+tests = ["alloc", "rand", "rand_xorshift"]
+wnaf-memuse = ["alloc", "memuse"]
+
+[badges]
+maintenance = { status = "actively-developed" }
diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/group-v0_13/LICENSE-APACHE
new file mode 100644
index 0000000..16fe87b
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/group-v0_13/LICENSE-MIT
new file mode 100644
index 0000000..31aa7938
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/LICENSE-MIT
@@ -0,0 +1,23 @@
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/README.md b/third_party/rust/chromium_crates_io/vendor/group-v0_13/README.md
new file mode 100644
index 0000000..5c2398b
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/README.md
@@ -0,0 +1,20 @@
+# group [![Crates.io](https://img.shields.io/crates/v/group.svg)](https://crates.io/crates/group) #
+
+`group` is a crate for working with groups over elliptic curves.
+
+## License
+
+Licensed under either of
+
+ * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
+   http://www.apache.org/licenses/LICENSE-2.0)
+ * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
+
+at your option.
+
+### Contribution
+
+Unless you explicitly state otherwise, any contribution intentionally
+submitted for inclusion in the work by you, as defined in the Apache-2.0
+license, shall be dual licensed as above, without any additional terms or
+conditions.
diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/rust-toolchain b/third_party/rust/chromium_crates_io/vendor/group-v0_13/rust-toolchain
new file mode 100644
index 0000000..af92bdd9
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/rust-toolchain
@@ -0,0 +1 @@
+1.63.0
diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/src/cofactor.rs b/third_party/rust/chromium_crates_io/vendor/group-v0_13/src/cofactor.rs
new file mode 100644
index 0000000..84bfe0a
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/src/cofactor.rs
@@ -0,0 +1,100 @@
+use core::fmt;
+use core::ops::{Mul, Neg};
+use ff::PrimeField;
+use subtle::{Choice, CtOption};
+
+use crate::{prime::PrimeGroup, Curve, Group, GroupEncoding, GroupOps, GroupOpsOwned};
+
+/// This trait represents an element of a cryptographic group with a large prime-order
+/// subgroup and a comparatively-small cofactor.
+pub trait CofactorGroup:
+    Group
+    + GroupEncoding
+    + GroupOps<<Self as CofactorGroup>::Subgroup>
+    + GroupOpsOwned<<Self as CofactorGroup>::Subgroup>
+{
+    /// The large prime-order subgroup in which cryptographic operations are performed.
+    /// If `Self` implements `PrimeGroup`, then `Self::Subgroup` may be `Self`.
+    type Subgroup: PrimeGroup<Scalar = Self::Scalar> + Into<Self>;
+
+    /// Maps `self` to the prime-order subgroup by multiplying this element by some
+    /// `k`-multiple of the cofactor.
+    ///
+    /// The value `k` does not vary between inputs for a given implementation, but may
+    /// vary between different implementations of `CofactorGroup` because some groups have
+    /// more efficient methods of clearing the cofactor when `k` is allowed to be
+    /// different than `1`.
+    ///
+    /// If `Self` implements [`PrimeGroup`], this returns `self`.
+    fn clear_cofactor(&self) -> Self::Subgroup;
+
+    /// Returns `self` if it is contained in the prime-order subgroup.
+    ///
+    /// If `Self` implements [`PrimeGroup`], this returns `Some(self)`.
+    fn into_subgroup(self) -> CtOption<Self::Subgroup>;
+
+    /// Determines if this element is of small order.
+    ///
+    /// Returns:
+    /// - `true` if `self` is in the torsion subgroup.
+    /// - `false` if `self` is not in the torsion subgroup.
+    fn is_small_order(&self) -> Choice {
+        self.clear_cofactor().is_identity()
+    }
+
+    /// Determines if this element is "torsion free", i.e., is contained in the
+    /// prime-order subgroup.
+    ///
+    /// Returns:
+    /// - `true` if `self` has trivial torsion and is in the prime-order subgroup.
+    /// - `false` if `self` has non-zero torsion component and is not in the prime-order
+    ///   subgroup.
+    fn is_torsion_free(&self) -> Choice;
+}
+
+/// Efficient representation of an elliptic curve point guaranteed to be
+/// in the correct prime order subgroup.
+pub trait CofactorCurve:
+    Curve<AffineRepr = <Self as CofactorCurve>::Affine> + CofactorGroup
+{
+    type Affine: CofactorCurveAffine<Curve = Self, Scalar = Self::Scalar>
+        + Mul<Self::Scalar, Output = Self>
+        + for<'r> Mul<&'r Self::Scalar, Output = Self>;
+}
+
+/// Affine representation of an elliptic curve point guaranteed to be
+/// in the correct prime order subgroup.
+pub trait CofactorCurveAffine:
+    GroupEncoding
+    + Copy
+    + Clone
+    + Sized
+    + Send
+    + Sync
+    + fmt::Debug
+    + PartialEq
+    + Eq
+    + 'static
+    + Neg<Output = Self>
+    + Mul<<Self as CofactorCurveAffine>::Scalar, Output = <Self as CofactorCurveAffine>::Curve>
+    + for<'r> Mul<
+        &'r <Self as CofactorCurveAffine>::Scalar,
+        Output = <Self as CofactorCurveAffine>::Curve,
+    >
+{
+    type Scalar: PrimeField;
+    type Curve: CofactorCurve<Affine = Self, Scalar = Self::Scalar>;
+
+    /// Returns the additive identity.
+    fn identity() -> Self;
+
+    /// Returns a fixed generator of unknown exponent.
+    fn generator() -> Self;
+
+    /// Determines if this point represents the point at infinity; the
+    /// additive identity.
+    fn is_identity(&self) -> Choice;
+
+    /// Converts this element to its curve representation.
+    fn to_curve(&self) -> Self::Curve;
+}
diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/group-v0_13/src/lib.rs
new file mode 100644
index 0000000..27ed5c9b
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/src/lib.rs
@@ -0,0 +1,174 @@
+#![no_std]
+// Catch documentation errors caused by code changes.
+#![deny(rustdoc::broken_intra_doc_links)]
+
+#[cfg(feature = "alloc")]
+#[macro_use]
+extern crate alloc;
+
+// Re-export ff to make version-matching easier.
+pub use ff;
+
+use core::fmt;
+use core::iter::Sum;
+use core::ops::{Add, AddAssign, Mul, MulAssign, Neg, Sub, SubAssign};
+use ff::PrimeField;
+use rand_core::RngCore;
+use subtle::{Choice, CtOption};
+
+pub mod cofactor;
+pub mod prime;
+#[cfg(feature = "tests")]
+pub mod tests;
+
+#[cfg(feature = "alloc")]
+mod wnaf;
+#[cfg(feature = "alloc")]
+pub use self::wnaf::{Wnaf, WnafBase, WnafGroup, WnafScalar};
+
+/// A helper trait for types with a group operation.
+pub trait GroupOps<Rhs = Self, Output = Self>:
+    Add<Rhs, Output = Output> + Sub<Rhs, Output = Output> + AddAssign<Rhs> + SubAssign<Rhs>
+{
+}
+
+impl<T, Rhs, Output> GroupOps<Rhs, Output> for T where
+    T: Add<Rhs, Output = Output> + Sub<Rhs, Output = Output> + AddAssign<Rhs> + SubAssign<Rhs>
+{
+}
+
+/// A helper trait for references with a group operation.
+pub trait GroupOpsOwned<Rhs = Self, Output = Self>: for<'r> GroupOps<&'r Rhs, Output> {}
+impl<T, Rhs, Output> GroupOpsOwned<Rhs, Output> for T where T: for<'r> GroupOps<&'r Rhs, Output> {}
+
+/// A helper trait for types implementing group scalar multiplication.
+pub trait ScalarMul<Rhs, Output = Self>: Mul<Rhs, Output = Output> + MulAssign<Rhs> {}
+
+impl<T, Rhs, Output> ScalarMul<Rhs, Output> for T where T: Mul<Rhs, Output = Output> + MulAssign<Rhs>
+{}
+
+/// A helper trait for references implementing group scalar multiplication.
+pub trait ScalarMulOwned<Rhs, Output = Self>: for<'r> ScalarMul<&'r Rhs, Output> {}
+impl<T, Rhs, Output> ScalarMulOwned<Rhs, Output> for T where T: for<'r> ScalarMul<&'r Rhs, Output> {}
+
+/// This trait represents an element of a cryptographic group.
+pub trait Group:
+    Clone
+    + Copy
+    + fmt::Debug
+    + Eq
+    + Sized
+    + Send
+    + Sync
+    + 'static
+    + Sum
+    + for<'a> Sum<&'a Self>
+    + Neg<Output = Self>
+    + GroupOps
+    + GroupOpsOwned
+    + ScalarMul<<Self as Group>::Scalar>
+    + ScalarMulOwned<<Self as Group>::Scalar>
+{
+    /// Scalars modulo the order of this group's scalar field.
+    type Scalar: PrimeField;
+
+    /// Returns an element chosen uniformly at random from the non-identity elements of
+    /// this group.
+    ///
+    /// This function is non-deterministic, and samples from the user-provided RNG.
+    fn random(rng: impl RngCore) -> Self;
+
+    /// Returns the additive identity, also known as the "neutral element".
+    fn identity() -> Self;
+
+    /// Returns a fixed generator of the prime-order subgroup.
+    fn generator() -> Self;
+
+    /// Determines if this point is the identity.
+    fn is_identity(&self) -> Choice;
+
+    /// Doubles this element.
+    #[must_use]
+    fn double(&self) -> Self;
+}
+
+/// Efficient representation of an elliptic curve point guaranteed.
+pub trait Curve:
+    Group + GroupOps<<Self as Curve>::AffineRepr> + GroupOpsOwned<<Self as Curve>::AffineRepr>
+{
+    /// The affine representation for this elliptic curve.
+    type AffineRepr;
+
+    /// Converts a batch of projective elements into affine elements. This function will
+    /// panic if `p.len() != q.len()`.
+    fn batch_normalize(p: &[Self], q: &mut [Self::AffineRepr]) {
+        assert_eq!(p.len(), q.len());
+
+        for (p, q) in p.iter().zip(q.iter_mut()) {
+            *q = p.to_affine();
+        }
+    }
+
+    /// Converts this element into its affine representation.
+    fn to_affine(&self) -> Self::AffineRepr;
+}
+
+pub trait GroupEncoding: Sized {
+    /// The encoding of group elements.
+    ///
+    /// The `Default` implementation is not required to return a valid point encoding. The
+    /// bound is present to enable encodings to be constructed generically:
+    /// ```
+    /// # use group::GroupEncoding;
+    /// # use subtle::CtOption;
+    /// # struct G;
+    /// # impl GroupEncoding for G {
+    /// #     type Repr = [u8; 0];
+    /// #     fn from_bytes(bytes: &Self::Repr) -> CtOption<Self> { unimplemented!() }
+    /// #     fn from_bytes_unchecked(bytes: &Self::Repr) -> CtOption<Self> { unimplemented!() }
+    /// #     fn to_bytes(&self) -> Self::Repr { unimplemented!() }
+    /// # }
+    /// # let buf = &[0u8; 0][..];
+    /// let mut encoding = <G as GroupEncoding>::Repr::default();
+    /// encoding.as_mut().copy_from_slice(buf);
+    /// ```
+    ///
+    /// It is recommended that the default should be the all-zeroes encoding.
+    type Repr: Copy + Default + Send + Sync + 'static + AsRef<[u8]> + AsMut<[u8]>;
+
+    /// Attempts to deserialize a group element from its encoding.
+    fn from_bytes(bytes: &Self::Repr) -> CtOption<Self>;
+
+    /// Attempts to deserialize a group element, not checking if the element is valid.
+    ///
+    /// **This is dangerous to call unless you trust the bytes you are reading; otherwise,
+    /// API invariants may be broken.** Please consider using
+    /// [`GroupEncoding::from_bytes`] instead.
+    fn from_bytes_unchecked(bytes: &Self::Repr) -> CtOption<Self>;
+
+    /// Converts this element into its byte encoding. This may or may not support
+    /// encoding the identity.
+    // TODO: Figure out how to handle identity encoding generically.
+    fn to_bytes(&self) -> Self::Repr;
+}
+
+/// Affine representation of a point on an elliptic curve that has a defined uncompressed
+/// encoding.
+pub trait UncompressedEncoding: Sized {
+    type Uncompressed: Default + AsRef<[u8]> + AsMut<[u8]>;
+
+    /// Attempts to deserialize an element from its uncompressed encoding.
+    fn from_uncompressed(bytes: &Self::Uncompressed) -> CtOption<Self>;
+
+    /// Attempts to deserialize an uncompressed element, not checking if the element is in
+    /// the correct subgroup.
+    ///
+    /// **This is dangerous to call unless you trust the bytes you are reading; otherwise,
+    /// API invariants may be broken.** Please consider using
+    /// [`UncompressedEncoding::from_uncompressed`] instead.
+    fn from_uncompressed_unchecked(bytes: &Self::Uncompressed) -> CtOption<Self>;
+
+    /// Converts this element into its uncompressed encoding, so long as it's not
+    /// the point at infinity.
+    fn to_uncompressed(&self) -> Self::Uncompressed;
+}
diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/src/prime.rs b/third_party/rust/chromium_crates_io/vendor/group-v0_13/src/prime.rs
new file mode 100644
index 0000000..174888e
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/src/prime.rs
@@ -0,0 +1,50 @@
+use core::fmt;
+use core::ops::{Mul, Neg};
+use ff::PrimeField;
+use subtle::Choice;
+
+use crate::{Curve, Group, GroupEncoding};
+
+/// This trait represents an element of a prime-order cryptographic group.
+pub trait PrimeGroup: Group + GroupEncoding {}
+
+/// Efficient representation of an elliptic curve point guaranteed to be
+/// in the correct prime order subgroup.
+pub trait PrimeCurve: Curve<AffineRepr = <Self as PrimeCurve>::Affine> + PrimeGroup {
+    type Affine: PrimeCurveAffine<Curve = Self, Scalar = Self::Scalar>
+        + Mul<Self::Scalar, Output = Self>
+        + for<'r> Mul<&'r Self::Scalar, Output = Self>;
+}
+
+/// Affine representation of an elliptic curve point guaranteed to be
+/// in the correct prime order subgroup.
+pub trait PrimeCurveAffine: GroupEncoding
+    + Copy
+    + Clone
+    + Sized
+    + Send
+    + Sync
+    + fmt::Debug
+    + PartialEq
+    + Eq
+    + 'static
+    + Neg<Output = Self>
+    + Mul<<Self as PrimeCurveAffine>::Scalar, Output = <Self as PrimeCurveAffine>::Curve>
+    + for<'r> Mul<&'r <Self as PrimeCurveAffine>::Scalar, Output = <Self as PrimeCurveAffine>::Curve>
+{
+    type Scalar: PrimeField;
+    type Curve: PrimeCurve<Affine = Self, Scalar = Self::Scalar>;
+
+    /// Returns the additive identity.
+    fn identity() -> Self;
+
+    /// Returns a fixed generator of unknown exponent.
+    fn generator() -> Self;
+
+    /// Determines if this point represents the point at infinity; the
+    /// additive identity.
+    fn is_identity(&self) -> Choice;
+
+    /// Converts this element to its curve representation.
+    fn to_curve(&self) -> Self::Curve;
+}
diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/src/tests/mod.rs b/third_party/rust/chromium_crates_io/vendor/group-v0_13/src/tests/mod.rs
new file mode 100644
index 0000000..ff79a9b
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/src/tests/mod.rs
@@ -0,0 +1,448 @@
+use alloc::vec::Vec;
+use core::ops::{Mul, Neg};
+use ff::{Field, PrimeField};
+use rand::SeedableRng;
+use rand_xorshift::XorShiftRng;
+
+use crate::{
+    prime::{PrimeCurve, PrimeCurveAffine},
+    wnaf::WnafGroup,
+    GroupEncoding, UncompressedEncoding,
+};
+
+pub fn curve_tests<G: PrimeCurve>() {
+    let mut rng = XorShiftRng::from_seed([
+        0x59, 0x62, 0xbe, 0x5d, 0x76, 0x3d, 0x31, 0x8d, 0x17, 0xdb, 0x37, 0x32, 0x54, 0x06, 0xbc,
+        0xe5,
+    ]);
+
+    // Negation edge case with identity.
+    {
+        let z = G::identity().neg();
+        assert!(bool::from(z.is_identity()));
+    }
+
+    // Doubling edge case with identity.
+    {
+        let z = G::identity().double();
+        assert!(bool::from(z.is_identity()));
+    }
+
+    // Addition edge cases with identity
+    {
+        let mut r = G::random(&mut rng);
+        let rcopy = r;
+        r.add_assign(&G::identity());
+        assert_eq!(r, rcopy);
+        r.add_assign(&G::Affine::identity());
+        assert_eq!(r, rcopy);
+
+        let mut z = G::identity();
+        z.add_assign(&G::identity());
+        assert!(bool::from(z.is_identity()));
+        z.add_assign(&G::Affine::identity());
+        assert!(bool::from(z.is_identity()));
+
+        let mut z2 = z;
+        z2.add_assign(&r);
+
+        z.add_assign(&r.to_affine());
+
+        assert_eq!(z, z2);
+        assert_eq!(z, r);
+    }
+
+    // Transformations
+    {
+        let a = G::random(&mut rng);
+        let b = a.to_affine().to_curve();
+        let c = a.to_affine().to_curve().to_affine().to_curve();
+        assert_eq!(a, b);
+        assert_eq!(b, c);
+    }
+
+    random_addition_tests::<G>();
+    random_multiplication_tests::<G>();
+    random_doubling_tests::<G>();
+    random_negation_tests::<G>();
+    random_transformation_tests::<G>();
+    random_compressed_encoding_tests::<G>();
+}
+
+pub fn random_wnaf_tests<G: WnafGroup>() {
+    use crate::wnaf::*;
+
+    let mut rng = XorShiftRng::from_seed([
+        0x59, 0x62, 0xbe, 0x5d, 0x76, 0x3d, 0x31, 0x8d, 0x17, 0xdb, 0x37, 0x32, 0x54, 0x06, 0xbc,
+        0xe5,
+    ]);
+
+    {
+        let mut table = vec![];
+        let mut wnaf = vec![];
+
+        for w in 2..14 {
+            for _ in 0..100 {
+                let g = G::random(&mut rng);
+                let s = G::Scalar::random(&mut rng);
+                let mut g1 = g;
+                g1.mul_assign(s);
+
+                wnaf_table(&mut table, g, w);
+                wnaf_form(&mut wnaf, s.to_repr(), w);
+                let g2 = wnaf_exp(&table, &wnaf);
+
+                assert_eq!(g1, g2);
+            }
+        }
+    }
+
+    {
+        fn only_compiles_if_send<S: Send>(_: &S) {}
+
+        for _ in 0..100 {
+            let g = G::random(&mut rng);
+            let s = G::Scalar::random(&mut rng);
+            let mut g1 = g;
+            g1.mul_assign(s);
+
+            let g2 = {
+                let mut wnaf = Wnaf::new();
+                wnaf.base(g, 1).scalar(&s)
+            };
+            let g3 = {
+                let mut wnaf = Wnaf::new();
+                wnaf.scalar(&s).base(g)
+            };
+            let g4 = {
+                let mut wnaf = Wnaf::new();
+                let mut shared = wnaf.base(g, 1).shared();
+
+                only_compiles_if_send(&shared);
+
+                shared.scalar(&s)
+            };
+            let g5 = {
+                let mut wnaf = Wnaf::new();
+                let mut shared = wnaf.scalar(&s).shared();
+
+                only_compiles_if_send(&shared);
+
+                shared.base(g)
+            };
+
+            let g6 = {
+                let mut wnaf = Wnaf::new();
+                {
+                    // Populate the vectors.
+                    wnaf.base(G::random(&mut rng), 1)
+                        .scalar(&G::Scalar::random(&mut rng));
+                }
+                wnaf.base(g, 1).scalar(&s)
+            };
+            let g7 = {
+                let mut wnaf = Wnaf::new();
+                {
+                    // Populate the vectors.
+                    wnaf.base(G::random(&mut rng), 1)
+                        .scalar(&G::Scalar::random(&mut rng));
+                }
+                wnaf.scalar(&s).base(g)
+            };
+            let g8 = {
+                let mut wnaf = Wnaf::new();
+                {
+                    // Populate the vectors.
+                    wnaf.base(G::random(&mut rng), 1)
+                        .scalar(&G::Scalar::random(&mut rng));
+                }
+                let mut shared = wnaf.base(g, 1).shared();
+
+                only_compiles_if_send(&shared);
+
+                shared.scalar(&s)
+            };
+            let g9 = {
+                let mut wnaf = Wnaf::new();
+                {
+                    // Populate the vectors.
+                    wnaf.base(G::random(&mut rng), 1)
+                        .scalar(&G::Scalar::random(&mut rng));
+                }
+                let mut shared = wnaf.scalar(&s).shared();
+
+                only_compiles_if_send(&shared);
+
+                shared.base(g)
+            };
+
+            assert_eq!(g1, g2);
+            assert_eq!(g1, g3);
+            assert_eq!(g1, g4);
+            assert_eq!(g1, g5);
+            assert_eq!(g1, g6);
+            assert_eq!(g1, g7);
+            assert_eq!(g1, g8);
+            assert_eq!(g1, g9);
+        }
+    }
+}
+
+fn random_negation_tests<G: PrimeCurve>() {
+    let mut rng = XorShiftRng::from_seed([
+        0x59, 0x62, 0xbe, 0x5d, 0x76, 0x3d, 0x31, 0x8d, 0x17, 0xdb, 0x37, 0x32, 0x54, 0x06, 0xbc,
+        0xe5,
+    ]);
+
+    for _ in 0..1000 {
+        let r = G::random(&mut rng);
+
+        let s = G::Scalar::random(&mut rng);
+        let sneg = s.neg();
+
+        let mut t1 = r;
+        t1.mul_assign(s);
+
+        let mut t2 = r;
+        t2.mul_assign(sneg);
+
+        let mut t3 = t1;
+        t3.add_assign(&t2);
+        assert!(bool::from(t3.is_identity()));
+
+        let mut t4 = t1;
+        t4.add_assign(&t2.to_affine());
+        assert!(bool::from(t4.is_identity()));
+
+        assert_eq!(t1.neg(), t2);
+    }
+}
+
+fn random_doubling_tests<G: PrimeCurve>() {
+    let mut rng = XorShiftRng::from_seed([
+        0x59, 0x62, 0xbe, 0x5d, 0x76, 0x3d, 0x31, 0x8d, 0x17, 0xdb, 0x37, 0x32, 0x54, 0x06, 0xbc,
+        0xe5,
+    ]);
+
+    for _ in 0..1000 {
+        let mut a = G::random(&mut rng);
+        let mut b = G::random(&mut rng);
+
+        // 2(a + b)
+        let tmp1 = (a + b).double();
+
+        // 2a + 2b
+        a = a.double();
+        b = b.double();
+
+        let mut tmp2 = a;
+        tmp2.add_assign(&b);
+
+        let mut tmp3 = a;
+        tmp3.add_assign(&b.to_affine());
+
+        assert_eq!(tmp1, tmp2);
+        assert_eq!(tmp1, tmp3);
+    }
+}
+
+fn random_multiplication_tests<G: PrimeCurve>() {
+    let mut rng = XorShiftRng::from_seed([
+        0x59, 0x62, 0xbe, 0x5d, 0x76, 0x3d, 0x31, 0x8d, 0x17, 0xdb, 0x37, 0x32, 0x54, 0x06, 0xbc,
+        0xe5,
+    ]);
+
+    for _ in 0..1000 {
+        let mut a = G::random(&mut rng);
+        let mut b = G::random(&mut rng);
+        let a_affine = a.to_affine();
+        let b_affine = b.to_affine();
+
+        let s = G::Scalar::random(&mut rng);
+
+        // s ( a + b )
+        let mut tmp1 = a;
+        tmp1.add_assign(&b);
+        tmp1.mul_assign(s);
+
+        // sa + sb
+        a.mul_assign(s);
+        b.mul_assign(s);
+
+        let mut tmp2 = a;
+        tmp2.add_assign(&b);
+
+        // Affine multiplication
+        let mut tmp3 = Mul::<G::Scalar>::mul(a_affine, s);
+        tmp3.add_assign(Mul::<G::Scalar>::mul(b_affine, s));
+
+        assert_eq!(tmp1, tmp2);
+        assert_eq!(tmp1, tmp3);
+    }
+}
+
+fn random_addition_tests<G: PrimeCurve>() {
+    let mut rng = XorShiftRng::from_seed([
+        0x59, 0x62, 0xbe, 0x5d, 0x76, 0x3d, 0x31, 0x8d, 0x17, 0xdb, 0x37, 0x32, 0x54, 0x06, 0xbc,
+        0xe5,
+    ]);
+
+    for _ in 0..1000 {
+        let a = G::random(&mut rng);
+        let b = G::random(&mut rng);
+        let c = G::random(&mut rng);
+        let a_affine = a.to_affine();
+        let b_affine = b.to_affine();
+        let c_affine = c.to_affine();
+
+        // a + a should equal the doubling
+        {
+            let mut aplusa = a;
+            aplusa.add_assign(&a);
+
+            let mut aplusamixed = a;
+            aplusamixed.add_assign(&a.to_affine());
+
+            let adouble = a.double();
+
+            assert_eq!(aplusa, adouble);
+            assert_eq!(aplusa, aplusamixed);
+        }
+
+        let mut tmp = vec![G::identity(); 6];
+
+        // (a + b) + c
+        tmp[0] = a;
+        tmp[0].add_assign(&b);
+        tmp[0].add_assign(&c);
+
+        // a + (b + c)
+        tmp[1] = b;
+        tmp[1].add_assign(&c);
+        tmp[1].add_assign(&a);
+
+        // (a + c) + b
+        tmp[2] = a;
+        tmp[2].add_assign(&c);
+        tmp[2].add_assign(&b);
+
+        // Mixed addition
+
+        // (a + b) + c
+        tmp[3] = a_affine.to_curve();
+        tmp[3].add_assign(&b_affine);
+        tmp[3].add_assign(&c_affine);
+
+        // a + (b + c)
+        tmp[4] = b_affine.to_curve();
+        tmp[4].add_assign(&c_affine);
+        tmp[4].add_assign(&a_affine);
+
+        // (a + c) + b
+        tmp[5] = a_affine.to_curve();
+        tmp[5].add_assign(&c_affine);
+        tmp[5].add_assign(&b_affine);
+
+        // Comparisons
+        for i in 0..6 {
+            for j in 0..6 {
+                assert_eq!(tmp[i], tmp[j]);
+                assert_eq!(tmp[i].to_affine(), tmp[j].to_affine());
+            }
+
+            assert!(tmp[i] != a);
+            assert!(tmp[i] != b);
+            assert!(tmp[i] != c);
+
+            assert!(a != tmp[i]);
+            assert!(b != tmp[i]);
+            assert!(c != tmp[i]);
+        }
+    }
+}
+
+fn random_transformation_tests<G: PrimeCurve>() {
+    let mut rng = XorShiftRng::from_seed([
+        0x59, 0x62, 0xbe, 0x5d, 0x76, 0x3d, 0x31, 0x8d, 0x17, 0xdb, 0x37, 0x32, 0x54, 0x06, 0xbc,
+        0xe5,
+    ]);
+
+    for _ in 0..1000 {
+        let g = G::random(&mut rng);
+        let g_affine = g.to_affine();
+        let g_projective = g_affine.to_curve();
+        assert_eq!(g, g_projective);
+    }
+
+    // Batch normalization
+    for _ in 0..10 {
+        let mut v = (0..1000).map(|_| G::random(&mut rng)).collect::<Vec<_>>();
+
+        use rand::distributions::{Distribution, Uniform};
+        let between = Uniform::new(0, 1000);
+        // Sprinkle in some normalized points
+        for _ in 0..5 {
+            v[between.sample(&mut rng)] = G::identity();
+        }
+        for _ in 0..5 {
+            let s = between.sample(&mut rng);
+            v[s] = v[s].to_affine().to_curve();
+        }
+
+        let expected_v = v.iter().map(|v| v.to_affine()).collect::<Vec<_>>();
+
+        let mut normalized = vec![G::Affine::identity(); v.len()];
+        G::batch_normalize(&v, &mut normalized);
+
+        assert_eq!(normalized, expected_v);
+    }
+}
+
+fn random_compressed_encoding_tests<G: PrimeCurve>() {
+    let mut rng = XorShiftRng::from_seed([
+        0x59, 0x62, 0xbe, 0x5d, 0x76, 0x3d, 0x31, 0x8d, 0x17, 0xdb, 0x37, 0x32, 0x54, 0x06, 0xbc,
+        0xe5,
+    ]);
+
+    assert_eq!(
+        G::Affine::from_bytes(&G::Affine::identity().to_bytes()).unwrap(),
+        G::Affine::identity()
+    );
+
+    for _ in 0..1000 {
+        let mut r = G::random(&mut rng).to_affine();
+
+        let compressed = r.to_bytes();
+        let de_compressed = G::Affine::from_bytes(&compressed).unwrap();
+        assert_eq!(de_compressed, r);
+
+        r = r.neg();
+
+        let compressed = r.to_bytes();
+        let de_compressed = G::Affine::from_bytes(&compressed).unwrap();
+        assert_eq!(de_compressed, r);
+    }
+}
+
+pub fn random_uncompressed_encoding_tests<G: PrimeCurve>()
+where
+    <G as PrimeCurve>::Affine: UncompressedEncoding,
+{
+    let mut rng = XorShiftRng::from_seed([
+        0x59, 0x62, 0xbe, 0x5d, 0x76, 0x3d, 0x31, 0x8d, 0x17, 0xdb, 0x37, 0x32, 0x54, 0x06, 0xbc,
+        0xe5,
+    ]);
+
+    assert_eq!(
+        G::Affine::from_uncompressed(&G::Affine::identity().to_uncompressed()).unwrap(),
+        G::Affine::identity()
+    );
+
+    for _ in 0..1000 {
+        let r = G::random(&mut rng).to_affine();
+
+        let uncompressed = r.to_uncompressed();
+        let de_uncompressed = G::Affine::from_uncompressed(&uncompressed).unwrap();
+        assert_eq!(de_uncompressed, r);
+    }
+}
diff --git a/third_party/rust/chromium_crates_io/vendor/group-v0_13/src/wnaf.rs b/third_party/rust/chromium_crates_io/vendor/group-v0_13/src/wnaf.rs
new file mode 100644
index 0000000..175d6766
--- /dev/null
+++ b/third_party/rust/chromium_crates_io/vendor/group-v0_13/src/wnaf.rs
@@ -0,0 +1,506 @@
+use alloc::vec::Vec;
+use core::iter;
+use core::marker::PhantomData;
+use core::ops::Mul;
+
+use ff::PrimeField;
+
+use super::Group;
+
+/// Extension trait on a [`Group`] that provides helpers used by [`Wnaf`].
+pub trait WnafGroup: Group {
+    /// Recommends a wNAF window size given the number of scalars you intend to multiply
+    /// a base by. Always returns a number between 2 and 22, inclusive.
+    fn recommended_wnaf_for_num_scalars(num_scalars: usize) -> usize;
+}
+
+/// Replaces the contents of `table` with a w-NAF window table for the given window size.
+pub(crate) fn wnaf_table<G: Group>(table: &mut Vec<G>, mut base: G, window: usize) {
+    table.truncate(0);
+    table.reserve(1 << (window - 1));
+
+    let dbl = base.double();
+
+    for _ in 0..(1 << (window - 1)) {
+        table.push(base);
+        base.add_assign(&dbl);
+    }
+}
+
+/// This struct represents a view of a sequence of bytes as a sequence of
+/// `u64` limbs in little-endian byte order. It maintains a current index, and
+/// allows access to the limb at that index and the one following it. Bytes
+/// beyond the end of the original buffer are treated as zero.
+struct LimbBuffer<'a> {
+    buf: &'a [u8],
+    cur_idx: usize,
+    cur_limb: u64,
+    next_limb: u64,
+}
+
+impl<'a> LimbBuffer<'a> {
+    fn new(buf: &'a [u8]) -> Self {
+        let mut ret = Self {
+            buf,
+            cur_idx: 0,
+            cur_limb: 0,
+            next_limb: 0,
+        };
+
+        // Initialise the limb buffers.
+        ret.increment_limb();
+        ret.increment_limb();
+        ret.cur_idx = 0usize;
+
+        ret
+    }
+
+    fn increment_limb(&mut self) {
+        self.cur_idx += 1;
+        self.cur_limb = self.next_limb;
+        match self.buf.len() {
+            // There are no more bytes in the buffer; zero-extend.
+            0 => self.next_limb = 0,
+
+            // There are fewer bytes in the buffer than a u64 limb; zero-extend.
+            x @ 1..=7 => {
+                let mut next_limb = [0; 8];
+                next_limb[..x].copy_from_slice(self.buf);
+                self.next_limb = u64::from_le_bytes(next_limb);
+                self.buf = &[];
+            }
+
+            // There are at least eight bytes in the buffer; read the next u64 limb.
+            _ => {
+                let (next_limb, rest) = self.buf.split_at(8);
+                self.next_limb = u64::from_le_bytes(next_limb.try_into().unwrap());
+                self.buf = rest;
+            }
+        }
+    }
+
+    fn get(&mut self, idx: usize) -> (u64, u64) {
+        assert!([self.cur_idx, self.cur_idx + 1].contains(&idx));
+        if idx > self.cur_idx {
+            self.increment_limb();
+        }
+        (self.cur_limb, self.next_limb)
+    }
+}
+
+/// Replaces the contents of `wnaf` with the w-NAF representation of a little-endian
+/// scalar.
+pub(crate) fn wnaf_form<S: AsRef<[u8]>>(wnaf: &mut Vec<i64>, c: S, window: usize) {
+    // Required by the NAF definition
+    debug_assert!(window >= 2);
+    // Required so that the NAF digits fit in i64
+    debug_assert!(window <= 64);
+
+    let bit_len = c.as_ref().len() * 8;
+
+    wnaf.truncate(0);
+    wnaf.reserve(bit_len);
+
+    // Initialise the current and next limb buffers.
+    let mut limbs = LimbBuffer::new(c.as_ref());
+
+    let width = 1u64 << window;
+    let window_mask = width - 1;
+
+    let mut pos = 0;
+    let mut carry = 0;
+    while pos < bit_len {
+        // Construct a buffer of bits of the scalar, starting at bit `pos`
+        let u64_idx = pos / 64;
+        let bit_idx = pos % 64;
+        let (cur_u64, next_u64) = limbs.get(u64_idx);
+        let bit_buf = if bit_idx + window < 64 {
+            // This window's bits are contained in a single u64
+            cur_u64 >> bit_idx
+        } else {
+            // Combine the current u64's bits with the bits from the next u64
+            (cur_u64 >> bit_idx) | (next_u64 << (64 - bit_idx))
+        };
+
+        // Add the carry into the current window
+        let window_val = carry + (bit_buf & window_mask);
+
+        if window_val & 1 == 0 {
+            // If the window value is even, preserve the carry and emit 0.
+            // Why is the carry preserved?
+            // If carry == 0 and window_val & 1 == 0, then the next carry should be 0
+            // If carry == 1 and window_val & 1 == 0, then bit_buf & 1 == 1 so the next carry should be 1
+            wnaf.push(0);
+            pos += 1;
+        } else {
+            wnaf.push(if window_val < width / 2 {
+                carry = 0;
+                window_val as i64
+            } else {
+                carry = 1;
+                (window_val as i64).wrapping_sub(width as i64)
+            });
+            wnaf.extend(iter::repeat(0).take(window - 1));
+            pos += window;
+        }
+    }
+}
+
+/// Performs w-NAF exponentiation with the provided window table and w-NAF form scalar.
+///
+/// This function must be provided a `table` and `wnaf` that were constructed with
+/// the same window size; otherwise, it may panic or produce invalid results.
+pub(crate) fn wnaf_exp<G: Group>(table: &[G], wnaf: &[i64]) -> G {
+    let mut result = G::identity();
+
+    let mut found_one = false;
+
+    for n in wnaf.iter().rev() {
+        if found_one {
+            result = result.double();
+        }
+
+        if *n != 0 {
+            found_one = true;
+
+            if *n > 0 {
+                result += &table[(n / 2) as usize];
+            } else {
+                result -= &table[((-n) / 2) as usize];
+            }
+        }
+    }
+
+    result
+}
+
+/// A "w-ary non-adjacent form" scalar multiplication (also known as exponentiation)
+/// context.
+///
+/// # Examples
+///
+/// This struct can be used to implement several patterns:
+///
+/// ## One base, one scalar
+///
+/// For this pattern, you can use a transient `Wnaf` context:
+///
+/// ```ignore
+/// use group::Wnaf;
+///
+/// let result = Wnaf::new().scalar(&scalar).base(base);
+/// ```
+///
+/// ## Many bases, one scalar
+///
+/// For this pattern, you create a `Wnaf` context, load the scalar into it, and then
+/// process each base in turn:
+///
+/// ```ignore
+/// use group::Wnaf;
+///
+/// let mut wnaf = Wnaf::new();
+/// let mut wnaf_scalar = wnaf.scalar(&scalar);
+/// let results: Vec<_> = bases
+///     .into_iter()
+///     .map(|base| wnaf_scalar.base(base))
+///     .collect();
+/// ```
+///
+/// ## One base, many scalars
+///
+/// For this pattern, you create a `Wnaf` context, load the base into it, and then process
+/// each scalar in turn:
+///
+/// ```ignore
+/// use group::Wnaf;
+///
+/// let mut wnaf = Wnaf::new();
+/// let mut wnaf_base = wnaf.base(base, scalars.len());
+/// let results: Vec<_> = scalars
+///     .iter()
+///     .map(|scalar| wnaf_base.scalar(scalar))
+///     .collect();
+/// ```
+///
+/// ## Many bases, many scalars
+///
+/// Say you have `n` bases and `m` scalars, and want to produce `n * m` results. For this
+/// pattern, you need to cache the w-NAF tables for the bases and then compute the w-NAF
+/// form of the scalars on the fly for every base, or vice versa:
+///
+/// ```ignore
+/// use group::Wnaf;
+///
+/// let mut wnaf_contexts: Vec<_> = (0..bases.len()).map(|_| Wnaf::new()).collect();
+/// let mut wnaf_bases: Vec<_> = wnaf_contexts
+///     .iter_mut()
+///     .zip(bases)
+///     .map(|(wnaf, base)| wnaf.base(base, scalars.len()))
+///     .collect();
+/// let results: Vec<_> = wnaf_bases
+///     .iter()
+///     .flat_map(|wnaf_base| scalars.iter().map(|scalar| wnaf_base.scalar(scalar)))
+///     .collect();
+/// ```
+///
+/// Alternatively, use the [`WnafBase`] and [`WnafScalar`] types, which enable the various
+/// tables and w-NAF forms to be cached individually per base and scalar. These types can
+/// then be directly multiplied without any additional runtime work, at the cost of fixing
+/// a specific window size (rather than choosing the window size dynamically).
+#[derive(Debug)]
+pub struct Wnaf<W, B, S> {
+    base: B,
+    scalar: S,
+    window_size: W,
+}
+
+impl<G: Group> Wnaf<(), Vec<G>, Vec<i64>> {
+    /// Construct a new wNAF context without allocating.
+    pub fn new() -> Self {
+        Wnaf {
+            base: vec![],
+            scalar: vec![],
+            window_size: (),
+        }
+    }
+}
+
+#[cfg(feature = "wnaf-memuse")]
+impl<G: Group + memuse::DynamicUsage> memuse::DynamicUsage for Wnaf<(), Vec<G>, Vec<i64>> {
+    fn dynamic_usage(&self) -> usize {
+        self.base.dynamic_usage() + self.scalar.dynamic_usage()
+    }
+
+    fn dynamic_usage_bounds(&self) -> (usize, Option<usize>) {
+        let (base_lower, base_upper) = self.base.dynamic_usage_bounds();
+        let (scalar_lower, scalar_upper) = self.scalar.dynamic_usage_bounds();
+
+        (
+            base_lower + scalar_lower,
+            base_upper.zip(scalar_upper).map(|(a, b)| a + b),
+        )
+    }
+}
+
+impl<G: WnafGroup> Wnaf<(), Vec<G>, Vec<i64>> {
+    /// Given a base and a number of scalars, compute a window table and return a `Wnaf` object that
+    /// can perform exponentiations with `.scalar(..)`.
+    pub fn base(&mut self, base: G, num_scalars: usize) -> Wnaf<usize, &[G], &mut Vec<i64>> {
+        // Compute the appropriate window size based on the number of scalars.
+        let window_size = G::recommended_wnaf_for_num_scalars(num_scalars);
+
+        // Compute a wNAF table for the provided base and window size.
+        wnaf_table(&mut self.base, base, window_size);
+
+        // Return a Wnaf object that immutably borrows the computed base storage location,
+        // but mutably borrows the scalar storage location.
+        Wnaf {
+            base: &self.base[..],
+            scalar: &mut self.scalar,
+            window_size,
+        }
+    }
+
+    /// Given a scalar, compute its wNAF representation and return a `Wnaf` object that can perform
+    /// exponentiations with `.base(..)`.
+    pub fn scalar(&mut self, scalar: &<G as Group>::Scalar) -> Wnaf<usize, &mut Vec<G>, &[i64]> {
+        // We hard-code a window size of 4.
+        let window_size = 4;
+
+        // Compute the wNAF form of the scalar.
+        wnaf_form(&mut self.scalar, scalar.to_repr(), window_size);
+
+        // Return a Wnaf object that mutably borrows the base storage location, but
+        // immutably borrows the computed wNAF form scalar location.
+        Wnaf {
+            base: &mut self.base,
+            scalar: &self.scalar[..],
+            window_size,
+        }
+    }
+}
+
+impl<'a, G: Group> Wnaf<usize, &'a [G], &'a mut Vec<i64>> {
+    /// Constructs new space for the scalar representation while borrowing
+    /// the computed window table, for sending the window table across threads.
+    pub fn shared(&self) -> Wnaf<usize, &'a [G], Vec<i64>> {
+        Wnaf {
+            base: self.base,
+            scalar: vec![],
+            window_size: self.window_size,
+        }
+    }
+}
+
+#[cfg(feature = "wnaf-memuse")]
+impl<'a, G: Group> memuse::DynamicUsage for Wnaf<usize, &'a [G], Vec<i64>> {
+    fn dynamic_usage(&self) -> usize {
+        // The heap memory for the window table is counted in the parent `Wnaf`.
+        self.scalar.dynamic_usage()
+    }
+
+    fn dynamic_usage_bounds(&self) -> (usize, Option<usize>) {
+        self.scalar.dynamic_usage_bounds()
+    }
+}
+
+impl<'a, G: Group> Wnaf<usize, &'a mut Vec<G>, &'a [i64]> {
+    /// Constructs new space for the window table while borrowing
+    /// the computed scalar representation, for sending the scalar representation
+    /// across threads.
+    pub fn shared(&self) -> Wnaf<usize, Vec<G>, &'a [i64]> {
+        Wnaf {
+            base: vec![],
+            scalar: self.scalar,
+            window_size: self.window_size,
+        }
+    }
+}
+
+#[cfg(feature = "wnaf-memuse")]
+impl<'a, G: Group + memuse::DynamicUsage> memuse::DynamicUsage for Wnaf<usize, Vec<G>, &'a [i64]> {
+    fn dynamic_usage(&self) -> usize {
+        // The heap memory for the scalar representation is counted in the parent `Wnaf`.
+        self.base.dynamic_usage()
+    }
+
+    fn dynamic_usage_bounds(&self) -> (usize, Option<usize>) {
+        self.base.dynamic_usage_bounds()
+    }
+}
+
+impl<B, S: AsRef<[i64]>> Wnaf<usize, B, S> {
+    /// Performs exponentiation given a base.
+    pub fn base<G: Group>(&mut self, base: G) -> G
+    where
+        B: AsMut<Vec<G>>,
+    {
+        wnaf_table(self.base.as_mut(), base, self.window_size);
+        wnaf_exp(self.base.as_mut(), self.scalar.as_ref())
+    }
+}
+
+impl<B, S: AsMut<Vec<i64>>> Wnaf<usize, B, S> {
+    /// Performs exponentiation given a scalar.
+    pub fn scalar<G: Group>(&mut self, scalar: &<G as Group>::Scalar) -> G
+    where
+        B: AsRef<[G]>,
+    {
+        wnaf_form(self.scalar.as_mut(), scalar.to_repr(), self.window_size);
+        wnaf_exp(self.base.as_ref(), self.scalar.as_mut())
+    }
+}
+
+/// A "w-ary non-adjacent form" scalar, that uses precomputation to improve the speed of
+/// scalar multiplication.
+///
+/// # Examples
+///
+/// See [`WnafBase`] for usage examples.
+#[derive(Clone, Debug)]
+pub struct WnafScalar<F: PrimeField, const WINDOW_SIZE: usize> {
+    wnaf: Vec<i64>,
+    field: PhantomData<F>,
+}
+
+#[cfg(feature = "wnaf-memuse")]
+impl<F: PrimeField, const WINDOW_SIZE: usize> memuse::DynamicUsage for WnafScalar<F, WINDOW_SIZE> {
+    fn dynamic_usage(&self) -> usize {
+        self.wnaf.dynamic_usage()
+    }
+
+    fn dynamic_usage_bounds(&self) -> (usize, Option<usize>) {
+        self.wnaf.dynamic_usage_bounds()
+    }
+}
+
+impl<F: PrimeField, const WINDOW_SIZE: usize> WnafScalar<F, WINDOW_SIZE> {
+    /// Computes the w-NAF representation of the given scalar with the specified
+    /// `WINDOW_SIZE`.
+    pub fn new(scalar: &F) -> Self {
+        let mut wnaf = vec![];
+
+        // Compute the w-NAF form of the scalar.
+        wnaf_form(&mut wnaf, scalar.to_repr(), WINDOW_SIZE);
+
+        WnafScalar {
+            wnaf,
+            field: PhantomData::default(),
+        }
+    }
+}
+
+/// A fixed window table for a group element, precomputed to improve the speed of scalar
+/// multiplication.
+///
+/// This struct is designed for usage patterns that have long-term cached bases and/or
+/// scalars, or [Cartesian products] of bases and scalars. The [`Wnaf`] API enables one or
+/// the other to be cached, but requires either the base window tables or the scalar w-NAF
+/// forms to be computed repeatedly on the fly, which can become a significant performance
+/// issue for some use cases.
+///
+/// `WnafBase` and [`WnafScalar`] enable an alternative trade-off: by fixing the window
+/// size at compile time, the precomputations are guaranteed to only occur once per base
+/// and once per scalar. Users should select their window size based on how long the bases
+/// are expected to live; a larger window size will consume more memory and take longer to
+/// precompute, but result in faster scalar multiplications.
+///
+/// [Cartesian products]: https://en.wikipedia.org/wiki/Cartesian_product
+///
+/// # Examples
+///
+/// ```ignore
+/// use group::{WnafBase, WnafScalar};
+///
+/// let wnaf_bases: Vec<_> = bases.into_iter().map(WnafBase::<_, 4>::new).collect();
+/// let wnaf_scalars: Vec<_> = scalars.iter().map(WnafScalar::new).collect();
+/// let results: Vec<_> = wnaf_bases
+///     .iter()
+///     .flat_map(|base| wnaf_scalars.iter().map(|scalar| base * scalar))
+///     .collect();
+/// ```
+///
+/// Note that this pattern requires specifying a fixed window size (unlike previous
+/// patterns that picked a suitable window size internally). This is necessary to ensure
+/// in the type system that the base and scalar `Wnaf`s were computed with the same window
+/// size, allowing the result to be computed infallibly.
+#[derive(Clone, Debug)]
+pub struct WnafBase<G: Group, const WINDOW_SIZE: usize> {
+    table: Vec<G>,
+}
+
+#[cfg(feature = "wnaf-memuse")]
+impl<G: Group + memuse::DynamicUsage, const WINDOW_SIZE: usize> memuse::DynamicUsage
+    for WnafBase<G, WINDOW_SIZE>
+{
+    fn dynamic_usage(&self) -> usize {
+        self.table.dynamic_usage()
+    }
+
+    fn dynamic_usage_bounds(&self) -> (usize, Option<usize>) {
+        self.table.dynamic_usage_bounds()
+    }
+}
+
+impl<G: Group, const WINDOW_SIZE: usize> WnafBase<G, WINDOW_SIZE> {
+    /// Computes a window table for the given base with the specified `WINDOW_SIZE`.
+    pub fn new(base: G) -> Self {
+        let mut table = vec![];
+
+        // Compute a window table for the provided base and window size.
+        wnaf_table(&mut table, base, WINDOW_SIZE);
+
+        WnafBase { table }
+    }
+}
+
+impl<G: Group, const WINDOW_SIZE: usize> Mul<&WnafScalar<G::Scalar, WINDOW_SIZE>>
+    for &WnafBase<G, WINDOW_SIZE>
+{
+    type Output = G;
+
+    fn mul(self, rhs: &WnafScalar<G::Scalar, WINDOW_SIZE>) -> Self::Output {
+        wnaf_exp(&self.table, &rhs.wnaf)
+    }
+}
diff --git a/third_party/rust/ff/v0_13/BUILD.gn b/third_party/rust/ff/v0_13/BUILD.gn
index 3915fe77..c8bacdb 100644
--- a/third_party/rust/ff/v0_13/BUILD.gn
+++ b/third_party/rust/ff/v0_13/BUILD.gn
@@ -43,4 +43,9 @@
   rustflags = [
     "--cap-lints=allow",  # Suppress all warnings in crates.io crates
   ]
+
+  # Only for usage from third-party crates. Add the crate to
+  # //third_party/rust/chromium_crates_io/Cargo.toml to use
+  # it from first-party code.
+  visibility = [ "//third_party/rust/*" ]
 }
diff --git a/third_party/rust/group/v0_13/BUILD.gn b/third_party/rust/group/v0_13/BUILD.gn
new file mode 100644
index 0000000..2239668
--- /dev/null
+++ b/third_party/rust/group/v0_13/BUILD.gn
@@ -0,0 +1,49 @@
+# Copyright 2023 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# @generated from third_party/rust/chromium_crates_io/BUILD.gn.hbs by
+# tools/crates/gnrt.
+# Do not edit!
+
+import("//build/rust/cargo_crate.gni")
+
+cargo_crate("lib") {
+  crate_name = "group"
+  epoch = "0.13"
+  crate_type = "rlib"
+  crate_root =
+      "//third_party/rust/chromium_crates_io/vendor/group-v0_13/src/lib.rs"
+  sources = [
+    "//third_party/rust/chromium_crates_io/vendor/group-v0_13/src/cofactor.rs",
+    "//third_party/rust/chromium_crates_io/vendor/group-v0_13/src/lib.rs",
+    "//third_party/rust/chromium_crates_io/vendor/group-v0_13/src/prime.rs",
+    "//third_party/rust/chromium_crates_io/vendor/group-v0_13/src/tests/mod.rs",
+    "//third_party/rust/chromium_crates_io/vendor/group-v0_13/src/wnaf.rs",
+  ]
+  inputs = []
+
+  build_native_rust_unit_tests = false
+  edition = "2021"
+  cargo_pkg_version = "0.13.0"
+  cargo_pkg_authors =
+      "Sean Bowe <ewillbefull@gmail.com>, Jack Grigg <jack@z.cash>"
+  cargo_pkg_name = "group"
+  cargo_pkg_description = "Elliptic curve group traits and utilities"
+  library_configs -= [ "//build/config/coverage:default_coverage" ]
+  library_configs -= [ "//build/config/compiler:chromium_code" ]
+  library_configs += [ "//build/config/compiler:no_chromium_code" ]
+  executable_configs -= [ "//build/config/compiler:chromium_code" ]
+  executable_configs += [ "//build/config/compiler:no_chromium_code" ]
+  proc_macro_configs -= [ "//build/config/compiler:chromium_code" ]
+  proc_macro_configs += [ "//build/config/compiler:no_chromium_code" ]
+  deps = [
+    "//third_party/rust/ff/v0_13:lib",
+    "//third_party/rust/rand_core/v0_9:lib",
+    "//third_party/rust/subtle/v2:lib",
+  ]
+  features = [ "alloc" ]
+  rustflags = [
+    "--cap-lints=allow",  # Suppress all warnings in crates.io crates
+  ]
+}
diff --git a/third_party/rust/group/v0_13/README.chromium b/third_party/rust/group/v0_13/README.chromium
new file mode 100644
index 0000000..8f2a4c7
--- /dev/null
+++ b/third_party/rust/group/v0_13/README.chromium
@@ -0,0 +1,10 @@
+Name: group
+URL: https://crates.io/crates/group
+Version: 0.13.0
+Revision: 090a7ec2f2fca9b4ddec05e39123e57dc0d73a2f
+License: Apache-2.0
+License File: //third_party/rust/chromium_crates_io/vendor/group-v0_13/LICENSE-APACHE
+Shipped: yes
+Security Critical: yes
+
+Description: Elliptic curve group traits and utilities
diff --git a/third_party/search_engines_data/BUILD.gn b/third_party/search_engines_data/BUILD.gn
index 863bf32f..6d66e1e 100644
--- a/third_party/search_engines_data/BUILD.gn
+++ b/third_party/search_engines_data/BUILD.gn
@@ -7,6 +7,7 @@
 json_to_struct("prepopulated_engines") {
   visibility = [
     ":*",
+    "//components/regional_capabilities:*",
     "//components/search_engines:*",
   ]
 
@@ -17,7 +18,10 @@
 }
 
 json_to_struct("regional_settings") {
-  visibility = [ "//components/search_engines:*" ]
+  visibility = [
+    "//components/regional_capabilities:*",
+    "//components/search_engines:test_support",
+  ]
 
   source = "resources/definitions/regional_settings.json"
   schema_file = "regional_settings_schema.json"
diff --git a/third_party/skia b/third_party/skia
index 339ef4f..5f0f9b7 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit 339ef4f48c29aa467362852f2c49bafe4511046e
+Subproject commit 5f0f9b76b975a5c70022a35372bd1618628d3e78
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps
index fb4fe29..22fd0de 160000
--- a/third_party/vulkan-deps
+++ b/third_party/vulkan-deps
@@ -1 +1 @@
-Subproject commit fb4fe29989cbe5e6c5110cbfaaf2e5c4b61a2262
+Subproject commit 22fd0de3755bed1806292e15b640b93e1812bb2b
diff --git a/third_party/vulkan-tools/src b/third_party/vulkan-tools/src
index 289efcc..9c0fff2 160000
--- a/third_party/vulkan-tools/src
+++ b/third_party/vulkan-tools/src
@@ -1 +1 @@
-Subproject commit 289efccc7560f2b970e2b4e0f50349da87669311
+Subproject commit 9c0fff2798d769b4c0681001c24d3d55467dde8f
diff --git a/third_party/vulkan-utility-libraries/src b/third_party/vulkan-utility-libraries/src
index 01851ec..abc2498 160000
--- a/third_party/vulkan-utility-libraries/src
+++ b/third_party/vulkan-utility-libraries/src
@@ -1 +1 @@
-Subproject commit 01851ecae564f8d3da0123659c26a2f5bbfc0228
+Subproject commit abc2498bde8d65841f463431a6220701fad44c64
diff --git a/third_party/vulkan-validation-layers/src b/third_party/vulkan-validation-layers/src
index 6f9d2d3..91fd4f2 160000
--- a/third_party/vulkan-validation-layers/src
+++ b/third_party/vulkan-validation-layers/src
@@ -1 +1 @@
-Subproject commit 6f9d2d358f9585bbd302106e7b5b8135cb19f716
+Subproject commit 91fd4f29aed4015857822e8edad5004e7e3f90da
diff --git a/third_party/webrtc b/third_party/webrtc
index afc8f4f..5ed7ffd 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit afc8f4ffbfd3a54206ecd187144eb80ce75e832d
+Subproject commit 5ed7ffd7ff73d95bf87d85de4eb469bb78af6c2b
diff --git a/tools/crates/gnrt/lib/condition.rs b/tools/crates/gnrt/lib/condition.rs
new file mode 100644
index 0000000..9b00d78
--- /dev/null
+++ b/tools/crates/gnrt/lib/condition.rs
@@ -0,0 +1,525 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+use anyhow::{anyhow, Result};
+
+/// Representation of a `Condition` associated with a conditional/optional
+/// dependency.
+#[derive(Clone, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]
+pub enum Condition {
+    /// The condition is always false.  In other words, supported Chromium
+    /// builds never meet this condition.
+    ///
+    /// Example: `#[cfg(target_arch = "powerpc")]`.
+    AlwaysFalse,
+    /// The condition is always true.
+    ///
+    /// Example: `#[cfg(not(target_arch = "powerpc"))]`.
+    AlwaysTrue,
+    /// Ignored terms.  For example we ignore `target_abi` and assume that
+    /// `target_env` is sufficient for picking the right dependencies.
+    Ignored,
+    /// The condition requires evaluating the nested GN expression.
+    /// The `String` payload is the condition expressed in GN syntax (e.g.
+    /// `is_win`).
+    ///
+    /// For example `#[cfg(target_os = "windows")]` translates into
+    /// `Condition::Expr("is_win".to_string())`.
+    Expr(String),
+    ///
+    /// Some of the [conditional
+    /// compilation](https://doc.rust-lang.org/reference/conditional-compilation.html) directives
+    /// weren't recognized by `gnrt`.
+    ///
+    /// The `String` is an error message.
+    ///
+    /// In some cases such terms will "disappear" - e.g. `unknown_cfg &&
+    /// always_false` is the same as `always_false`.  When these terms do
+    /// not disappear, then it may mean that supporting a new crate would
+    /// require teaching `gnrt` about the new kinds of configuration.
+    Unsupported(String),
+}
+
+impl Condition {
+    pub fn is_always_false(&self) -> bool {
+        *self == Condition::AlwaysFalse
+    }
+
+    pub fn or(lhs: Condition, rhs: Condition) -> Self {
+        // Avoiding unnecessarily constructing `is_win || is_win`.
+        // This is mostly needed for `or`, because this is where
+        // different dependency edge kinds (e.g. `Build` vs `Normal`)
+        // result in `or`-ing of conditions as driven by `deps.rs`.
+        if lhs == rhs {
+            return lhs;
+        }
+
+        match (lhs, rhs) {
+            (Condition::AlwaysFalse, other) | (other, Condition::AlwaysFalse) => other.clone(),
+            (Condition::AlwaysTrue, _) | (_, Condition::AlwaysTrue) => Condition::AlwaysTrue,
+            (Condition::Ignored, other) | (other, Condition::Ignored) => other.clone(),
+            (Condition::Expr(lhs), Condition::Expr(rhs)) => {
+                Condition::Expr(format!("({lhs}) || ({rhs})"))
+            }
+            (err @ Condition::Unsupported(_), _) | (_, err @ Condition::Unsupported(_)) => {
+                err.clone()
+            }
+        }
+    }
+
+    fn and(lhs: Condition, rhs: Condition) -> Self {
+        match (lhs, rhs) {
+            (Condition::AlwaysFalse, _) | (_, Condition::AlwaysFalse) => Condition::AlwaysFalse,
+            (Condition::AlwaysTrue, other) | (other, Condition::AlwaysTrue) => other,
+            (Condition::Ignored, other) | (other, Condition::Ignored) => other,
+            (Condition::Expr(lhs), Condition::Expr(rhs)) => {
+                Condition::Expr(format!("({lhs}) && ({rhs})"))
+            }
+            (err @ Condition::Unsupported(_), _) | (_, err @ Condition::Unsupported(_)) => err,
+        }
+    }
+
+    fn not(other: Condition) -> Self {
+        match other {
+            Condition::AlwaysFalse => Condition::AlwaysTrue,
+            Condition::AlwaysTrue => Condition::AlwaysFalse,
+            Condition::Ignored => Condition::Ignored,
+            Condition::Expr(expr) => Condition::Expr(format!("!({expr})")),
+            err @ Condition::Unsupported(_) => err,
+        }
+    }
+
+    pub fn to_handlebars_value(&self) -> Result<Option<String>> {
+        match self {
+            Condition::AlwaysTrue | Condition::Ignored => Ok(None),
+            Condition::Expr(expr) => Ok(Some(expr.clone())),
+            Condition::AlwaysFalse => unreachable!(
+                "AlwaysFalse dependencies should be filtered out \
+                              by `fn collect_dependencies` from `deps.rs`"
+            ),
+            Condition::Unsupported(err) => {
+                Err(anyhow!("{err}")
+                    .context("Failed to translate `#[cfg(...)]` into a GN condition"))
+            }
+        }
+    }
+
+    pub fn from_target_spec(spec: &target_spec::TargetSpec) -> Self {
+        use target_spec::TargetSpec::*;
+        match spec {
+            PlainString(triple) => triple_to_condition(triple.as_str()),
+            Expression(expr) => {
+                let cfg_expr = expr.expression_str().parse().unwrap();
+                cfg_expr_to_condition(&cfg_expr)
+            }
+        }
+    }
+}
+
+fn cfg_expr_to_condition(cfg_expr: &cargo_platform::CfgExpr) -> Condition {
+    match cfg_expr {
+        cargo_platform::CfgExpr::Not(expr) => Condition::not(cfg_expr_to_condition(expr)),
+        cargo_platform::CfgExpr::All(exprs) => {
+            let mut conds = exprs.iter().map(cfg_expr_to_condition).collect::<Vec<_>>();
+            conds.sort();
+            conds.dedup();
+
+            // https://doc.rust-lang.org/reference/conditional-compilation.html#r-cfg.predicate.all
+            // says that "It is true if "all of the given predicates are true, or if the
+            // list is empty."
+            conds.into_iter().fold(Condition::AlwaysTrue, |accumulated, condition| {
+                Condition::and(accumulated, condition)
+            })
+        }
+        cargo_platform::CfgExpr::Any(exprs) => {
+            let mut conds = exprs.iter().map(cfg_expr_to_condition).collect::<Vec<_>>();
+            conds.sort();
+            conds.dedup();
+
+            // https://doc.rust-lang.org/reference/conditional-compilation.html#r-cfg.predicate.any
+            // says that "It is true if at least one of the given predicates is true. If
+            // there are no predicates, it is false.".
+            conds.into_iter().fold(Condition::AlwaysFalse, |accumulated, condition| {
+                Condition::or(accumulated, condition)
+            })
+        }
+        cargo_platform::CfgExpr::Value(cfg) => cfg_to_condition(cfg),
+    }
+}
+
+fn cfg_to_condition(cfg: &cargo_platform::Cfg) -> Condition {
+    match cfg {
+        cargo_platform::Cfg::Name(name) => cfg_name_to_condition(name),
+        cargo_platform::Cfg::KeyPair(key, value) => match key.as_ref() {
+            "target_abi" => Condition::Ignored,
+            "target_arch" => target_arch_to_condition(value),
+            "target_env" => target_env_to_condition(value),
+            "target_family" => target_family_to_condition(value),
+            "target_os" => target_os_to_condition(value),
+            "target_vendor" => target_vendor_to_condition(value),
+            "panic" => panic_cfg_to_condition(value),
+            _ => {
+                // Keys that start with `target_` are the only remaining ones that are 1) not
+                // handled above, but 2) listed as set by `rustc` by the documentation at
+                // https://doc.rust-lang.org/reference/conditional-compilation.html
+                if key.starts_with("target_") {
+                    // TODO(https://crbug.com/402096443): Add support for more keys set by `rustc`.
+                    Condition::Unsupported(format!("Not yet supported key `{key}` in `{cfg}`"))
+                } else {
+                    // `key` is not set by `rustc` (i.e. it is not documented in
+                    // https://doc.rust-lang.org/reference/conditional-compilation.html and not
+                    // handled above).  Therefore we assume that Chromium will never ask GN/ninja
+                    // to pass `--cfg 'this_unrecognized_key="something"'` to `rustc`.  And
+                    // therefore we treat this as `AlwaysFalse`.  See also
+                    // https://crbug.com/404598090#comment4.
+                    log::warn!(
+                        "Treating unrecogized `#[cfg({key} = \"{value}\")]` as `AlwaysFalse"
+                    );
+                    Condition::AlwaysFalse
+                }
+            }
+        },
+    }
+}
+
+/// `name` should correspond to https://doc.rust-lang.org/reference/conditional-compilation.html#r-cfg.option-name
+fn cfg_name_to_condition(name: &str) -> Condition {
+    // See https://doc.rust-lang.org/reference/conditional-compilation.html#unix-and-windows
+    const FAMILY_NAMES: [&str; 2] = ["unix", "windows"];
+    if FAMILY_NAMES.contains(&name) {
+        return target_family_to_condition(name);
+    }
+
+    // We don't support `windows_raw_dylib` in Chromium.  See also
+    // https://github.com/rust-lang/rust/issues/58713
+    if ["windows_raw_dylib"].contains(&name) {
+        return Condition::AlwaysFalse;
+    }
+
+    // See https://doc.rust-lang.org/reference/conditional-compilation.html#debug_assertions
+    if name == "debug_assertions" {
+        return Condition::Expr("is_debug".to_string());
+    }
+
+    // See https://doc.rust-lang.org/reference/conditional-compilation.html#test
+    //
+    // TODO(https://crbug.com/402096443): Add support for `#[cfg(test)]`.
+    if name == "test" {
+        return Condition::Unsupported("`#[cfg(test)]` is not yet supported by `gnrt`".to_string());
+    }
+
+    // `name` is not something that is documented in
+    // https://doc.rust-lang.org/reference/conditional-compilation.html.  We assume that Chromium
+    // will never ask GN/ninja to pass `--cfg this_unrecognized_name` to `rustc`.
+    // And therefore we treat this as `AlwaysFalse`.  See also https://crbug.com/404598090#comment4.
+    log::warn!("Treating unrecogized `#[cfg({name})]` as `AlwaysFalse");
+    Condition::AlwaysFalse
+}
+
+/// `value` should correspond to https://doc.rust-lang.org/reference/conditional-compilation.html#r-cfg.panic.values
+fn panic_cfg_to_condition(value: &str) -> Condition {
+    // `//build/config/compiler/BUILD.gn` always hardcodes `-Cpanic=abort` into
+    // `rustflags`.
+    match value {
+        "abort" => Condition::AlwaysTrue,
+        "unwind" => Condition::AlwaysFalse,
+        _ => Condition::Unsupported(format!(
+            "Unrecognized panic configuration: `#[cfg(panic = \"{value}\")]`"
+        )),
+    }
+}
+
+fn triple_to_condition(triple: &str) -> Condition {
+    for (t, c) in &[
+        ("i686-linux-android", "is_android && current_cpu == \"x86\""),
+        ("x86_64-linux-android", "is_android && current_cpu == \"x64\""),
+        ("armv7-linux-android", "is_android && current_cpu == \"arm\""),
+        ("aarch64-linux-android", "is_android && current_cpu == \"arm64\""),
+        ("aarch64-fuchsia", "is_fuchsia && current_cpu == \"arm64\""),
+        ("x86_64-fuchsia", "is_fuchsia && current_cpu == \"x64\""),
+        ("aarch64-apple-ios", "is_ios && current_cpu == \"arm64\""),
+        ("armv7-apple-ios", "is_ios && current_cpu == \"arm\""),
+        ("x86_64-apple-ios", "is_ios && current_cpu == \"x64\""),
+        ("i386-apple-ios", "is_ios && current_cpu == \"x86\""),
+        ("i686-pc-windows-msvc", "is_win && current_cpu == \"x86\""),
+        ("x86_64-pc-windows-msvc", "is_win && current_cpu == \"x64\""),
+        ("i686-unknown-linux-gnu", "(is_linux || is_chromeos) && current_cpu == \"x86\""),
+        ("x86_64-unknown-linux-gnu", "(is_linux || is_chromeos) && current_cpu == \"x64\""),
+        ("x86_64-apple-darwin", "is_mac && current_cpu == \"x64\""),
+        ("aarch64-apple-darwin", "is_mac && current_cpu == \"arm64\""),
+    ] {
+        if *t == triple {
+            return Condition::Expr(c.to_string());
+        }
+    }
+
+    // Other target triples are never used in Chromium builds.
+    Condition::AlwaysFalse
+}
+
+/// `target_arch` should correspond to https://doc.rust-lang.org/reference/conditional-compilation.html#target_arch
+fn target_arch_to_condition(target_arch: &str) -> Condition {
+    for (t, c) in &[
+        ("aarch64", "current_cpu == \"arm64\""),
+        ("arm", "current_cpu == \"arm\""),
+        ("x86", "current_cpu == \"x86\""),
+        ("x86_64", "current_cpu == \"x64\""),
+        // `riscv64gc-unknown-linux-gnu` from `build/config/rust.gni` resolves to
+        // `target_os = "riscv64"`.  And `gn help target_cpu` says that this has
+        // the same spelling as GN's `current_cpu`.
+        ("riscv64", "current_cpu == \"riscv64\""),
+    ] {
+        if *t == target_arch {
+            return Condition::Expr(c.to_string());
+        }
+    }
+
+    // Other `target_arch` values are never used in Chromium builds.
+    // Examples: "mipc", "powerpc".
+    Condition::AlwaysFalse
+}
+
+/// `target_env` should correspond to https://doc.rust-lang.org/reference/conditional-compilation.html#target_env
+fn target_env_to_condition(target_env: &str) -> Condition {
+    // Based on https://crbug.com/402096443#comment6 target triples supported by Chromium
+    // only use `target_env` set to either `msvc`, `gnu`, or an empty string.
+    for (t, c) in &[
+        // `msvc` is the only supported environment on Windows.
+        //
+        // TODO(https://crbug.com/402096443): Would returning `Condition::Expr("is_win")` be more
+        // correct?
+        ("msvc", Condition::AlwaysTrue),
+        // Treating `gnu` as `AlwaysFalse`, because:
+        //
+        // * This is how `gnrt` worked in the past
+        // * This helps to filter out packages like `windows_i686_gnu` (this is desirable, because
+        //   Chromium only supports `msvc` environment on Windows.
+        //
+        // OTOH, maybe this is not quite right, because Chromium also supports triples like
+        // "i686-unknown-linux-gnu".
+        //
+        // TODO(https://crbug.com/402096443): Would returning
+        // `Condition::Expr(CONDITION_FOR_TARGET_OS_LINUX.to_string())` be more correct?
+        // OTOH `AlwaysFalse` will trim a dependency, but a more complicated
+        // expression that may be equivalent to `AlwaysFalse` will not trim...
+        ("gnu", Condition::AlwaysFalse),
+        // Based on https://crbug.com/402096443#comment6, an empty `target_env` is only
+        // used in the following cases:
+        ("", Condition::Expr("is_android || is_apple || is_fuchsia".to_string())),
+    ] {
+        if *t == target_env {
+            return c.clone();
+        }
+    }
+
+    // Other `target_env` values are never used by target triples supported by
+    // Chromium. For example, `sgx` is used as condition in `dlmalloc` package
+    // in `std` library, but this condition will never be true in Chromium
+    // builds.
+    Condition::AlwaysFalse
+}
+
+/// `target_family` should correspond to https://doc.rust-lang.org/reference/conditional-compilation.html#target_family
+fn target_family_to_condition(target_family: &str) -> Condition {
+    for (t, c) in &[
+        // Note that while Fuchsia is not a unix, rustc sets the unix cfg
+        // anyway. We must be consistent with rustc. This may change with
+        // https://github.com/rust-lang/rust/issues/58590
+        ("unix", "!is_win"),
+        ("windows", "is_win"),
+    ] {
+        if *t == target_family {
+            return Condition::Expr(c.to_string());
+        }
+    }
+
+    // Other `target_family` values are never used in Chromium builds.
+    // Example: "wasm".
+    Condition::AlwaysFalse
+}
+
+/// `target_os` should correspond to https://doc.rust-lang.org/reference/conditional-compilation.html#target_os
+fn target_os_to_condition(target_os: &str) -> Condition {
+    for (t, c) in &[
+        ("android", "is_android"),
+        // `rustc --print=cfg --target=aarch64-apple-darwin` prints `macos`, not `darwin`.
+        ("macos", "is_mac"),
+        ("fuchsia", "is_fuchsia"),
+        ("ios", "is_ios"),
+        ("linux", CONDITION_FOR_TARGET_OS_LINUX),
+        ("windows", "is_win"),
+        // TODO(https://crbug.com/402096443): Consider also mapping "tvos"
+        // (since `aarch64-apple-tvos` is listed in `build/config/rust.gni`)
+    ] {
+        if *t == target_os {
+            return Condition::Expr(c.to_string());
+        }
+    }
+
+    // Other `target_os` values are never used in Chromium builds.
+    // Examples: "freebsd", "macos" (not sure why "darwin" is preferred...).
+    Condition::AlwaysFalse
+}
+
+/// `target_vendor` should correspond to https://doc.rust-lang.org/reference/conditional-compilation.html#target_vendor
+fn target_vendor_to_condition(target_vendor: &str) -> Condition {
+    for (t, c) in &[("apple", "is_apple"), ("pc", "is_win")] {
+        if *t == target_vendor {
+            return Condition::Expr(c.to_string());
+        }
+    }
+
+    const UNSUPPORTED_VENDORS: [&str; 2] = [
+        "fortanix", // Used as condition in `dlmalloc` package used in `std` library.
+        "uwp",      // Used as condition in some `windows...` crates.
+    ];
+    if UNSUPPORTED_VENDORS.contains(&target_vendor) {
+        return Condition::AlwaysFalse;
+    }
+
+    Condition::Unsupported(format!("unknown `target_vendor` name: `{target_vendor}`"))
+}
+
+/// GN condition corresponding to `target_os` being set to `linux` in `rustc`.
+///
+/// `//build/config/BUILDCONFIG.gn` treats `is_linux` and `is_chromeos` as
+/// mutually exclusive, but at `rustc`-level they are both `target_os = "linux"`
+/// (and `target_env = "gnu"`).  Both of these `rustc`-level values can be taken
+/// directly from the target triple, but we have also directly verified via
+/// `rustc --print=cfg` - see https://crbug.com/402096443#comment6.
+const CONDITION_FOR_TARGET_OS_LINUX: &str = "is_linux || is_chromeos";
+
+#[cfg(test)]
+mod tests {
+    use super::Condition;
+
+    fn condition_from_test_triple(triple: &str) -> Condition {
+        let spec = target_spec::TargetSpec::PlainString(
+            target_spec::TargetSpecPlainString::new(triple.to_string()).unwrap(),
+        );
+        Condition::from_target_spec(&spec)
+    }
+
+    fn condition_from_test_expr(expr: &str) -> Condition {
+        let spec = target_spec::TargetSpec::Expression(
+            target_spec::TargetSpecExpression::new(expr).unwrap(),
+        );
+        Condition::from_target_spec(&spec)
+    }
+
+    #[test]
+    fn test_target_spec_to_condition() {
+        // Try a target triple.
+        assert_eq!(
+            condition_from_test_triple("x86_64-pc-windows-msvc"),
+            Condition::Expr("is_win && current_cpu == \"x64\"".to_string()),
+        );
+
+        // Try a cfg expression.
+        assert_eq!(
+            condition_from_test_expr("any(windows, target_os = \"android\")"),
+            Condition::Expr("(is_android) || (is_win)".to_string()),
+        );
+
+        // Redundant cfg expression.
+        assert_eq!(
+            condition_from_test_expr("any(windows, windows)"),
+            Condition::Expr("is_win".to_string()),
+        );
+
+        // Try a PlatformSet with multiple filters.
+        let filter1 = condition_from_test_triple("armv7-linux-android");
+        let filter2 = condition_from_test_expr("windows");
+        assert_eq!(
+            Condition::or(filter1, filter2),
+            Condition::Expr("(is_android && current_cpu == \"arm\") || (is_win)".to_string()),
+        );
+
+        // A cfg expression on arch only.
+        assert_eq!(
+            condition_from_test_expr("target_arch = \"aarch64\""),
+            Condition::Expr("current_cpu == \"arm64\"".to_string()),
+        );
+
+        // A cfg expression on arch and OS (but not via the target triple string).
+        assert_eq!(
+            condition_from_test_expr("all(target_arch = \"aarch64\", unix)"),
+            Condition::Expr("(!is_win) && (current_cpu == \"arm64\")".to_string()),
+        );
+
+        // A cfg expression taken from `windows_aarch64_msvc` package.
+        assert_eq!(
+            condition_from_test_expr(
+                "all(any(target_arch = \"x86_64\", target_arch = \"arm64ec\"), \
+                     target_env = \"msvc\", \
+                     not(windows_raw_dylib))"
+            ),
+            Condition::Expr("current_cpu == \"x64\"".to_string()),
+        );
+
+        // A cfg expression taken from `windows-targets` => `windows_i686_gnu`
+        // dependency.
+        assert_eq!(
+            condition_from_test_expr(
+                "all(target_arch = \"x86\", \
+                     target_env = \"gnu\", \
+                     not(target_abi = \"llvm\"), \
+                     not(windows_raw_dylib))"
+            ),
+            Condition::AlwaysFalse,
+        );
+
+        // Cfg expressions taken from `getrandom-0.3` => `libc` dependency.
+        assert_eq!(
+            condition_from_test_expr(
+                "any(                         \
+                    target_os = \"ios\",      \
+                    target_os = \"visionos\", \
+                    target_os = \"watchos\",  \
+                    target_os = \"tvos\")",
+            ),
+            Condition::Expr("is_ios".to_string()),
+        );
+        assert_eq!(
+            condition_from_test_expr(
+                "any(                        \
+                    target_os = \"macos\",   \
+                    target_os = \"openbsd\", \
+                    target_os = \"vita\",    \
+                    target_os = \"emscripten\")",
+            ),
+            Condition::Expr("is_mac".to_string()),
+        );
+        assert_eq!(
+            condition_from_test_expr(
+                // Simplification of one of the real expressions below.
+                "all(target_os = \"linux\", target_env = \"\")",
+            ),
+            // TODO(lukasza): Ideally `gnrt` would understand that the condition below is kind of
+            // equivalent to `AlwaysFalse`... :-/
+            Condition::Expr(
+                "(is_android || is_apple || is_fuchsia) && \
+                 (is_linux || is_chromeos)"
+                    .to_string()
+            ),
+        );
+        assert_eq!(
+            condition_from_test_expr(
+                "all(                                                      \
+                    any(target_os = \"linux\", target_os = \"android\"),   \
+                    not(any(                                               \
+                            all(target_os = \"linux\", target_env = \"\"), \
+                            getrandom_backend = \"custom\",                \
+                            getrandom_backend = \"linux_raw\",             \
+                            getrandom_backend = \"rdrand\",                \
+                            getrandom_backend = \"rndr\")))",
+            ),
+            Condition::Expr(
+                "(!((is_android || is_apple || is_fuchsia) && (is_linux || is_chromeos))) && \
+                 ((is_android) || (is_linux || is_chromeos))"
+                    .to_string()
+            ),
+        );
+    }
+}
diff --git a/tools/crates/gnrt/lib/deps.rs b/tools/crates/gnrt/lib/deps.rs
index 3aee182..0b30ae4b 100644
--- a/tools/crates/gnrt/lib/deps.rs
+++ b/tools/crates/gnrt/lib/deps.rs
@@ -5,10 +5,7 @@
 //! Utilities to process `cargo metadata` dependency graph.
 
 use crate::{
-    config::BuildConfig,
-    crates,
-    gn::{target_spec_to_condition, Condition},
-    group::Group,
+    condition::Condition, config::BuildConfig, crates, group::Group,
     inherit::find_inherited_privilege_group,
 };
 
@@ -457,7 +454,7 @@
         PlatformDependent { eval } => eval
             .target_specs()
             .iter()
-            .map(target_spec_to_condition)
+            .map(Condition::from_target_spec)
             .fold(Condition::AlwaysFalse, Condition::or),
     }
 }
diff --git a/tools/crates/gnrt/lib/gn.rs b/tools/crates/gnrt/lib/gn.rs
index 779c3fd..bec5071 100644
--- a/tools/crates/gnrt/lib/gn.rs
+++ b/tools/crates/gnrt/lib/gn.rs
@@ -14,7 +14,7 @@
 use std::collections::{HashMap, HashSet};
 use std::ops::Deref;
 
-use anyhow::{anyhow, bail, Context, Result};
+use anyhow::{bail, Context, Result};
 use itertools::Itertools;
 use serde::Serialize;
 
@@ -428,522 +428,3 @@
     groups.sort_unstable_by(|l, r| l.cond.cmp(&r.cond));
     Ok(groups)
 }
-
-/// Describes a condition for some GN declaration.
-#[derive(Clone, Debug, Hash, Eq, Ord, PartialEq, PartialOrd, Serialize)]
-pub enum Condition {
-    /// The condition is always false.  In other words, supported Chromium
-    /// builds never meet this condition.
-    ///
-    /// Example: `#[cfg(target_arch = "powerpc")]`.
-    AlwaysFalse,
-    /// The condition is always true.
-    ///
-    /// Example: `#[cfg(not(target_arch = "powerpc"))]`.
-    AlwaysTrue,
-    /// Ignored terms.  For example we ignore `target_abi` and assume that
-    /// `target_env` is sufficient for picking the right dependencies.
-    Ignored,
-    /// The condition requires evaluating the nested GN expression.
-    /// The `String` payload is the condition expressed in GN syntax (e.g.
-    /// `is_win`).
-    ///
-    /// For example `#[cfg(target_os = "windows")]` translates into
-    /// `Condition::Expr("is_win".to_string())`.
-    Expr(String),
-    ///
-    /// Some of the [conditional
-    /// compilation](https://doc.rust-lang.org/reference/conditional-compilation.html) directives
-    /// weren't recognized by `gnrt`.
-    ///
-    /// The `String` is an error message.
-    ///
-    /// In some cases such terms will "disappear" - e.g. `unknown_cfg &&
-    /// always_false` is the same as `always_false`.  When these terms do
-    /// not disappear, then it may mean that supporting a new crate would
-    /// require teaching `gnrt` about the new kinds of configuration.
-    Unsupported(String),
-}
-
-impl Condition {
-    pub fn is_always_false(&self) -> bool {
-        *self == Condition::AlwaysFalse
-    }
-
-    pub fn or(lhs: Condition, rhs: Condition) -> Self {
-        // Avoiding unnecessarily constructing `is_win || is_win`.
-        // This is mostly needed for `or`, because this is where
-        // different dependency edge kinds (e.g. `Build` vs `Normal`)
-        // result in `or`-ing of conditions as driven by `deps.rs`.
-        if lhs == rhs {
-            return lhs;
-        }
-
-        match (lhs, rhs) {
-            (Condition::AlwaysFalse, other) | (other, Condition::AlwaysFalse) => other.clone(),
-            (Condition::AlwaysTrue, _) | (_, Condition::AlwaysTrue) => Condition::AlwaysTrue,
-            (Condition::Ignored, other) | (other, Condition::Ignored) => other.clone(),
-            (Condition::Expr(lhs), Condition::Expr(rhs)) => {
-                Condition::Expr(format!("({lhs}) || ({rhs})"))
-            }
-            (err @ Condition::Unsupported(_), _) | (_, err @ Condition::Unsupported(_)) => {
-                err.clone()
-            }
-        }
-    }
-
-    fn and(lhs: Condition, rhs: Condition) -> Self {
-        match (lhs, rhs) {
-            (Condition::AlwaysFalse, _) | (_, Condition::AlwaysFalse) => Condition::AlwaysFalse,
-            (Condition::AlwaysTrue, other) | (other, Condition::AlwaysTrue) => other,
-            (Condition::Ignored, other) | (other, Condition::Ignored) => other,
-            (Condition::Expr(lhs), Condition::Expr(rhs)) => {
-                Condition::Expr(format!("({lhs}) && ({rhs})"))
-            }
-            (err @ Condition::Unsupported(_), _) | (_, err @ Condition::Unsupported(_)) => err,
-        }
-    }
-
-    fn not(other: Condition) -> Self {
-        match other {
-            Condition::AlwaysFalse => Condition::AlwaysTrue,
-            Condition::AlwaysTrue => Condition::AlwaysFalse,
-            Condition::Ignored => Condition::Ignored,
-            Condition::Expr(expr) => Condition::Expr(format!("!({expr})")),
-            err @ Condition::Unsupported(_) => err,
-        }
-    }
-
-    fn to_handlebars_value(&self) -> Result<Option<String>> {
-        match self {
-            Condition::AlwaysTrue | Condition::Ignored => Ok(None),
-            Condition::Expr(expr) => Ok(Some(expr.clone())),
-            Condition::AlwaysFalse => unreachable!(
-                "AlwaysFalse dependencies should be filtered out \
-                              by `fn collect_dependencies` from `deps.rs`"
-            ),
-            Condition::Unsupported(err) => {
-                Err(anyhow!("{err}")
-                    .context("Failed to translate `#[cfg(...)]` into a GN condition"))
-            }
-        }
-    }
-}
-
-pub fn target_spec_to_condition(spec: &target_spec::TargetSpec) -> Condition {
-    use target_spec::TargetSpec::*;
-    match spec {
-        PlainString(triple) => triple_to_condition(triple.as_str()),
-        Expression(expr) => {
-            let cfg_expr = expr.expression_str().parse().unwrap();
-            cfg_expr_to_condition(&cfg_expr)
-        }
-    }
-}
-
-fn cfg_expr_to_condition(cfg_expr: &cargo_platform::CfgExpr) -> Condition {
-    match cfg_expr {
-        cargo_platform::CfgExpr::Not(expr) => Condition::not(cfg_expr_to_condition(expr)),
-        cargo_platform::CfgExpr::All(exprs) => {
-            let mut conds = exprs.iter().map(cfg_expr_to_condition).collect::<Vec<_>>();
-            conds.sort();
-            conds.dedup();
-
-            // https://doc.rust-lang.org/reference/conditional-compilation.html#r-cfg.predicate.all
-            // says that "It is true if "all of the given predicates are true, or if the
-            // list is empty."
-            conds.into_iter().fold(Condition::AlwaysTrue, |accumulated, condition| {
-                Condition::and(accumulated, condition)
-            })
-        }
-        cargo_platform::CfgExpr::Any(exprs) => {
-            let mut conds = exprs.iter().map(cfg_expr_to_condition).collect::<Vec<_>>();
-            conds.sort();
-            conds.dedup();
-
-            // https://doc.rust-lang.org/reference/conditional-compilation.html#r-cfg.predicate.any
-            // says that "It is true if at least one of the given predicates is true. If
-            // there are no predicates, it is false.".
-            conds.into_iter().fold(Condition::AlwaysFalse, |accumulated, condition| {
-                Condition::or(accumulated, condition)
-            })
-        }
-        cargo_platform::CfgExpr::Value(cfg) => cfg_to_condition(cfg),
-    }
-}
-
-fn cfg_to_condition(cfg: &cargo_platform::Cfg) -> Condition {
-    match cfg {
-        cargo_platform::Cfg::Name(name) => cfg_name_to_condition(name),
-        cargo_platform::Cfg::KeyPair(key, value) => match key.as_ref() {
-            "target_abi" => Condition::Ignored,
-            "target_arch" => target_arch_to_condition(value),
-            "target_env" => target_env_to_condition(value),
-            "target_family" => target_family_to_condition(value),
-            "target_os" => target_os_to_condition(value),
-            "target_vendor" => target_vendor_to_condition(value),
-            "panic" => panic_cfg_to_condition(value),
-            _ => {
-                // Keys that start with `target_` are the only remaining ones that are 1) not
-                // handled above, but 2) listed as set by `rustc` by the documentation at
-                // https://doc.rust-lang.org/reference/conditional-compilation.html
-                if key.starts_with("target_") {
-                    // TODO(https://crbug.com/402096443): Add support for more keys set by `rustc`.
-                    Condition::Unsupported(format!("Not yet supported key `{key}` in `{cfg}`"))
-                } else {
-                    // `key` is not set by `rustc` (i.e. it is not documented in
-                    // https://doc.rust-lang.org/reference/conditional-compilation.html and not
-                    // handled above).  Therefore we assume that Chromium will never ask GN/ninja
-                    // to pass `--cfg 'this_unrecognized_key="something"'` to `rustc`.  And
-                    // therefore we treat this as `AlwaysFalse`.  See also
-                    // https://crbug.com/404598090#comment4.
-                    log::warn!(
-                        "Treating unrecogized `#[cfg({key} = \"{value}\")]` as `AlwaysFalse"
-                    );
-                    Condition::AlwaysFalse
-                }
-            }
-        },
-    }
-}
-
-/// `name` should correspond to https://doc.rust-lang.org/reference/conditional-compilation.html#r-cfg.option-name
-fn cfg_name_to_condition(name: &str) -> Condition {
-    // See https://doc.rust-lang.org/reference/conditional-compilation.html#unix-and-windows
-    const FAMILY_NAMES: [&str; 2] = ["unix", "windows"];
-    if FAMILY_NAMES.contains(&name) {
-        return target_family_to_condition(name);
-    }
-
-    // We don't support `windows_raw_dylib` in Chromium.  See also
-    // https://github.com/rust-lang/rust/issues/58713
-    if ["windows_raw_dylib"].contains(&name) {
-        return Condition::AlwaysFalse;
-    }
-
-    // See https://doc.rust-lang.org/reference/conditional-compilation.html#debug_assertions
-    if name == "debug_assertions" {
-        return Condition::Expr("is_debug".to_string());
-    }
-
-    // See https://doc.rust-lang.org/reference/conditional-compilation.html#test
-    //
-    // TODO(https://crbug.com/402096443): Add support for `#[cfg(test)]`.
-    if name == "test" {
-        return Condition::Unsupported("`#[cfg(test)]` is not yet supported by `gnrt`".to_string());
-    }
-
-    // `name` is not something that is documented in
-    // https://doc.rust-lang.org/reference/conditional-compilation.html.  We assume that Chromium
-    // will never ask GN/ninja to pass `--cfg this_unrecognized_name` to `rustc`.
-    // And therefore we treat this as `AlwaysFalse`.  See also https://crbug.com/404598090#comment4.
-    log::warn!("Treating unrecogized `#[cfg({name})]` as `AlwaysFalse");
-    Condition::AlwaysFalse
-}
-
-/// `value` should correspond to https://doc.rust-lang.org/reference/conditional-compilation.html#r-cfg.panic.values
-fn panic_cfg_to_condition(value: &str) -> Condition {
-    // `//build/config/compiler/BUILD.gn` always hardcodes `-Cpanic=abort` into
-    // `rustflags`.
-    match value {
-        "abort" => Condition::AlwaysTrue,
-        "unwind" => Condition::AlwaysFalse,
-        _ => Condition::Unsupported(format!(
-            "Unrecognized panic configuration: `#[cfg(panic = \"{value}\")]`"
-        )),
-    }
-}
-
-fn triple_to_condition(triple: &str) -> Condition {
-    for (t, c) in &[
-        ("i686-linux-android", "is_android && current_cpu == \"x86\""),
-        ("x86_64-linux-android", "is_android && current_cpu == \"x64\""),
-        ("armv7-linux-android", "is_android && current_cpu == \"arm\""),
-        ("aarch64-linux-android", "is_android && current_cpu == \"arm64\""),
-        ("aarch64-fuchsia", "is_fuchsia && current_cpu == \"arm64\""),
-        ("x86_64-fuchsia", "is_fuchsia && current_cpu == \"x64\""),
-        ("aarch64-apple-ios", "is_ios && current_cpu == \"arm64\""),
-        ("armv7-apple-ios", "is_ios && current_cpu == \"arm\""),
-        ("x86_64-apple-ios", "is_ios && current_cpu == \"x64\""),
-        ("i386-apple-ios", "is_ios && current_cpu == \"x86\""),
-        ("i686-pc-windows-msvc", "is_win && current_cpu == \"x86\""),
-        ("x86_64-pc-windows-msvc", "is_win && current_cpu == \"x64\""),
-        ("i686-unknown-linux-gnu", "(is_linux || is_chromeos) && current_cpu == \"x86\""),
-        ("x86_64-unknown-linux-gnu", "(is_linux || is_chromeos) && current_cpu == \"x64\""),
-        ("x86_64-apple-darwin", "is_mac && current_cpu == \"x64\""),
-        ("aarch64-apple-darwin", "is_mac && current_cpu == \"arm64\""),
-    ] {
-        if *t == triple {
-            return Condition::Expr(c.to_string());
-        }
-    }
-
-    // Other target triples are never used in Chromium builds.
-    Condition::AlwaysFalse
-}
-
-/// `target_arch` should correspond to https://doc.rust-lang.org/reference/conditional-compilation.html#target_arch
-fn target_arch_to_condition(target_arch: &str) -> Condition {
-    for (t, c) in &[
-        ("aarch64", "current_cpu == \"arm64\""),
-        ("arm", "current_cpu == \"arm\""),
-        ("x86", "current_cpu == \"x86\""),
-        ("x86_64", "current_cpu == \"x64\""),
-        // `riscv64gc-unknown-linux-gnu` from `build/config/rust.gni` resolves to
-        // `target_os = "riscv64"`.  And `gn help target_cpu` says that this has
-        // the same spelling as GN's `current_cpu`.
-        ("riscv64", "current_cpu == \"riscv64\""),
-    ] {
-        if *t == target_arch {
-            return Condition::Expr(c.to_string());
-        }
-    }
-
-    // Other `target_arch` values are never used in Chromium builds.
-    // Examples: "mipc", "powerpc".
-    Condition::AlwaysFalse
-}
-
-/// `target_env` should correspond to https://doc.rust-lang.org/reference/conditional-compilation.html#target_env
-fn target_env_to_condition(target_env: &str) -> Condition {
-    // Based on https://crbug.com/402096443#comment6 target triples supported by Chromium
-    // only use `target_env` set to either `msvc`, `gnu`, or an empty string.
-    for (t, c) in &[
-        // `msvc` is the only supported environment on Windows.
-        //
-        // TODO(https://crbug.com/402096443): Would returning `Condition::Expr("is_win")` be more
-        // correct?
-        ("msvc", Condition::AlwaysTrue),
-        // Treating `gnu` as `AlwaysFalse`, because:
-        //
-        // * This is how `gnrt` worked in the past
-        // * This helps to filter out packages like `windows_i686_gnu` (this is desirable, because
-        //   Chromium only supports `msvc` environment on Windows.
-        //
-        // OTOH, maybe this is not quite right, because Chromium also supports triples like
-        // "i686-unknown-linux-gnu".
-        //
-        // TODO(https://crbug.com/402096443): Would returning
-        // `Condition::Expr(CONDITION_FOR_TARGET_OS_LINUX.to_string())` be more correct?
-        // OTOH `AlwaysFalse` will trim a dependency, but a more complicated
-        // expression that may be equivalent to `AlwaysFalse` will not trim...
-        ("gnu", Condition::AlwaysFalse),
-        // Based on https://crbug.com/402096443#comment6, an empty `target_env` is only
-        // used in the following cases:
-        ("", Condition::Expr("is_android || is_apple || is_fuchsia".to_string())),
-    ] {
-        if *t == target_env {
-            return c.clone();
-        }
-    }
-
-    // Other `target_env` values are never used by target triples supported by
-    // Chromium. For example, `sgx` is used as condition in `dlmalloc` package
-    // in `std` library, but this condition will never be true in Chromium
-    // builds.
-    Condition::AlwaysFalse
-}
-
-/// `target_family` should correspond to https://doc.rust-lang.org/reference/conditional-compilation.html#target_family
-fn target_family_to_condition(target_family: &str) -> Condition {
-    for (t, c) in &[
-        // Note that while Fuchsia is not a unix, rustc sets the unix cfg
-        // anyway. We must be consistent with rustc. This may change with
-        // https://github.com/rust-lang/rust/issues/58590
-        ("unix", "!is_win"),
-        ("windows", "is_win"),
-    ] {
-        if *t == target_family {
-            return Condition::Expr(c.to_string());
-        }
-    }
-
-    // Other `target_family` values are never used in Chromium builds.
-    // Example: "wasm".
-    Condition::AlwaysFalse
-}
-
-/// `target_os` should correspond to https://doc.rust-lang.org/reference/conditional-compilation.html#target_os
-fn target_os_to_condition(target_os: &str) -> Condition {
-    for (t, c) in &[
-        ("android", "is_android"),
-        // `rustc --print=cfg --target=aarch64-apple-darwin` prints `macos`, not `darwin`.
-        ("macos", "is_mac"),
-        ("fuchsia", "is_fuchsia"),
-        ("ios", "is_ios"),
-        ("linux", CONDITION_FOR_TARGET_OS_LINUX),
-        ("windows", "is_win"),
-        // TODO(https://crbug.com/402096443): Consider also mapping "tvos"
-        // (since `aarch64-apple-tvos` is listed in `build/config/rust.gni`)
-    ] {
-        if *t == target_os {
-            return Condition::Expr(c.to_string());
-        }
-    }
-
-    // Other `target_os` values are never used in Chromium builds.
-    // Examples: "freebsd", "macos" (not sure why "darwin" is preferred...).
-    Condition::AlwaysFalse
-}
-
-/// `target_vendor` should correspond to https://doc.rust-lang.org/reference/conditional-compilation.html#target_vendor
-fn target_vendor_to_condition(target_vendor: &str) -> Condition {
-    for (t, c) in &[("apple", "is_apple"), ("pc", "is_win")] {
-        if *t == target_vendor {
-            return Condition::Expr(c.to_string());
-        }
-    }
-
-    const UNSUPPORTED_VENDORS: [&str; 2] = [
-        "fortanix", // Used as condition in `dlmalloc` package used in `std` library.
-        "uwp",      // Used as condition in some `windows...` crates.
-    ];
-    if UNSUPPORTED_VENDORS.contains(&target_vendor) {
-        return Condition::AlwaysFalse;
-    }
-
-    Condition::Unsupported(format!("unknown `target_vendor` name: `{target_vendor}`"))
-}
-
-/// GN condition corresponding to `target_os` being set to `linux` in `rustc`.
-///
-/// `//build/config/BUILDCONFIG.gn` treats `is_linux` and `is_chromeos` as
-/// mutually exclusive, but at `rustc`-level they are both `target_os = "linux"`
-/// (and `target_env = "gnu"`).  Both of these `rustc`-level values can be taken
-/// directly from the target triple, but we have also directly verified via
-/// `rustc --print=cfg` - see https://crbug.com/402096443#comment6.
-const CONDITION_FOR_TARGET_OS_LINUX: &str = "is_linux || is_chromeos";
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-
-    fn condition_from_test_triple(triple: &str) -> Condition {
-        let spec = target_spec::TargetSpec::PlainString(
-            target_spec::TargetSpecPlainString::new(triple.to_string()).unwrap(),
-        );
-        target_spec_to_condition(&spec)
-    }
-
-    fn condition_from_test_expr(expr: &str) -> Condition {
-        let spec = target_spec::TargetSpec::Expression(
-            target_spec::TargetSpecExpression::new(expr).unwrap(),
-        );
-        target_spec_to_condition(&spec)
-    }
-
-    #[test]
-    fn test_target_spec_to_condition() {
-        // Try a target triple.
-        assert_eq!(
-            condition_from_test_triple("x86_64-pc-windows-msvc"),
-            Condition::Expr("is_win && current_cpu == \"x64\"".to_string()),
-        );
-
-        // Try a cfg expression.
-        assert_eq!(
-            condition_from_test_expr("any(windows, target_os = \"android\")"),
-            Condition::Expr("(is_android) || (is_win)".to_string()),
-        );
-
-        // Redundant cfg expression.
-        assert_eq!(
-            condition_from_test_expr("any(windows, windows)"),
-            Condition::Expr("is_win".to_string()),
-        );
-
-        // Try a PlatformSet with multiple filters.
-        let filter1 = condition_from_test_triple("armv7-linux-android");
-        let filter2 = condition_from_test_expr("windows");
-        assert_eq!(
-            Condition::or(filter1, filter2),
-            Condition::Expr("(is_android && current_cpu == \"arm\") || (is_win)".to_string()),
-        );
-
-        // A cfg expression on arch only.
-        assert_eq!(
-            condition_from_test_expr("target_arch = \"aarch64\""),
-            Condition::Expr("current_cpu == \"arm64\"".to_string()),
-        );
-
-        // A cfg expression on arch and OS (but not via the target triple string).
-        assert_eq!(
-            condition_from_test_expr("all(target_arch = \"aarch64\", unix)"),
-            Condition::Expr("(!is_win) && (current_cpu == \"arm64\")".to_string()),
-        );
-
-        // A cfg expression taken from `windows_aarch64_msvc` package.
-        assert_eq!(
-            condition_from_test_expr(
-                "all(any(target_arch = \"x86_64\", target_arch = \"arm64ec\"), \
-                     target_env = \"msvc\", \
-                     not(windows_raw_dylib))"
-            ),
-            Condition::Expr("current_cpu == \"x64\"".to_string()),
-        );
-
-        // A cfg expression taken from `windows-targets` => `windows_i686_gnu`
-        // dependency.
-        assert_eq!(
-            condition_from_test_expr(
-                "all(target_arch = \"x86\", \
-                     target_env = \"gnu\", \
-                     not(target_abi = \"llvm\"), \
-                     not(windows_raw_dylib))"
-            ),
-            Condition::AlwaysFalse,
-        );
-
-        // Cfg expressions taken from `getrandom-0.3` => `libc` dependency.
-        assert_eq!(
-            condition_from_test_expr(
-                "any(                         \
-                    target_os = \"ios\",      \
-                    target_os = \"visionos\", \
-                    target_os = \"watchos\",  \
-                    target_os = \"tvos\")",
-            ),
-            Condition::Expr("is_ios".to_string()),
-        );
-        assert_eq!(
-            condition_from_test_expr(
-                "any(                        \
-                    target_os = \"macos\",   \
-                    target_os = \"openbsd\", \
-                    target_os = \"vita\",    \
-                    target_os = \"emscripten\")",
-            ),
-            Condition::Expr("is_mac".to_string()),
-        );
-        assert_eq!(
-            condition_from_test_expr(
-                // Simplification of one of the real expressions below.
-                "all(target_os = \"linux\", target_env = \"\")",
-            ),
-            // TODO(lukasza): Ideally `gnrt` would understand that the condition below is kind of
-            // equivalent to `AlwaysFalse`... :-/
-            Condition::Expr(
-                "(is_android || is_apple || is_fuchsia) && \
-                 (is_linux || is_chromeos)"
-                    .to_string()
-            ),
-        );
-        assert_eq!(
-            condition_from_test_expr(
-                "all(                                                      \
-                    any(target_os = \"linux\", target_os = \"android\"),   \
-                    not(any(                                               \
-                            all(target_os = \"linux\", target_env = \"\"), \
-                            getrandom_backend = \"custom\",                \
-                            getrandom_backend = \"linux_raw\",             \
-                            getrandom_backend = \"rdrand\",                \
-                            getrandom_backend = \"rndr\")))",
-            ),
-            Condition::Expr(
-                "(!((is_android || is_apple || is_fuchsia) && (is_linux || is_chromeos))) && \
-                 ((is_android) || (is_linux || is_chromeos))"
-                    .to_string()
-            ),
-        );
-    }
-}
diff --git a/tools/crates/gnrt/lib/lib.rs b/tools/crates/gnrt/lib/lib.rs
index f5ce28b..f99d53c2 100644
--- a/tools/crates/gnrt/lib/lib.rs
+++ b/tools/crates/gnrt/lib/lib.rs
@@ -5,6 +5,7 @@
 #![forbid(unsafe_op_in_unsafe_fn)]
 #![forbid(unsafe_code)]
 
+pub mod condition;
 pub mod config;
 pub mod crates;
 pub mod deps;
diff --git a/tools/crates/gnrt/lib/readme.rs b/tools/crates/gnrt/lib/readme.rs
index 2fb335f..52ed3508 100644
--- a/tools/crates/gnrt/lib/readme.rs
+++ b/tools/crates/gnrt/lib/readme.rs
@@ -67,7 +67,7 @@
     find_security_critical: &mut dyn FnMut(&'a PackageId) -> Option<bool>,
     find_shipped: &mut dyn FnMut(&'a PackageId) -> Option<bool>,
 ) -> Result<(PathBuf, ReadmeFile)> {
-    let epoch = crates::Epoch::from_version(&package.version());
+    let epoch = crates::Epoch::from_version(package.version());
     let dir = paths
         .third_party
         .join(crates::NormalizedName::from_crate_name(package.name()).to_string())
diff --git a/tools/crates/gnrt/vendor.rs b/tools/crates/gnrt/vendor.rs
index 28f5d0f..45c525421 100644
--- a/tools/crates/gnrt/vendor.rs
+++ b/tools/crates/gnrt/vendor.rs
@@ -52,7 +52,7 @@
             .map(|p| p.into())
             .collect();
     let is_removed = |guppy_package_id: &guppy::PackageId| -> bool {
-        let p = graph.metadata(&guppy_package_id).unwrap();
+        let p = graph.metadata(guppy_package_id).unwrap();
         config.resolve.remove_crates.contains(p.name())
             || !guppy_resolved_package_ids.contains(&(&p).into())
     };
@@ -117,7 +117,7 @@
             println!("Downloading {}", &crate_dir);
             download_crate(p.name(), p.version(), paths)?;
             let skip_patches = match &args.no_patches {
-                Some(v) => v.is_empty() || v.iter().find(|x| *x == p.name()).is_some(),
+                Some(v) => v.is_empty() || v.iter().any(|x| *x == p.name()),
                 None => false,
             };
             if skip_patches {
@@ -432,11 +432,8 @@
         .direct_links()
         .filter(|link| !link.dev_only())
         .map(|link| {
-            let feature_dep_info = [link.normal(), link.build()]
-                .into_iter()
-                .filter(|req| req.is_present())
-                .next()
-                .unwrap();
+            let feature_dep_info =
+                [link.normal(), link.build()].into_iter().find(|req| req.is_present()).unwrap();
             PlaceholderDependency {
                 name: link.to().name(),
                 version: link.version_req().to_string(),
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index dc5211a..bb285e1 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -6491,7 +6491,7 @@
 </action>
 
 <action name="ChooseDefaultSearchEngine">
-  <owner>jyammine@google.com</owner>
+  <owner>dgn@chromium.org</owner>
   <owner>chrome-waffle-eng@google.com</owner>
   <description>
     Action indicating that the user clicked on the &quot;Change&quot; button in
@@ -6815,8 +6815,8 @@
 </action>
 
 <action name="ClearBrowsingData_SignOut">
-  <owner>gabolvr@google.com</owner>
   <owner>droger@chromium.org</owner>
+  <owner>chrome-signin-team@google.com</owner>
   <description>
     User signed out from the Clear Browsing Data footer.
   </description>
@@ -10647,7 +10647,7 @@
 </action>
 
 <action name="ExpandSearchEngineDescription">
-  <owner>jyammine@google.com</owner>
+  <owner>dgn@chromium.org</owner>
   <owner>chrome-waffle-eng@google.com</owner>
   <description>
     Action indicating that the user expanded the chevron in the search engine
@@ -31514,7 +31514,7 @@
 </action>
 
 <action name="OsDefaultsChoiceDialogClosed">
-  <owner>dgn@google.com</owner>
+  <owner>dgn@chromium.org</owner>
   <owner>triploblastic@google.com</owner>
   <owner>chrome-waffle-eng@google.com</owner>
   <description>
@@ -31525,7 +31525,7 @@
 </action>
 
 <action name="OsDefaultsChoiceDialogShown" not_user_triggered="true">
-  <owner>dgn@google.com</owner>
+  <owner>dgn@chromium.org</owner>
   <owner>triploblastic@google.com</owner>
   <owner>chrome-waffle-eng@google.com</owner>
   <description>
@@ -31535,7 +31535,7 @@
 </action>
 
 <action name="OsDefaultsChoiceDialogUnblocked" not_user_triggered="true">
-  <owner>dgn@google.com</owner>
+  <owner>dgn@chromium.org</owner>
   <owner>triploblastic@google.com</owner>
   <owner>chrome-waffle-eng@google.com</owner>
   <description>
@@ -34914,7 +34914,7 @@
 </action>
 
 <action name="SearchEngineChoiceScreenShown">
-  <owner>jyammine@google.com</owner>
+  <owner>dgn@chromium.org</owner>
   <owner>chrome-waffle-eng@google.com</owner>
   <description>
     Recorded when the search engine choice screen is displayed. The screen could
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 3518211..3b69c0c 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -9471,6 +9471,7 @@
   <int value="-1859244524" label="NtpRealboxCr23ExpandedStateIcons:disabled"/>
   <int value="-1859095876" label="Previews:disabled"/>
   <int value="-1858742756" label="FirmwareUpdateUIV2:disabled"/>
+  <int value="-1858709632" label="ReaderModeAutoDistill:enabled"/>
   <int value="-1858614075" label="IsolateSandboxedIframes:enabled"/>
   <int value="-1858284725" label="TabGroupsFeedback:enabled"/>
   <int value="-1856902397" label="LoadingWithMojo:enabled"/>
@@ -18335,6 +18336,7 @@
   <int value="1572371872" label="MostVisitedTilesNewScoring:enabled"/>
   <int value="1572464760" label="pwa-update-dialog-for-name-and-icon:disabled"/>
   <int value="1573323485" label="ViewportHeightClientHintHeader:enabled"/>
+  <int value="1573565148" label="ReaderModeAutoDistill:disabled"/>
   <int value="1573754862" label="AutofillEnableFIDOProgressDialog:disabled"/>
   <int value="1573860827" label="EnableImeSandbox:enabled"/>
   <int value="1574392127" label="CanvasNoise:enabled"/>
diff --git a/tools/metrics/histograms/metadata/attribution_reporting/enums.xml b/tools/metrics/histograms/metadata/attribution_reporting/enums.xml
index d5f22aa..316e3466 100644
--- a/tools/metrics/histograms/metadata/attribution_reporting/enums.xml
+++ b/tools/metrics/histograms/metadata/attribution_reporting/enums.xml
@@ -299,6 +299,7 @@
   <int value="1" label="Failed due to error"/>
   <int value="2" label="Dropped due to embedder disabling the API"/>
   <int value="3" label="Failed to assemble"/>
+  <int value="4" label="Expired"/>
 </enum>
 
 <!-- LINT.ThenChange(//content/browser/attribution_reporting/attribution_manager_impl.cc:ConversionReportSendOutcome) -->
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml
index 666ca23..2235fc7 100644
--- a/tools/metrics/histograms/metadata/autofill/histograms.xml
+++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -6099,7 +6099,7 @@
 </histogram>
 
 <histogram name="Autofill.SubmittedCardState" enum="AutofillSubmittedCardState"
-    expires_after="2025-07-01">
+    expires_after="M137">
   <owner>jsaul@google.com</owner>
   <owner>payments-autofill-team@google.com</owner>
   <summary>
@@ -6108,6 +6108,17 @@
   </summary>
 </histogram>
 
+<histogram name="Autofill.SubmittedCardState2"
+    enum="AutofillSubmittedCardState" expires_after="2025-11-01">
+  <owner>jsaul@google.com</owner>
+  <owner>payments-autofill-team@google.com</owner>
+  <summary>
+    Metric to measure credit card state when form is submitted, specifically if
+    it had a valid card number and/or expiration date, and if the form has
+    duplicate fields or invalid card number.
+  </summary>
+</histogram>
+
 <histogram name="Autofill.SubmittedServerCardExpirationStatus"
     enum="AutofillSubmittedServerCardExpirationStatus"
     expires_after="2025-08-31">
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml
index 44a6b9274..dcd3697 100644
--- a/tools/metrics/histograms/metadata/blink/histograms.xml
+++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -5029,6 +5029,24 @@
   </token>
 </histogram>
 
+<histogram name="Blink.UseCounter.AboutBlankOrSrcdoc.Features"
+    enum="FeatureObserver" expires_after="2025-10-07">
+  <owner>wjmaclean@chromium.org</owner>
+  <owner>feature-control@chromium.org</owner>
+  <summary>
+    Count of how many about:blank and about:srcdoc pages use various features
+    across all frames in the page. This histogram has the same semantics as
+    &quot;Blink.UseCounter.Features&quot;, but applies only to `about:blank` and
+    `about:srcdoc` URLs (which that histogram does not include). Metrics are
+    emitted either at the time a document commits, or via
+    UseCounterImpl::ReportMeasurement(), depending on which feature is involved.
+    For example, SandboxedSrcdocFrameResolvesRelativeURL reports at most once
+    per PageVisit, and only when the feature is activated.
+
+    Refer to &quot;Blink.UseCounter.Features&quot; for more details.
+  </summary>
+</histogram>
+
 <histogram name="Blink.UseCounter.AnimatedCSSProperties"
     enum="MappedCSSProperties" expires_after="never">
 <!-- expires-never: used by Chrome Platform Status dashboard -->
diff --git a/tools/metrics/histograms/metadata/browsing_topics/histograms.xml b/tools/metrics/histograms/metadata/browsing_topics/histograms.xml
index a8bd06fc..b7a6df9 100644
--- a/tools/metrics/histograms/metadata/browsing_topics/histograms.xml
+++ b/tools/metrics/histograms/metadata/browsing_topics/histograms.xml
@@ -99,7 +99,7 @@
 </histogram>
 
 <histogram name="BrowsingTopics.EpochTopicsCalculation.Hanging.RetryNumber"
-    units="retry number" expires_after="2025-04-27">
+    units="retry number" expires_after="2025-10-07">
   <owner>yaoxia@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
   <summary>
@@ -137,7 +137,7 @@
 </histogram>
 
 <histogram name="BrowsingTopics.EpochTopicsCalculation.Started.RetryNumber"
-    units="retry number" expires_after="2025-04-27">
+    units="retry number" expires_after="2025-10-07">
   <owner>yaoxia@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
   <summary>
@@ -161,7 +161,7 @@
 
 <histogram
     name="BrowsingTopics.EpochTopicsCalculation.TimeoutRetry.CalculatorResultStatus"
-    enum="BrowsingTopicsCalculatorResultStatus" expires_after="2025-04-13">
+    enum="BrowsingTopicsCalculatorResultStatus" expires_after="2025-10-07">
   <owner>yaoxia@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
   <summary>
@@ -224,7 +224,7 @@
 </histogram>
 
 <histogram name="BrowsingTopics.OverrideList.FileLoadResult"
-    enum="BrowsingTopicsOverrideListFileLoadResult" expires_after="2025-05-04">
+    enum="BrowsingTopicsOverrideListFileLoadResult" expires_after="2025-10-07">
   <owner>robertogden@chromium.org</owner>
   <owner>yaoxia@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
@@ -238,12 +238,14 @@
 </histogram>
 
 <histogram name="BrowsingTopics.OverrideList.UsedOverride" enum="Boolean"
-    expires_after="2024-10-27">
+    expires_after="2025-10-07">
   <owner>robertogden@chromium.org</owner>
   <owner>yaoxia@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
   <summary>
     When the override list is checked, whether it contained the given input.
+    Warning: this histogram was expired from 2024-10-27 to 2025-04-07; data may
+    be missing.
   </summary>
 </histogram>
 
@@ -262,7 +264,7 @@
 </histogram>
 
 <histogram name="BrowsingTopics.Result.FakeTopicCount"
-    enum="BrowsingTopicsNumberOfTopics" expires_after="2025-03-30">
+    enum="BrowsingTopicsNumberOfTopics" expires_after="2025-10-07">
   <owner>yaoxia@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
   <summary>
@@ -313,7 +315,7 @@
 </histogram>
 
 <histogram name="BrowsingTopics.SiteDataStorage.InitStatus"
-    enum="BooleanSuccess" expires_after="2025-04-13">
+    enum="BooleanSuccess" expires_after="2025-10-07">
   <owner>yaoxia@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/gpu/histograms.xml b/tools/metrics/histograms/metadata/gpu/histograms.xml
index 68967a19..dd18741 100644
--- a/tools/metrics/histograms/metadata/gpu/histograms.xml
+++ b/tools/metrics/histograms/metadata/gpu/histograms.xml
@@ -1618,6 +1618,20 @@
   <token key="ExoSurfaceCodePaths" variants="ExoSurfaceCodePaths"/>
 </histogram>
 
+<histogram name="Skia.Graphite.PipelineCache.PipelineUsesInEpoch" units="count"
+    expires_after="2026-01-01">
+  <owner>robertphillips@google.com</owner>
+  <owner>michaelludwig@google.com</owner>
+  <owner>skia-gpu-team@google.com</owner>
+  <summary>
+    This reports the number of Pipelines used in a five-minute window. This
+    provides information regarding the size of the optimal Pipeline active set.
+
+    This is only recorded on clients using both Graphite and Precompilation. It
+    is recorded every five minutes.
+  </summary>
+</histogram>
+
 <histogram name="Skia.Graphite.PipelineCreationRace"
     enum="SkiaPipelineCreationRace" expires_after="2025-11-06">
   <owner>robertphillips@google.com</owner>
@@ -1684,15 +1698,19 @@
 </histogram>
 
 <histogram name="Skia.VulkanMemoryAllocator.AmountAllocated" units="KB"
-    expires_after="2024-09-01">
+    expires_after="2026-01-01">
   <owner>egdaniel@google.com</owner>
-  <owner>bsalomon@google.com</owner>
+  <owner>michaelludwig@google.com</owner>
+  <owner>skia-gpu-team@google.com</owner>
   <summary>
     The total amount of memory that the VulkanMemoryAllocator used by Skia's
     Vulkan backend has allocated. This is GPU memory for VkImages and VkBuffers.
     Note that the allocator may be shared with other users outside of Skia and
     this amount includes their uses as well. This is collected each time we
     request an allocation from Skia.
+
+    Warning: this histogram was expired from 2024-09-01 to 2025-04-02; data may
+    be missing.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/ios/enums.xml b/tools/metrics/histograms/metadata/ios/enums.xml
index 164e763..78cd80d 100644
--- a/tools/metrics/histograms/metadata/ios/enums.xml
+++ b/tools/metrics/histograms/metadata/ios/enums.xml
@@ -1404,6 +1404,22 @@
 
 <!-- LINT.ThenChange(/ios/chrome/browser/push_notification/model/push_notification_client_id.h:PushNotificationClientId) -->
 
+<!-- LINT.IfChange(PushNotificationClientManagerFailurePoint) -->
+
+<enum name="PushNotificationClientManagerFailurePoint">
+  <int value="0" label="Will Present Notification"/>
+  <int value="1" label="Did Register With APNS"/>
+  <int value="2" label="App Did Enter Foreground"/>
+  <int value="3" label="Handle Notification Response"/>
+  <int value="4" label="Will Process Incoming Remote Notification"/>
+  <int value="5" label="GetClientManager: Null Profile Input"/>
+  <int value="6" label="GetClientManager: Missing Profile Service"/>
+  <int value="7" label="GetClientManager: Missing Profile Name in UserInfo"/>
+  <int value="8" label="GetClientManager: Profile Not Found By Name"/>
+</enum>
+
+<!-- LINT.ThenChange(/ios/chrome/browser/push_notification/model/constants.h:PushNotificationClientManagerFailurePoint) -->
+
 <enum name="PushNotificationLifecycleEvent">
   <int value="0" label="Notification received on device"/>
   <int value="1"
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml
index bba075476..9f3a253a 100644
--- a/tools/metrics/histograms/metadata/ios/histograms.xml
+++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -1693,6 +1693,16 @@
   </summary>
 </histogram>
 
+<histogram name="IOS.ExplainWithGemini.CharSelected" units="characters"
+    expires_after="2025-08-31">
+  <owner>prasanaa@google.com</owner>
+  <owner>bling-alchemy-eng@google.com</owner>
+  <summary>
+    Records the number of characters selected when performing a Explain With
+    Gemini.
+  </summary>
+</histogram>
+
 <histogram name="IOS.ExternalAction" enum="IOSExternalAction"
     expires_after="2026-01-31">
   <owner>nicolasmacbeth@google.com</owner>
@@ -4135,6 +4145,22 @@
   </summary>
 </histogram>
 
+<histogram name="IOS.PushNotification.ClientManagerAccessFailure"
+    enum="PushNotificationClientManagerFailurePoint" expires_after="2025-07-01">
+  <owner>bwwilliams@google.com</owner>
+  <owner>scottyoder@google.com</owner>
+  <owner>treib@google.com</owner>
+  <owner>bling-get-set-up@google.com</owner>
+  <summary>
+    Logs the specific code path where obtaining the
+    PushNotificationClientManager for the current Profile failed during
+    notification processing. Helps identify failures caused by
+    PushNotificationProfileService unavailability. Essential for monitoring the
+    health of the multi-Profile push notification infrastructure, especially
+    during its initial rollout and migration.
+  </summary>
+</histogram>
+
 <histogram name="IOS.PushNotification.EnabledPermisisons"
     enum="PushNotificationPermissionPromptStatus" expires_after="2025-08-24">
   <owner>danieltwhite@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/search/histograms.xml b/tools/metrics/histograms/metadata/search/histograms.xml
index 2d777ba..d3f896b 100644
--- a/tools/metrics/histograms/metadata/search/histograms.xml
+++ b/tools/metrics/histograms/metadata/search/histograms.xml
@@ -302,7 +302,7 @@
 
 <histogram name="Search.ChoiceDebug.ScrollStateWithMoreButtonClick"
     enum="SearchEngineChoiceScrollState" expires_after="2025-08-24">
-  <owner>jyammine@google.com</owner>
+  <owner>dgn@chromium.org</owner>
   <owner>chrome-waffle-eng@google.com</owner>
   <summary>
     Records an enum that represents the search engine choice page scroll state
@@ -981,7 +981,7 @@
 
 <histogram name="Search.OsDefaultsChoice.DelayFromDialogShownToFirstStatus"
     units="ms" expires_after="2025-09-14">
-  <owner>dgn@google.com</owner>
+  <owner>dgn@chromium.org</owner>
   <owner>triploblastic@google.com</owner>
   <owner>chrome-waffle-eng@google.com</owner>
   <summary>
@@ -1001,7 +1001,7 @@
 
 <histogram name="Search.OsDefaultsChoice.DelayFromObservationToFirstStatus"
     units="ms" expires_after="2025-09-14">
-  <owner>dgn@google.com</owner>
+  <owner>dgn@chromium.org</owner>
   <owner>triploblastic@google.com</owner>
   <owner>chrome-waffle-eng@google.com</owner>
   <summary>
@@ -1018,7 +1018,7 @@
 
 <histogram name="Search.OsDefaultsChoice.DialogShownAttempt" units="attempts"
     expires_after="2025-09-14">
-  <owner>dgn@google.com</owner>
+  <owner>dgn@chromium.org</owner>
   <owner>triploblastic@google.com</owner>
   <owner>chrome-waffle-eng@google.com</owner>
   <summary>
@@ -1038,7 +1038,7 @@
 
 <histogram name="Search.OsDefaultsChoice.DialogStatusChange"
     enum="OsDefaultsChoiceDialogStatus" expires_after="2025-09-14">
-  <owner>dgn@google.com</owner>
+  <owner>dgn@chromium.org</owner>
   <owner>triploblastic@google.com</owner>
   <owner>chrome-waffle-eng@google.com</owner>
   <summary>
@@ -1056,7 +1056,7 @@
 
 <histogram name="Search.OsDefaultsChoice.DialogStatusOnAppOpen"
     enum="OsDefaultsChoiceDialogStatus" expires_after="2025-09-14">
-  <owner>dgn@google.com</owner>
+  <owner>dgn@chromium.org</owner>
   <owner>triploblastic@google.com</owner>
   <owner>chrome-waffle-eng@google.com</owner>
   <summary>
@@ -1067,7 +1067,7 @@
 
 <histogram name="Search.OsDefaultsChoice.DialogSuppressionStatus"
     enum="OsDefaultsChoiceDialogSuppressionStatus" expires_after="2025-09-14">
-  <owner>dgn@google.com</owner>
+  <owner>dgn@chromium.org</owner>
   <owner>triploblastic@google.com</owner>
   <owner>chrome-waffle-eng@google.com</owner>
   <summary>
@@ -1086,7 +1086,7 @@
 
 <histogram name="Search.OsDefaultsChoice.LaunchChoiceScreenTapHandlingStatus"
     enum="LaunchOsChoiceScreenTapHandlingStatus" expires_after="2025-08-24">
-  <owner>dgn@google.com</owner>
+  <owner>dgn@chromium.org</owner>
   <owner>triploblastic@google.com</owner>
   <owner>chrome-waffle-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/signin/enums.xml b/tools/metrics/histograms/metadata/signin/enums.xml
index 1cf04ddb..7916141 100644
--- a/tools/metrics/histograms/metadata/signin/enums.xml
+++ b/tools/metrics/histograms/metadata/signin/enums.xml
@@ -691,6 +691,7 @@
   <int value="75" label="History page (Android only)"/>
   <int value="76" label="Join collaboration tab group authentication"/>
   <int value="77" label="History Sync Opt-in Expanded Pill"/>
+  <int value="78" label="Widget (iOS only)"/>
 </enum>
 
 <enum name="SigninAccountReconcilorState">
diff --git a/tools/metrics/histograms/metadata/sync/enums.xml b/tools/metrics/histograms/metadata/sync/enums.xml
index 7382567..f58a1a4 100644
--- a/tools/metrics/histograms/metadata/sync/enums.xml
+++ b/tools/metrics/histograms/metadata/sync/enums.xml
@@ -175,10 +175,12 @@
 <enum name="NudgedUpdateResult">
   <int value="0" label="Success"/>
   <int value="1" label="Empty response"/>
-  <int value="2" label="Failed to download data"/>
+  <int value="2" label="Partial failure"/>
+  <int value="3" label="Server error"/>
+  <int value="4" label="Network error"/>
 </enum>
 
-<!-- LINT.ThenChange(/components/sync/engine/data_type_worker.cc:NudgedUpdateResult) -->
+<!-- LINT.ThenChange(/components/sync/engine/update_handler.h:NudgedUpdateResult) -->
 
 <!-- LINT.IfChange(OutgoingPasswordSharingInvitationCommitError) -->
 
diff --git a/tools/metrics/histograms/metadata/ui/enums.xml b/tools/metrics/histograms/metadata/ui/enums.xml
index 48e90d5..d4f6b7d 100644
--- a/tools/metrics/histograms/metadata/ui/enums.xml
+++ b/tools/metrics/histograms/metadata/ui/enums.xml
@@ -1028,7 +1028,7 @@
   <int value="92" label="Show customize chrome side panel"/>
   <int value="93" label="Show tab search declutter page"/>
   <int value="94" label="Open glic"/>
-  <int value="95" label="Explore Extensions"/>
+  <int value="95" label="Find Extensions"/>
 </enum>
 
 <!-- LINT.ThenChange(/chrome/browser/ui/toolbar/app_menu_model.h:AppMenuAction) -->
diff --git a/tools/metrics/histograms/metadata/ui/histograms.xml b/tools/metrics/histograms/metadata/ui/histograms.xml
index 574f43ac..952586f 100644
--- a/tools/metrics/histograms/metadata/ui/histograms.xml
+++ b/tools/metrics/histograms/metadata/ui/histograms.xml
@@ -366,8 +366,8 @@
 
 <histogram name="RenderViewContextMenu.OpenLinkAsProfile" enum="OpenLinkAs"
     expires_after="2025-06-08">
-  <owner>gabolvr@google.com</owner>
   <owner>droger@chromium.org</owner>
+  <owner>chrome-signin-team@google.com</owner>
   <summary>
     Count the clicks and displays of renderer view context menu item Open Link
     as Profile, as well as Open Link in Incognito Window for comparison. If Open
@@ -802,9 +802,9 @@
     <variant name="DistillPage"/>
     <variant name="EnterFullScreen"/>
     <variant name="Exit"/>
-    <variant name="ExploreExtensions"/>
     <variant name="Feedback"/>
     <variant name="Find"/>
+    <variant name="FindExtensions"/>
     <variant name="HelpPage"/>
     <variant name="ImportSettings"/>
     <variant name="InstallPwa"/>
diff --git a/tools/metrics/histograms/metadata/uma/enums.xml b/tools/metrics/histograms/metadata/uma/enums.xml
index f807f01..786d9f8a 100644
--- a/tools/metrics/histograms/metadata/uma/enums.xml
+++ b/tools/metrics/histograms/metadata/uma/enums.xml
@@ -226,6 +226,7 @@
   <int value="902803399"
       label="UMA.PersistentAllocator.CrashpadMetrics.UsedPct"/>
   <int value="910415681" label="DevTools.ExperimentEnabledAtLaunch"/>
+  <int value="1090332742" label="Blink.UseCounter.AboutBlankOrSrcdoc.Features"/>
   <int value="1096524200" label="DevTools.IssueCreated"/>
   <int value="1120293692" label="DocumentEventTiming.BeforeUnloadDuration"/>
   <int value="1126499749"
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index f10b7ba..ce0a58f 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@
             "full_remote_path": "perfetto-luci-artifacts/40b529923598b739b2892a536a7692eedbed5685/linux-arm64/trace_processor_shell"
         },
         "win": {
-            "hash": "43b81d244abca35e4d9d21c99c7ccc9379ebc442",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/4df384ab8fd5cb376e392f6e245593f9ea221f2f/trace_processor_shell.exe"
+            "hash": "55c7d570969d3a22502b3dfe3f7bdd5a62734628",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/514efabacc29850a8e85dacba4210a3494d79c70/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "28bd9c986197285caeb7e5f7e8434e8f61bd7822",
@@ -21,8 +21,8 @@
             "full_remote_path": "perfetto-luci-artifacts/40b529923598b739b2892a536a7692eedbed5685/mac-arm64/trace_processor_shell"
         },
         "linux": {
-            "hash": "c94c4abb9191eac6f1ec7da80f1b112a64937b28",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/4df384ab8fd5cb376e392f6e245593f9ea221f2f/trace_processor_shell"
+            "hash": "bcf8255faac0e7c69248e175955b7bae8d0df3ac",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/754171b07092af1f8ffc5de23ace51f4ea3f04da/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc
index 261a558..c10d3dd4 100644
--- a/ui/accessibility/platform/ax_platform_node_win.cc
+++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -623,7 +623,7 @@
   const HWND hwnd = GetDelegate()->GetTargetForNativeAccessibilityEvent();
   DCHECK(hwnd);
   const float scale_factor =
-      display::win::ScreenWin::GetScaleFactorForHWND(hwnd);
+      display::win::GetScreenWin()->GetScaleFactorForHWND(hwnd);
   const int small_change =
       base::ClampRound(kSmallScrollIncrement * scale_factor);
 
diff --git a/ui/accessibility/platform/ax_system_caret_win.cc b/ui/accessibility/platform/ax_system_caret_win.cc
index ff7b9e2..32617c9 100644
--- a/ui/accessibility/platform/ax_system_caret_win.cc
+++ b/ui/accessibility/platform/ax_system_caret_win.cc
@@ -118,7 +118,7 @@
       // We could optionally add clipping here if ever needed.
       return ToEnclosingRect(data_.relative_bounds.bounds);
     case AXCoordinateSystem::kScreenDIPs:
-      return display::win::ScreenWin::ScreenToDIPRect(
+      return display::win::GetScreenWin()->ScreenToDIPRect(
           event_target_, ToEnclosingRect(data_.relative_bounds.bounds));
     case AXCoordinateSystem::kRootFrame:
     case AXCoordinateSystem::kFrame:
diff --git a/ui/accessibility/platform/browser_accessibility_manager_win.cc b/ui/accessibility/platform/browser_accessibility_manager_win.cc
index 1198758..9a5f0fb0 100644
--- a/ui/accessibility/platform/browser_accessibility_manager_win.cc
+++ b/ui/accessibility/platform/browser_accessibility_manager_win.cc
@@ -1042,7 +1042,7 @@
   // This is because Chromium transforms the screen physical coordinates it
   // receives from Windows into an internal representation of screen physical
   // coordinates adjusted for multiple displays of different resolutions.
-  return display::win::ScreenWin::DIPToScreenRect(GetParentHWND(), bounds);
+  return display::win::GetScreenWin()->DIPToScreenRect(GetParentHWND(), bounds);
 }
 
 void BrowserAccessibilityManagerWin::BeforeAccessibilityEvents() {
diff --git a/ui/android/java/src/org/chromium/ui/DropdownAdapter.java b/ui/android/java/src/org/chromium/ui/DropdownAdapter.java
index 8d6e8ff..40c3d50 100644
--- a/ui/android/java/src/org/chromium/ui/DropdownAdapter.java
+++ b/ui/android/java/src/org/chromium/ui/DropdownAdapter.java
@@ -27,29 +27,23 @@
 import org.chromium.build.annotations.Nullable;
 
 import java.util.List;
-import java.util.Set;
 
 /** Dropdown item adapter for DropdownPopupWindow. */
 @NullMarked
 public class DropdownAdapter extends ArrayAdapter<DropdownItem> {
     private final Context mContext;
-    private final @Nullable Set<Integer> mSeparators;
     private final boolean mAreAllItemsEnabled;
 
     /**
      * Creates an {@code ArrayAdapter} with specified parameters.
+     *
      * @param context Application context.
      * @param items List of labels and icons to display.
-     * @param separators Set of positions that separate {@code items}.
      */
-    public DropdownAdapter(
-            Context context,
-            List<? extends DropdownItem> items,
-            @Nullable Set<Integer> separators) {
+    public DropdownAdapter(Context context, List<? extends DropdownItem> items) {
         super(context, R.layout.dropdown_item);
         mContext = context;
         addAll(items);
-        mSeparators = separators;
         mAreAllItemsEnabled = checkAreAllItemsEnabled();
     }
 
@@ -85,13 +79,7 @@
                             .getDimensionPixelSize(R.dimen.dropdown_item_divider_height);
             height += dividerHeight;
             divider.setHeight(dividerHeight);
-            int dividerColor;
-            if (mSeparators != null && mSeparators.contains(position)) {
-                dividerColor = mContext.getColor(R.color.dropdown_dark_divider_color);
-            } else {
-                dividerColor = mContext.getColor(R.color.dropdown_divider_color);
-            }
-            divider.setDividerColor(dividerColor);
+            divider.setDividerColor(mContext.getColor(R.color.dropdown_divider_color));
         }
 
         DropdownItem item = assumeNonNull(getItem(position));
diff --git a/ui/base/ime/win/input_method_win_base.cc b/ui/base/ime/win/input_method_win_base.cc
index a21238e..cfaaa86 100644
--- a/ui/base/ime/win/input_method_win_base.cc
+++ b/ui/base/ime/win/input_method_win_base.cc
@@ -481,7 +481,7 @@
       return 0;
     dip_rect = client->GetCaretBounds();
   }
-  const gfx::Rect rect = display::win::ScreenWin::DIPToScreenRect(
+  const gfx::Rect rect = display::win::GetScreenWin()->DIPToScreenRect(
       attached_window_handle_, dip_rect);
 
   char_positon->pt.x = rect.x();
diff --git a/ui/base/ime/win/on_screen_keyboard_display_manager_tab_tip.cc b/ui/base/ime/win/on_screen_keyboard_display_manager_tab_tip.cc
index c2e3dfc4..8bd109fd 100644
--- a/ui/base/ime/win/on_screen_keyboard_display_manager_tab_tip.cc
+++ b/ui/base/ime/win/on_screen_keyboard_display_manager_tab_tip.cc
@@ -188,7 +188,8 @@
 
   gfx_osk_rect.Intersect(gfx_main_window_rect);
 
-  return display::win::ScreenWin::ScreenToDIPRect(main_window_, gfx_osk_rect);
+  return display::win::GetScreenWin()->ScreenToDIPRect(main_window_,
+                                                       gfx_osk_rect);
 }
 
 void OnScreenKeyboardDetector::CheckIfKeyboardVisible() {
diff --git a/ui/base/ime/win/tsf_text_store.cc b/ui/base/ime/win/tsf_text_store.cc
index 99f1ef2..3ac6b65 100644
--- a/ui/base/ime/win/tsf_text_store.cc
+++ b/ui/base/ime/win/tsf_text_store.cc
@@ -178,7 +178,7 @@
       index_flags |= IndexFromPointFlags::kNearestToContainedPoint;
     }
     const gfx::Point screen_point_in_dips =
-        gfx::ToFlooredPoint(display::win::ScreenWin::ScreenToDIPPoint(
+        gfx::ToFlooredPoint(display::win::GetScreenWin()->ScreenToDIPPoint(
             gfx::PointF(gfx::Point(*point))));
     const std::optional<size_t> index =
         text_input_client_->GetProximateCharacterIndexFromPoint(
@@ -248,8 +248,8 @@
                                                             &tmp_rect);
   if (result_rect) {
     // This conversion is required for high dpi monitors.
-    *rect = display::win::ScreenWin::DIPToScreenRect(window_handle_,
-                                                     result_rect.value())
+    *rect = display::win::GetScreenWin()
+                ->DIPToScreenRect(window_handle_, result_rect.value())
                 .ToRECT();
   } else {
     // Default if the layout bounds are not present in text input client.
@@ -454,8 +454,8 @@
   TRACE_EVENT1("ime", "TSFTextStore::GetTextExt", "DIP rect",
                result_rect->ToString());
 
-  *rect = display::win::ScreenWin::DIPToScreenRect(window_handle_,
-                                                   result_rect.value())
+  *rect = display::win::GetScreenWin()
+              ->DIPToScreenRect(window_handle_, result_rect.value())
               .ToRECT();
   *clipped = FALSE;
   TRACE_EVENT1("ime", "TSFTextStore::GetTextExt", "screen rect",
diff --git a/ui/base/test/ui_controls_internal_win.cc b/ui/base/test/ui_controls_internal_win.cc
index 5fbb9eaa..453b8fa 100644
--- a/ui/base/test/ui_controls_internal_win.cc
+++ b/ui/base/test/ui_controls_internal_win.cc
@@ -527,7 +527,7 @@
 
 bool SendMouseMoveImpl(int screen_x, int screen_y, base::OnceClosure task) {
   gfx::Point screen_point =
-      display::win::ScreenWin::DIPToScreenPoint({screen_x, screen_y});
+      display::win::GetScreenWin()->DIPToScreenPoint({screen_x, screen_y});
 
   // Check if the mouse is already there.
   POINT current_pos;
diff --git a/ui/base/win/hwnd_metrics.cc b/ui/base/win/hwnd_metrics.cc
index 6166c5c..8eb97ff 100644
--- a/ui/base/win/hwnd_metrics.cc
+++ b/ui/base/win/hwnd_metrics.cc
@@ -16,11 +16,11 @@
   // and SM_CXPADDEDBORDER (additional border space that isn't part of the
   // resize handle).
   const int resize_frame_thickness =
-      display::win::ScreenWin::GetSystemMetricsForMonitor(monitor,
-                                                          SM_CXSIZEFRAME);
+      display::win::GetScreenWin()->GetSystemMetricsForMonitor(monitor,
+                                                               SM_CXSIZEFRAME);
   const int padding_thickness =
-      display::win::ScreenWin::GetSystemMetricsForMonitor(monitor,
-                                                          SM_CXPADDEDBORDER);
+      display::win::GetScreenWin()->GetSystemMetricsForMonitor(
+          monitor, SM_CXPADDEDBORDER);
   return resize_frame_thickness + padding_thickness;
 }
 
diff --git a/ui/chromeos/translations/ui_chromeos_strings_da.xtb b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
index adcfec7c..df0c482 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_da.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
@@ -273,7 +273,7 @@
 <translation id="3241720467332021590">Irsk</translation>
 <translation id="3248185426436836442">Afventer</translation>
 <translation id="3252266817569339921">Fransk</translation>
-<translation id="3253225298092156258">Ikke tilgængeligt</translation>
+<translation id="3253225298092156258">Ikke tilgængelig</translation>
 <translation id="3254434849914415189">Vælg standardappen for <ph name="FILE_TYPE" />-filer:</translation>
 <translation id="3255159654094949700">Arabisk</translation>
 <translation id="326396468955264502"><ph name="NUMBER_OF_FILES" /> filer kunne ikke flyttes, fordi de er krypteret.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb
index a55cd1b..2679a667 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb
@@ -513,7 +513,7 @@
 <translation id="5011233892417813670">Chromebook</translation>
 <translation id="5024856940085636730">Операция күтілгеннен көбірек уақыт алады. Оны доғаруды қалайсыз ба?</translation>
 <translation id="5036159836254554629">Parallels Desktop арқылы бөлісуді басқару</translation>
-<translation id="5038625366300922036">Толығырақ…</translation>
+<translation id="5038625366300922036">Толық ақпарат…</translation>
 <translation id="5044852990838351217">Армян</translation>
 <translation id="5045550434625856497">Құпия сөз дұрыс емес</translation>
 <translation id="5059127710849015030">Непал (транслитерация)</translation>
@@ -665,7 +665,7 @@
 <translation id="6146563240635539929">Бейнелер</translation>
 <translation id="6150853954427645995">Файлды желіден тыс пайдалану үшін желіге қосылып, файлды тінтуірдің оң түймесімен басыңыз және <ph name="OFFLINE_CHECKBOX_NAME" /> опциясын таңдаңыз.</translation>
 <translation id="6164412158936057769">Көбелектер</translation>
-<translation id="6165508094623778733">Толығырақ</translation>
+<translation id="6165508094623778733">Толық ақпарат</translation>
 <translation id="6170470584681422115">Сэндвич</translation>
 <translation id="6177854567773392726">Жад көлемі тексеріліп жатыр… <ph name="ITEMS_FOUND" /> элемент табылды.</translation>
 <translation id="6181912134988520389"><ph name="VM_NAME" /> құрылғысының Google Drive дискісіндегі файлдарды пайдалануына рұқсат беріңіз. Өзгертулер барлық құрылғыда болады.</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
index fc6dc3a..e292dd9 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
@@ -273,7 +273,7 @@
 <translation id="3241720467332021590">iriska</translation>
 <translation id="3248185426436836442">Väntar</translation>
 <translation id="3252266817569339921">franska</translation>
-<translation id="3253225298092156258">Inte tillgängligt</translation>
+<translation id="3253225298092156258">Inte tillgänglig</translation>
 <translation id="3254434849914415189">Välj standardapp för <ph name="FILE_TYPE" />-filer:</translation>
 <translation id="3255159654094949700">arabiska</translation>
 <translation id="326396468955264502">Det gick inte att flytta <ph name="NUMBER_OF_FILES" /> eftersom de är krypterade.</translation>
diff --git a/ui/display/win/local_process_window_finder_win.cc b/ui/display/win/local_process_window_finder_win.cc
index 8f8c46bc..b23136e 100644
--- a/ui/display/win/local_process_window_finder_win.cc
+++ b/ui/display/win/local_process_window_finder_win.cc
@@ -52,7 +52,7 @@
                                                    ScreenWin* screen_win,
                                                    const std::set<HWND>& ignore)
     : BaseWindowFinderWin(ignore), screen_win_(screen_win) {
-  screen_loc_ = display::win::ScreenWin::DIPToScreenPoint(screen_loc);
+  screen_loc_ = display::win::GetScreenWin()->DIPToScreenPoint(screen_loc);
   EnumThreadWindows(GetCurrentThreadId(), WindowCallbackProc, as_lparam());
 }
 
diff --git a/ui/display/win/screen_win.cc b/ui/display/win/screen_win.cc
index 3a0dc73..fc36188c 100644
--- a/ui/display/win/screen_win.cc
+++ b/ui/display/win/screen_win.cc
@@ -44,8 +44,8 @@
 #include "ui/gfx/geometry/vector2d.h"
 #include "ui/gfx/icc_profile.h"
 
-namespace display {
-namespace win {
+namespace display::win {
+
 namespace {
 
 // TODO(robliao): http://crbug.com/615514 Remove when ScreenWin usage is
@@ -580,9 +580,12 @@
   monitor_info.cbSize = sizeof(monitor_info);
   monitor_info.rcMonitor = gfx::Rect{1920, 1080}.ToRECT();
   monitor_info.rcWork = monitor_info.rcMonitor;
+  float device_scale_factor = Display::HasForceDeviceScaleFactor()
+                                  ? Display::GetForcedDeviceScaleFactor()
+                                  : 1.0;
   internal::DisplayInfo display_info(
-      monitor_info, 1.0f, 1.0f, Display::ROTATE_0, 60.0f, gfx::Vector2dF(),
-      DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER, std::string());
+      monitor_info, device_scale_factor, 1.0f, Display::ROTATE_0, 60.0f,
+      gfx::Vector2dF(), DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER, std::string());
   ScreenWinDisplay screen_win_display(display_info);
   screen_win_display.modifiable_display().set_detected(false);
   return screen_win_display;
@@ -590,41 +593,97 @@
 
 }  // namespace
 
+// Fallback ScreenWin implementation used in lieu of a real one.
+class FallbackScreenWin : public ScreenWin {
+ public:
+  FallbackScreenWin() : ScreenWin(/*initialize_from_system=*/false) {
+    CHECK(!instance_);
+    instance_ = this;
+    Initialize();
+  }
+
+  FallbackScreenWin(const FallbackScreenWin&) = delete;
+  FallbackScreenWin& operator=(const FallbackScreenWin&) = delete;
+
+  ~FallbackScreenWin() override { instance_ = nullptr; }
+
+  static bool IsActive() { return instance_ && g_instance == instance_; }
+
+  void Initialize() {
+    screen_win_displays_.clear();
+    screen_win_displays_.push_back(CreateFallbackPrimaryScreenDisplay());
+    displays_ = ScreenWinDisplaysToDisplays(screen_win_displays_);
+  }
+
+  // ScreenWin overrides that mimic old static interface behavior when running
+  // with !g_instance.
+  int GetSystemMetricsForMonitor(HMONITOR monitor, int metric) const override {
+    return ::GetSystemMetrics(metric);
+  }
+
+  int GetSystemMetricsInDIP(int metric) const override {
+    return ::GetSystemMetrics(metric);
+  }
+
+  ScreenWinDisplay GetScreenWinDisplayWithDisplayId(int64_t id) const override {
+    return ScreenWinDisplay();
+  }
+
+  int64_t DisplayIdFromMonitorInfo(
+      const MONITORINFOEX& monitor_info) const override {
+    return internal::DisplayInfo::DisplayIdFromMonitorInfo(monitor_info);
+  }
+
+  void SetRequestHDRStatusCallback(
+      RequestHDRStatusCallback request_hdr_status_callback) override {}
+
+  void SetDXGIInfo(gfx::mojom::DXGIInfoPtr dxgi_info) override {}
+
+  void UpdateDisplayInfos() override {}
+  void UpdateDisplayInfosIfNeeded() override {}
+  void UpdateAllDisplaysAndNotify() override {}
+  void UpdateAllDisplaysIfPrimaryMonitorChanged() override {}
+
+ private:
+  static FallbackScreenWin* instance_;
+};
+
+FallbackScreenWin* FallbackScreenWin::instance_;
+
+// ScreenWin class -----------------------------------------------------------
+
 ScreenWin::ScreenWin() : ScreenWin(true) {}
 
 ScreenWin::~ScreenWin() {
-  DCHECK_EQ(g_instance, this);
+  CHECK_EQ(g_instance, this);
   g_instance = nullptr;
 }
 
-// static
-gfx::PointF ScreenWin::ScreenToDIPPoint(const gfx::PointF& pixel_point) {
+gfx::PointF ScreenWin::ScreenToDIPPoint(const gfx::PointF& pixel_point) const {
   const ScreenWinDisplay screen_win_display =
       GetScreenWinDisplayVia(&ScreenWin::GetScreenWinDisplayNearestScreenPoint,
                              gfx::ToFlooredPoint(pixel_point));
   return display::win::ScreenToDIPPoint(pixel_point, screen_win_display);
 }
 
-// static
-gfx::Point ScreenWin::DIPToScreenPoint(const gfx::Point& dip_point) {
+gfx::Point ScreenWin::DIPToScreenPoint(const gfx::Point& dip_point) const {
   const ScreenWinDisplay screen_win_display = GetScreenWinDisplayVia(
       &ScreenWin::GetScreenWinDisplayNearestDIPPoint, dip_point);
   return display::win::DIPToScreenPoint(dip_point, screen_win_display);
 }
 
-// static
 gfx::Point ScreenWin::ClientToDIPPoint(HWND hwnd,
-                                       const gfx::Point& client_point) {
+                                       const gfx::Point& client_point) const {
   return ScaleToFlooredPoint(client_point, 1.0f / GetScaleFactorForHWND(hwnd));
 }
 
-// static
-gfx::Point ScreenWin::DIPToClientPoint(HWND hwnd, const gfx::Point& dip_point) {
+gfx::Point ScreenWin::DIPToClientPoint(HWND hwnd,
+                                       const gfx::Point& dip_point) const {
   return ScaleToFlooredPoint(dip_point, GetScaleFactorForHWND(hwnd));
 }
 
-// static
-gfx::Rect ScreenWin::ScreenToDIPRect(HWND hwnd, const gfx::Rect& pixel_bounds) {
+gfx::Rect ScreenWin::ScreenToDIPRect(HWND hwnd,
+                                     const gfx::Rect& pixel_bounds) const {
   const ScreenWinDisplay screen_win_display = hwnd
       ? GetScreenWinDisplayVia(&ScreenWin::GetScreenWinDisplayNearestHWND, hwnd)
       : GetScreenWinDisplayVia(
@@ -636,8 +695,8 @@
   return {origin, ScaleToEnclosingRect(pixel_bounds, scale_factor).size()};
 }
 
-// static
-gfx::Rect ScreenWin::DIPToScreenRect(HWND hwnd, const gfx::Rect& dip_bounds) {
+gfx::Rect ScreenWin::DIPToScreenRect(HWND hwnd,
+                                     const gfx::Rect& dip_bounds) const {
   // The HWND parameter is needed for cases where Chrome windows span monitors
   // that have different DPI settings. This is known to matter when using the OS
   // IME support. See https::/crbug.com/1224715 for more details.
@@ -651,34 +710,36 @@
   return {origin, ScaleToEnclosingRect(dip_bounds, scale_factor).size()};
 }
 
-// static
-gfx::Rect ScreenWin::ClientToDIPRect(HWND hwnd, const gfx::Rect& pixel_bounds) {
+gfx::Rect ScreenWin::ClientToDIPRect(HWND hwnd,
+                                     const gfx::Rect& pixel_bounds) const {
   return ScaleToEnclosingRect(pixel_bounds, 1.0f / GetScaleFactorForHWND(hwnd));
 }
 
-// static
-gfx::Rect ScreenWin::DIPToClientRect(HWND hwnd, const gfx::Rect& dip_bounds) {
+gfx::Rect ScreenWin::DIPToClientRect(HWND hwnd,
+                                     const gfx::Rect& dip_bounds) const {
   return ScaleToEnclosingRect(dip_bounds, GetScaleFactorForHWND(hwnd));
 }
 
-// static
 gfx::Size ScreenWin::ScreenToDIPSize(HWND hwnd,
-                                     const gfx::Size& size_in_pixels) {
+                                     const gfx::Size& size_in_pixels) const {
   // Always ceil sizes. Otherwise we may be leaving off part of the bounds.
   return ScaleToCeiledSize(size_in_pixels, 1.0f / GetScaleFactorForHWND(hwnd));
 }
 
-// static
-gfx::Size ScreenWin::DIPToScreenSize(HWND hwnd, const gfx::Size& dip_size) {
+gfx::Size ScreenWin::DIPToScreenSize(HWND hwnd,
+                                     const gfx::Size& dip_size) const {
   // Always ceil sizes. Otherwise we may be leaving off part of the bounds.
   return ScaleToCeiledSize(dip_size, GetScaleFactorForHWND(hwnd));
 }
 
-// static
-int ScreenWin::GetSystemMetricsForMonitor(HMONITOR monitor, int metric) {
-  if (!g_instance)
-    return ::GetSystemMetrics(metric);
+gfx::Vector2dF ScreenWin::GetPixelsPerInch(const gfx::PointF& point) const {
+  const ScreenWinDisplay screen_win_display =
+      GetScreenWinDisplayVia(&ScreenWin::GetScreenWinDisplayNearestDIPPoint,
+                             gfx::ToFlooredPoint(point));
+  return screen_win_display.pixels_per_inch();
+}
 
+int ScreenWin::GetSystemMetricsForMonitor(HMONITOR monitor, int metric) const {
   // Fall back to the primary display's HMONITOR.
   if (!monitor)
     monitor = MonitorFromWindow(nullptr, MONITOR_DEFAULTTOPRIMARY);
@@ -692,34 +753,22 @@
                                      (metric != SM_CXPADDEDBORDER);
 
   // We'll then pull up the system metrics scaled by the appropriate amount.
-  return g_instance->GetSystemMetricsForScaleFactor(
+  return GetSystemMetricsForScaleFactor(
       GetMonitorScaleFactor(monitor, include_accessibility), metric);
 }
 
-// static
-int ScreenWin::GetSystemMetricsInDIP(int metric) {
-  return g_instance ? g_instance->GetSystemMetricsForScaleFactor(1.0f, metric)
-                    : ::GetSystemMetrics(metric);
+int ScreenWin::GetSystemMetricsInDIP(int metric) const {
+  return GetSystemMetricsForScaleFactor(1.0f, metric);
 }
 
-// static
-float ScreenWin::GetScaleFactorForHWND(HWND hwnd) {
-  const HWND root_hwnd = g_instance ? g_instance->GetRootWindow(hwnd) : hwnd;
+float ScreenWin::GetScaleFactorForHWND(HWND hwnd) const {
+  const HWND root_hwnd = GetRootWindow(hwnd);
   const ScreenWinDisplay screen_win_display = GetScreenWinDisplayVia(
       &ScreenWin::GetScreenWinDisplayNearestHWND, root_hwnd);
   return screen_win_display.display().device_scale_factor();
 }
 
-// static
-gfx::Vector2dF ScreenWin::GetPixelsPerInch(const gfx::PointF& point) {
-  const ScreenWinDisplay screen_win_display =
-      GetScreenWinDisplayVia(&ScreenWin::GetScreenWinDisplayNearestDIPPoint,
-                             gfx::ToFlooredPoint(point));
-  return screen_win_display.pixels_per_inch();
-}
-
-// static
-int ScreenWin::GetDPIForHWND(HWND hwnd) {
+int ScreenWin::GetDPIForHWND(HWND hwnd) const {
   if (Display::HasForceDeviceScaleFactor())
     return GetDPIFromScalingFactor(Display::GetForcedDeviceScaleFactor());
 
@@ -728,68 +777,50 @@
       display::win::internal::GetDefaultSystemDPI());
 }
 
-// static
-float ScreenWin::GetScaleFactorForDPI(int dpi) {
+float ScreenWin::GetScaleFactorForDPI(int dpi) const {
   return display::win::GetScaleFactorForDPI(dpi, true);
 }
 
-// static
-float ScreenWin::GetSystemScaleFactor() {
+float ScreenWin::GetSystemScaleFactor() const {
   return display::win::internal::GetUnforcedDeviceScaleFactor();
 }
 
-// static
 void ScreenWin::SetRequestHDRStatusCallback(
     RequestHDRStatusCallback request_hdr_status_callback) {
-  if (g_instance) {
-    g_instance->request_hdr_status_callback_ =
-        std::move(request_hdr_status_callback);
-    g_instance->request_hdr_status_callback_.Run();
-  }
+  request_hdr_status_callback_ = std::move(request_hdr_status_callback);
+  request_hdr_status_callback_.Run();
 }
 
-// static
 void ScreenWin::SetDXGIInfo(gfx::mojom::DXGIInfoPtr dxgi_info) {
-  if (g_instance && !mojo::Equals(g_instance->dxgi_info_, dxgi_info)) {
-    g_instance->dxgi_info_ = std::move(dxgi_info);
-    g_instance->UpdateAllDisplaysAndNotify();
+  if (!mojo::Equals(dxgi_info_, dxgi_info)) {
+    dxgi_info_ = std::move(dxgi_info);
+    UpdateAllDisplaysAndNotify();
   }
 }
 
-// static
-ScreenWinDisplay ScreenWin::GetScreenWinDisplayWithDisplayId(int64_t id) {
-  if (!g_instance)
-    return ScreenWinDisplay();
+ScreenWinDisplay ScreenWin::GetScreenWinDisplayWithDisplayId(int64_t id) const {
   const auto it = std::ranges::find(
-      g_instance->screen_win_displays_, id,
+      screen_win_displays_, id,
       [](const auto& display) { return display.display().id(); });
   // There is 1:1 correspondence between MONITORINFOEX and ScreenWinDisplay.
   // If we found no screens, either there are no screens, or we're in the midst
   // of updating our screens (see crbug.com/768845); either way, hand out the
   // default display.
-  return (it == g_instance->screen_win_displays_.cend())
-             ? g_instance->GetPrimaryScreenWinDisplay()
-             : *it;
+  return (it == screen_win_displays_.cend()) ? GetPrimaryScreenWinDisplay()
+                                             : *it;
 }
 
-// static
-int64_t ScreenWin::DisplayIdFromMonitorInfo(const MONITORINFOEX& monitor_info) {
-  return g_instance
-             ? g_instance->GetDisplayIdFromMonitorInfo(monitor_info)
-             : internal::DisplayInfo::DisplayIdFromMonitorInfo(monitor_info);
+int64_t ScreenWin::DisplayIdFromMonitorInfo(
+    const MONITORINFOEX& monitor_info) const {
+  return GetDisplayIdFromMonitorInfo(monitor_info);
 }
 
-// static
 void ScreenWin::UpdateDisplayInfos() {
-  if (g_instance)
-    g_instance->UpdateAllDisplaysAndNotify();
+  UpdateAllDisplaysAndNotify();
 }
 
-// static
 void ScreenWin::UpdateDisplayInfosIfNeeded() {
-  if (g_instance) {
-    g_instance->UpdateAllDisplaysIfPrimaryMonitorChanged();
-  }
+  UpdateAllDisplaysIfPrimaryMonitorChanged();
 }
 
 HWND ScreenWin::GetHWNDFromNativeWindow(gfx::NativeWindow window) const {
@@ -811,7 +842,7 @@
 
 ScreenWin::ScreenWin(bool initialize_from_system)
     : per_process_dpi_awareness_disabled_for_testing_(!initialize_from_system) {
-  DCHECK(!g_instance);
+  CHECK(!g_instance || FallbackScreenWin::IsActive());
   g_instance = this;
   if (initialize_from_system) {
     Initialize();
@@ -1108,12 +1139,11 @@
       screen_win_displays_,
       [](const auto& display) { return IsPrimaryScreenWinDisplay(display); });
   if (it == screen_win_displays_.end()) {
-    static base::NoDestructor<ScreenWinDisplay>
-        fallback_primary_screen_win_display(
-            CreateFallbackPrimaryScreenDisplay());
+    ScreenWinDisplay fallback_primary_screen_win_display(
+        CreateFallbackPrimaryScreenDisplay());
     LOG(WARNING)
         << "Unable to find a primary display. Fallback to fake display:"
-        << fallback_primary_screen_win_display->display().ToString();
+        << fallback_primary_screen_win_display.display().ToString();
     if (!screen_win_displays_.empty()) {
       std::stringstream ss;
       size_t c = 0;
@@ -1122,7 +1152,7 @@
       }
       LOG(ERROR) << "Existing displays :" << ss.str();
     }
-    return *fallback_primary_screen_win_display;
+    return fallback_primary_screen_win_display;
   }
   return *it;
 }
@@ -1184,5 +1214,24 @@
   return per_process_dpi_awareness_disabled_for_testing_;
 }
 
-}  // namespace win
-}  // namespace display
+// static
+void ScreenWin::ResetFallbackScreenForTesting() {
+  if (g_instance && FallbackScreenWin::IsActive()) {
+    g_instance = nullptr;
+  }
+}
+
+ScreenWin* GetScreenWin() {
+  if (!g_instance) {
+    // Persist the fallback ScreenWin instance but reinitialize it every time
+    // it's used picking up the current device scale factor. This ensures the
+    // correct scale factor in unit tests.
+    static base::NoDestructor<FallbackScreenWin> instance;
+    instance->Initialize();
+    g_instance = instance.get();
+  }
+
+  return g_instance;
+}
+
+}  // namespace display::win
diff --git a/ui/display/win/screen_win.h b/ui/display/win/screen_win.h
index 4de3099..a6c1998 100644
--- a/ui/display/win/screen_win.h
+++ b/ui/display/win/screen_win.h
@@ -17,23 +17,21 @@
 #include "ui/display/win/color_profile_reader.h"
 #include "ui/display/win/screen_win_display.h"
 #include "ui/display/win/uwp_text_scale_factor.h"
+#include "ui/gfx/geometry/point.h"
+#include "ui/gfx/geometry/point_f.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/size.h"
 #include "ui/gfx/geometry/vector2d_f.h"
 #include "ui/gfx/mojom/dxgi_info.mojom.h"
 #include "ui/gfx/native_widget_types.h"
 #include "ui/gfx/win/singleton_hwnd_observer.h"
 
-namespace gfx {
-class Display;
-class Point;
-class PointF;
-class Rect;
-class Size;
-}   // namespace gfx
+class VirtualDisplayUtilWinInteractiveUitest;
 
-namespace display {
-namespace win {
+namespace display::win {
 
 class ScreenWinDisplay;
+class FallbackScreenWin;
 
 namespace internal {
 class DisplayInfo;
@@ -43,8 +41,6 @@
                                  public ColorProfileReader::Client,
                                  public UwpTextScaleFactor::Observer {
  public:
-  ScreenWin();
-
   ScreenWin(const ScreenWin&) = delete;
   ScreenWin& operator=(const ScreenWin&) = delete;
 
@@ -53,20 +49,22 @@
   // Converts a screen physical point to a screen DIP point.
   // The DPI scale is performed relative to the display containing the physical
   // point.
-  static gfx::PointF ScreenToDIPPoint(const gfx::PointF& pixel_point);
+  virtual gfx::PointF ScreenToDIPPoint(const gfx::PointF& pixel_point) const;
 
   // Converts a screen DIP point to a screen physical point.
   // The DPI scale is performed relative to the display containing the DIP
   // point.
-  static gfx::Point DIPToScreenPoint(const gfx::Point& dip_point);
+  virtual gfx::Point DIPToScreenPoint(const gfx::Point& dip_point) const;
 
   // Converts a client physical point relative to |hwnd| to a client DIP point.
   // The DPI scale is performed relative to |hwnd| using an origin of (0, 0).
-  static gfx::Point ClientToDIPPoint(HWND hwnd, const gfx::Point& client_point);
+  virtual gfx::Point ClientToDIPPoint(HWND hwnd,
+                                      const gfx::Point& client_point) const;
 
   // Converts a client DIP point relative to |hwnd| to a client physical point.
   // The DPI scale is performed relative to |hwnd| using an origin of (0, 0).
-  static gfx::Point DIPToClientPoint(HWND hwnd, const gfx::Point& dip_point);
+  virtual gfx::Point DIPToClientPoint(HWND hwnd,
+                                      const gfx::Point& dip_point) const;
 
   // WARNING: There is no right way to scale sizes and rects.
   // Sometimes you may need the enclosing rect (which favors transformations
@@ -80,7 +78,8 @@
   // The DPI scale is performed relative to the display nearest to |hwnd|.
   // If |hwnd| is null, scaling will be performed to the display nearest to
   // |pixel_bounds|.
-  static gfx::Rect ScreenToDIPRect(HWND hwnd, const gfx::Rect& pixel_bounds);
+  virtual gfx::Rect ScreenToDIPRect(HWND hwnd,
+                                    const gfx::Rect& pixel_bounds) const;
 
   // Converts a screen DIP rect to a screen physical rect.
   // If |hwnd| is null, scaling will be performed using the DSF of the display
@@ -88,27 +87,31 @@
   // of the display nearest to |hwnd|.  Thus if an existing HWND is moving to a
   // different display, it's often more correct to pass null for |hwnd| to get
   // the new display's scale factor rather than the old one's.
-  static gfx::Rect DIPToScreenRect(HWND hwnd, const gfx::Rect& dip_bounds);
+  virtual gfx::Rect DIPToScreenRect(HWND hwnd,
+                                    const gfx::Rect& dip_bounds) const;
 
   // Converts a client physical rect to a client DIP rect.
   // The DPI scale is performed relative to |hwnd| using an origin of (0, 0).
-  static gfx::Rect ClientToDIPRect(HWND hwnd, const gfx::Rect& pixel_bounds);
+  virtual gfx::Rect ClientToDIPRect(HWND hwnd,
+                                    const gfx::Rect& pixel_bounds) const;
 
   // Converts a client DIP rect to a client physical rect.
   // The DPI scale is performed relative to |hwnd| using an origin of (0, 0).
-  static gfx::Rect DIPToClientRect(HWND hwnd, const gfx::Rect& dip_bounds);
+  virtual gfx::Rect DIPToClientRect(HWND hwnd,
+                                    const gfx::Rect& dip_bounds) const;
 
   // Converts a physical size to a DIP size.
   // The DPI scale is performed relative to the display nearest to |hwnd|.
-  static gfx::Size ScreenToDIPSize(HWND hwnd, const gfx::Size& size_in_pixels);
+  virtual gfx::Size ScreenToDIPSize(HWND hwnd,
+                                    const gfx::Size& size_in_pixels) const;
 
   // Converts a DIP size to a physical size.
   // The DPI scale is performed relative to the display nearest to |hwnd|.
-  static gfx::Size DIPToScreenSize(HWND hwnd, const gfx::Size& dip_size);
+  virtual gfx::Size DIPToScreenSize(HWND hwnd, const gfx::Size& dip_size) const;
 
   // Returns the number of physical pixels per inch for a display associated
   // with the point.
-  static gfx::Vector2dF GetPixelsPerInch(const gfx::PointF& point);
+  virtual gfx::Vector2dF GetPixelsPerInch(const gfx::PointF& point) const;
 
   // Returns the result of GetSystemMetrics for |metric| scaled to |monitor|'s
   // DPI. Use this function if you're already working with screen pixels, as
@@ -118,57 +121,58 @@
   // Note that metrics which correspond to elements drawn by Windows
   // (specifically frame and resize handles) will be scaled by DPI only and not
   // by Text Zoom or other accessibility features.
-  static int GetSystemMetricsForMonitor(HMONITOR monitor, int metric);
+  virtual int GetSystemMetricsForMonitor(HMONITOR monitor, int metric) const;
 
   // Returns the result of GetSystemMetrics for |metric| in DIP.
   // Use this function if you need to work in DIP and can tolerate cascading
   // rounding errors towards screen pixels.
-  static int GetSystemMetricsInDIP(int metric);
+  virtual int GetSystemMetricsInDIP(int metric) const;
 
   // Returns |hwnd|'s scale factor, including accessibility adjustments.
-  static float GetScaleFactorForHWND(HWND hwnd);
+  virtual float GetScaleFactorForHWND(HWND hwnd) const;
 
   // Returns the unmodified DPI for a particular |hwnd|, without accessibility
   // adjustments.
-  static int GetDPIForHWND(HWND hwnd);
+  virtual int GetDPIForHWND(HWND hwnd) const;
 
   // Converts dpi to scale factor, including accessibility adjustments.
-  static float GetScaleFactorForDPI(int dpi);
+  virtual float GetScaleFactorForDPI(int dpi) const;
 
   // Returns the system's global scale factor, ignoring the value of
   // --force-device-scale-factor. Only use this if you are working with Windows
   // metrics global to the system. Otherwise you should call
   // GetScaleFactorForHWND() to get the correct scale factor for the monitor
   // you are targeting.
-  static float GetSystemScaleFactor();
+  virtual float GetSystemScaleFactor() const;
 
   // Set a callback to use to query the status of HDR. This callback will be
   // called when the status of HDR may have changed.
   using RequestHDRStatusCallback = base::RepeatingClosure;
-  static void SetRequestHDRStatusCallback(
+  virtual void SetRequestHDRStatusCallback(
       RequestHDRStatusCallback request_hdr_status_callback);
 
   // Set information gathered from DXGI adapters and outputs (e.g, HDR
   // parameters).
-  static void SetDXGIInfo(gfx::mojom::DXGIInfoPtr dxgi_info);
+  virtual void SetDXGIInfo(gfx::mojom::DXGIInfoPtr dxgi_info);
 
   // Returns the ScreenWinDisplay with the given id, or a default object if an
   // unrecognized id was specified or if this was called during a screen update.
-  static ScreenWinDisplay GetScreenWinDisplayWithDisplayId(int64_t id);
+  virtual ScreenWinDisplay GetScreenWinDisplayWithDisplayId(int64_t id) const;
 
   // Returns the display id for the given monitor info.
-  static int64_t DisplayIdFromMonitorInfo(const MONITORINFOEX& monitor_info);
+  virtual int64_t DisplayIdFromMonitorInfo(
+      const MONITORINFOEX& monitor_info) const;
 
   // Updates the display infos to make sure they have the right scale factors.
   // This is called before handling WM_DPICHANGED messages, to be sure that we
   // have the right scale factors for the screens.
-  static void UpdateDisplayInfos();
+  virtual void UpdateDisplayInfos();
 
   // Updates the display infos if it appears that Windows state has changed
   // in a way that requires the display infos to be updated. This currently
   // only detects when the primary monitor changes, which it does when a monitor
   // is added or removed.
-  static void UpdateDisplayInfosIfNeeded();
+  virtual void UpdateDisplayInfosIfNeeded();
 
   // Returns the HWND associated with the NativeWindow.
   virtual HWND GetHWNDFromNativeWindow(gfx::NativeWindow view) const;
@@ -184,10 +188,24 @@
   virtual std::optional<bool> IsWindowOnCurrentVirtualDesktop(
       gfx::NativeWindow window) const;
 
+  // Resets cached fallback screen for testing. Has no effect if there is no
+  // fallback screen. Fallback screen remembers forced device scale factor at
+  // the time of creation and thus has to be reset in unit tests running in the
+  // same process, similar to Display::ResetForceDeviceScaleFactorForTesting().
+  static void ResetFallbackScreenForTesting();
+
  protected:
+  friend class FallbackScreenWin;
+
   FRIEND_TEST_ALL_PREFIXES(ScreenWinTestSingleDisplay1x,
                            DisconnectPrimaryDisplay);
 
+  // Allow virtual display test to access default constructor that picks up the
+  // system monitor configuration.
+  friend class ::VirtualDisplayUtilWinInteractiveUitest;
+
+  ScreenWin();
+
   // `initialize_from_system` is true if the ScreenWin should be initialized
   // from the Windows desktop environment, e.g., the monitor information and
   // configuration. It is false in unit tests, true in Chrome and browser
@@ -264,6 +282,7 @@
 
  private:
   void Initialize();
+
   void OnWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
 
   // Returns the result of calling |getter| with |value| on the global
@@ -322,7 +341,10 @@
   HMONITOR primary_monitor_ = nullptr;
 };
 
-}  // namespace win
-}  // namespace display
+// Returns a ScreenWin instance. If one does not exist, creates a fallback
+// ScreenWin instance that may be replaced with the real one later if necessary.
+DISPLAY_EXPORT ScreenWin* GetScreenWin();
+
+}  // namespace display::win
 
 #endif  // UI_DISPLAY_WIN_SCREEN_WIN_H_
diff --git a/ui/display/win/screen_win_headless.cc b/ui/display/win/screen_win_headless.cc
index 30e5794b..3d97014 100644
--- a/ui/display/win/screen_win_headless.cc
+++ b/ui/display/win/screen_win_headless.cc
@@ -139,6 +139,22 @@
   return std::nullopt;
 }
 
+gfx::Rect ScreenWinHeadless::ScreenToDIPRectInWindow(
+    gfx::NativeWindow window,
+    const gfx::Rect& screen_rect) const {
+  // The base class implementation does the right thing, but we want this to be
+  // exposed publicly as the rest of display::Screen overrides.
+  return ScreenWin::ScreenToDIPRectInWindow(window, screen_rect);
+}
+
+gfx::Rect ScreenWinHeadless::DIPToScreenRectInWindow(
+    gfx::NativeWindow window,
+    const gfx::Rect& dip_rect) const {
+  // The base class implementation does the right thing, but we want this to be
+  // exposed publicly as the rest of display::Screen overrides.
+  return ScreenWin::DIPToScreenRectInWindow(window, dip_rect);
+}
+
 bool ScreenWinHeadless::IsHeadless() const {
   return true;
 }
diff --git a/ui/display/win/screen_win_headless.h b/ui/display/win/screen_win_headless.h
index 6bcacbb..c852f1d 100644
--- a/ui/display/win/screen_win_headless.h
+++ b/ui/display/win/screen_win_headless.h
@@ -47,6 +47,11 @@
   Display GetDisplayNearestPoint(const gfx::Point& point) const override;
   Display GetDisplayMatching(const gfx::Rect& match_rect) const override;
   Display GetPrimaryDisplay() const override;
+  gfx::Rect ScreenToDIPRectInWindow(
+      gfx::NativeWindow window,
+      const gfx::Rect& screen_rect) const override;
+  gfx::Rect DIPToScreenRectInWindow(gfx::NativeWindow window,
+                                    const gfx::Rect& dip_rect) const override;
   bool IsHeadless() const override;
 
   // ScreenWin:
diff --git a/ui/display/win/screen_win_headless_unittest.cc b/ui/display/win/screen_win_headless_unittest.cc
index 2c4467f..c5013ad 100644
--- a/ui/display/win/screen_win_headless_unittest.cc
+++ b/ui/display/win/screen_win_headless_unittest.cc
@@ -56,20 +56,6 @@
     return reinterpret_cast<gfx::NativeWindow>(hwnd);
   }
 
-  // The following two methods are protected in ScreenWin and not overridden by
-  // ScreenWinHeadless because the base class does the right thing, so expose
-  // them here for testing.
-  gfx::Rect ScreenToDIPRectInWindow(
-      gfx::NativeWindow window,
-      const gfx::Rect& screen_rect) const override {
-    return ScreenWin::ScreenToDIPRectInWindow(window, screen_rect);
-  }
-
-  gfx::Rect DIPToScreenRectInWindow(gfx::NativeWindow window,
-                                    const gfx::Rect& dip_rect) const override {
-    return ScreenWin::DIPToScreenRectInWindow(window, dip_rect);
-  }
-
   // win::ScreenWinHeadless:
   std::vector<gfx::NativeWindow> GetNativeWindowsAtScreenPoint(
       const gfx::Point& point) const override {
@@ -278,7 +264,7 @@
   auto screen = CreateHeadlessScreen("{devicePixelRatio=1.0}");
   ASSERT_EQ(screen->GetNumDisplays(), 1);
 
-  EXPECT_EQ(ScreenWin::ScreenToDIPPoint(gfx::PointF(100, 200)),
+  EXPECT_EQ(GetScreenWin()->ScreenToDIPPoint(gfx::PointF(100, 200)),
             gfx::PointF(100, 200));
 }
 
@@ -286,7 +272,7 @@
   auto screen = CreateHeadlessScreen("{devicePixelRatio=2.0}");
   ASSERT_EQ(screen->GetNumDisplays(), 1);
 
-  EXPECT_EQ(ScreenWin::ScreenToDIPPoint(gfx::PointF(100, 200)),
+  EXPECT_EQ(GetScreenWin()->ScreenToDIPPoint(gfx::PointF(100, 200)),
             gfx::PointF(50, 100));
 }
 
@@ -294,7 +280,7 @@
   auto screen = CreateHeadlessScreen("{devicePixelRatio=1.0}");
   ASSERT_EQ(screen->GetNumDisplays(), 1);
 
-  EXPECT_EQ(ScreenWin::DIPToScreenPoint(gfx::Point(100, 200)),
+  EXPECT_EQ(GetScreenWin()->DIPToScreenPoint(gfx::Point(100, 200)),
             gfx::Point(100, 200));
 }
 
@@ -302,7 +288,7 @@
   auto screen = CreateHeadlessScreen("{devicePixelRatio=2.0}");
   ASSERT_EQ(screen->GetNumDisplays(), 1);
 
-  EXPECT_EQ(ScreenWin::DIPToScreenPoint(gfx::Point(100, 200)),
+  EXPECT_EQ(GetScreenWin()->DIPToScreenPoint(gfx::Point(100, 200)),
             gfx::Point(200, 400));
 }
 
@@ -313,7 +299,7 @@
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
 
-  EXPECT_EQ(ScreenWin::ClientToDIPPoint(hwnd, gfx::Point(100, 200)),
+  EXPECT_EQ(GetScreenWin()->ClientToDIPPoint(hwnd, gfx::Point(100, 200)),
             gfx::Point(100, 200));
 }
 
@@ -324,7 +310,7 @@
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
 
-  EXPECT_EQ(ScreenWin::ClientToDIPPoint(hwnd, gfx::Point(100, 200)),
+  EXPECT_EQ(GetScreenWin()->ClientToDIPPoint(hwnd, gfx::Point(100, 200)),
             gfx::Point(50, 100));
 }
 
@@ -335,7 +321,7 @@
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
 
-  EXPECT_EQ(ScreenWin::DIPToClientPoint(hwnd, gfx::Point(100, 200)),
+  EXPECT_EQ(GetScreenWin()->DIPToClientPoint(hwnd, gfx::Point(100, 200)),
             gfx::Point(100, 200));
 }
 
@@ -346,7 +332,7 @@
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
 
-  EXPECT_EQ(ScreenWin::DIPToClientPoint(hwnd, gfx::Point(50, 100)),
+  EXPECT_EQ(GetScreenWin()->DIPToClientPoint(hwnd, gfx::Point(50, 100)),
             gfx::Point(100, 200));
 }
 
@@ -357,10 +343,10 @@
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
 
-  EXPECT_EQ(ScreenWin::ScreenToDIPRect(hwnd, gfx::Rect(0, 0, 100, 200)),
+  EXPECT_EQ(GetScreenWin()->ScreenToDIPRect(hwnd, gfx::Rect(0, 0, 100, 200)),
             gfx::Rect(0, 0, 100, 200));
 
-  EXPECT_EQ(ScreenWin::ScreenToDIPRect(nullptr, gfx::Rect(0, 0, 100, 200)),
+  EXPECT_EQ(GetScreenWin()->ScreenToDIPRect(nullptr, gfx::Rect(0, 0, 100, 200)),
             gfx::Rect(0, 0, 100, 200));
 }
 
@@ -371,10 +357,10 @@
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
 
-  EXPECT_EQ(ScreenWin::ScreenToDIPRect(hwnd, gfx::Rect(0, 0, 100, 200)),
+  EXPECT_EQ(GetScreenWin()->ScreenToDIPRect(hwnd, gfx::Rect(0, 0, 100, 200)),
             gfx::Rect(0, 0, 50, 100));
 
-  EXPECT_EQ(ScreenWin::ScreenToDIPRect(nullptr, gfx::Rect(0, 0, 100, 200)),
+  EXPECT_EQ(GetScreenWin()->ScreenToDIPRect(nullptr, gfx::Rect(0, 0, 100, 200)),
             gfx::Rect(0, 0, 50, 100));
 }
 
@@ -385,10 +371,10 @@
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
 
-  EXPECT_EQ(ScreenWin::DIPToScreenRect(hwnd, gfx::Rect(0, 0, 100, 200)),
+  EXPECT_EQ(GetScreenWin()->DIPToScreenRect(hwnd, gfx::Rect(0, 0, 100, 200)),
             gfx::Rect(0, 0, 100, 200));
 
-  EXPECT_EQ(ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 100, 200)),
+  EXPECT_EQ(GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 100, 200)),
             gfx::Rect(0, 0, 100, 200));
 }
 
@@ -399,10 +385,10 @@
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
 
-  EXPECT_EQ(ScreenWin::DIPToScreenRect(hwnd, gfx::Rect(0, 0, 50, 100)),
+  EXPECT_EQ(GetScreenWin()->DIPToScreenRect(hwnd, gfx::Rect(0, 0, 50, 100)),
             gfx::Rect(0, 0, 100, 200));
 
-  EXPECT_EQ(ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 50, 100)),
+  EXPECT_EQ(GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 50, 100)),
             gfx::Rect(0, 0, 100, 200));
 }
 
@@ -413,7 +399,7 @@
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
 
-  EXPECT_EQ(ScreenWin::ClientToDIPRect(hwnd, gfx::Rect(0, 0, 100, 200)),
+  EXPECT_EQ(GetScreenWin()->ClientToDIPRect(hwnd, gfx::Rect(0, 0, 100, 200)),
             gfx::Rect(0, 0, 100, 200));
 }
 
@@ -424,7 +410,7 @@
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
 
-  EXPECT_EQ(ScreenWin::ClientToDIPRect(hwnd, gfx::Rect(0, 0, 100, 200)),
+  EXPECT_EQ(GetScreenWin()->ClientToDIPRect(hwnd, gfx::Rect(0, 0, 100, 200)),
             gfx::Rect(0, 0, 50, 100));
 }
 
@@ -435,7 +421,7 @@
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
 
-  EXPECT_EQ(ScreenWin::DIPToClientRect(hwnd, gfx::Rect(0, 0, 100, 200)),
+  EXPECT_EQ(GetScreenWin()->DIPToClientRect(hwnd, gfx::Rect(0, 0, 100, 200)),
             gfx::Rect(0, 0, 100, 200));
 }
 
@@ -446,7 +432,7 @@
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
 
-  EXPECT_EQ(ScreenWin::DIPToClientRect(hwnd, gfx::Rect(0, 0, 50, 100)),
+  EXPECT_EQ(GetScreenWin()->DIPToClientRect(hwnd, gfx::Rect(0, 0, 50, 100)),
             gfx::Rect(0, 0, 100, 200));
 }
 
@@ -457,7 +443,7 @@
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
 
-  EXPECT_EQ(ScreenWin::ScreenToDIPSize(hwnd, gfx::Size(100, 200)),
+  EXPECT_EQ(GetScreenWin()->ScreenToDIPSize(hwnd, gfx::Size(100, 200)),
             gfx::Size(100, 200));
 }
 
@@ -468,7 +454,7 @@
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
 
-  EXPECT_EQ(ScreenWin::ScreenToDIPSize(hwnd, gfx::Size(100, 200)),
+  EXPECT_EQ(GetScreenWin()->ScreenToDIPSize(hwnd, gfx::Size(100, 200)),
             gfx::Size(50, 100));
 }
 
@@ -479,7 +465,7 @@
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
 
-  EXPECT_EQ(ScreenWin::DIPToScreenSize(hwnd, gfx::Size(100, 200)),
+  EXPECT_EQ(GetScreenWin()->DIPToScreenSize(hwnd, gfx::Size(100, 200)),
             gfx::Size(100, 200));
 }
 
@@ -490,7 +476,7 @@
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
 
-  EXPECT_EQ(ScreenWin::DIPToScreenSize(hwnd, gfx::Size(50, 100)),
+  EXPECT_EQ(GetScreenWin()->DIPToScreenSize(hwnd, gfx::Size(50, 100)),
             gfx::Size(100, 200));
 }
 
@@ -498,7 +484,7 @@
   auto screen = CreateHeadlessScreen("{devicePixelRatio=1.0}");
   ASSERT_EQ(screen->GetNumDisplays(), 1);
 
-  EXPECT_EQ(ScreenWin::GetPixelsPerInch(gfx::PointF(400, 300)),
+  EXPECT_EQ(GetScreenWin()->GetPixelsPerInch(gfx::PointF(400, 300)),
             gfx::Vector2dF(96, 96));
 }
 
@@ -506,7 +492,7 @@
   auto screen = CreateHeadlessScreen("{devicePixelRatio=2.0}");
   ASSERT_EQ(screen->GetNumDisplays(), 1);
 
-  EXPECT_EQ(ScreenWin::GetPixelsPerInch(gfx::PointF(400, 300)),
+  EXPECT_EQ(GetScreenWin()->GetPixelsPerInch(gfx::PointF(400, 300)),
             gfx::Vector2dF(192, 192));
 }
 
@@ -515,15 +501,17 @@
   ASSERT_EQ(screen->GetNumDisplays(), 2);
 
   const int64_t id1 = screen->GetAllDisplays()[0].id();
-  EXPECT_EQ(ScreenWin::GetScreenWinDisplayWithDisplayId(id1).display().id(),
-            id1);
+  EXPECT_EQ(
+      GetScreenWin()->GetScreenWinDisplayWithDisplayId(id1).display().id(),
+      id1);
 
   const int64_t id2 = screen->GetAllDisplays()[1].id();
-  EXPECT_EQ(ScreenWin::GetScreenWinDisplayWithDisplayId(id2).display().id(),
-            id2);
+  EXPECT_EQ(
+      GetScreenWin()->GetScreenWinDisplayWithDisplayId(id2).display().id(),
+      id2);
 
   // Unknown display id should result in primary display.
-  EXPECT_EQ(ScreenWin::GetScreenWinDisplayWithDisplayId(-1).display().id(),
+  EXPECT_EQ(GetScreenWin()->GetScreenWinDisplayWithDisplayId(-1).display().id(),
             id1);
 }
 
@@ -534,12 +522,12 @@
   const int64_t id1 = screen->GetAllDisplays()[0].id();
   auto monitor_info1 = screen->GetMONITORINFOFromDisplayIdForTest(id1);
   ASSERT_TRUE(monitor_info1.has_value());
-  EXPECT_EQ(ScreenWin::DisplayIdFromMonitorInfo(*monitor_info1), id1);
+  EXPECT_EQ(GetScreenWin()->DisplayIdFromMonitorInfo(*monitor_info1), id1);
 
   const int64_t id2 = screen->GetAllDisplays()[1].id();
   auto monitor_info2 = screen->GetMONITORINFOFromDisplayIdForTest(id2);
   ASSERT_TRUE(monitor_info2.has_value());
-  EXPECT_EQ(ScreenWin::DisplayIdFromMonitorInfo(*monitor_info2), id2);
+  EXPECT_EQ(GetScreenWin()->DisplayIdFromMonitorInfo(*monitor_info2), id2);
 }
 
 TEST_F(ScreenWinHeadlessTest, GetScaleFactorForHWND) {
@@ -548,7 +536,7 @@
 
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
-  EXPECT_EQ(ScreenWin::GetScaleFactorForHWND(hwnd), 1.0);
+  EXPECT_EQ(GetScreenWin()->GetScaleFactorForHWND(hwnd), 1.0);
 }
 
 TEST_F(ScreenWinHeadlessTest, GetScaleFactorForHWND2x) {
@@ -557,7 +545,7 @@
 
   HWND hwnd = screen->GetHWNDFromNativeWindow(
       screen->AddWindow(gfx::Rect(0, 0, 400, 300)));
-  EXPECT_EQ(ScreenWin::GetScaleFactorForHWND(hwnd), 2.0);
+  EXPECT_EQ(GetScreenWin()->GetScaleFactorForHWND(hwnd), 2.0);
 }
 
 // display::Screen interface methods tests ----------------------------
diff --git a/ui/display/win/screen_win_unittest.cc b/ui/display/win/screen_win_unittest.cc
index 9fc607fb..3972545d 100644
--- a/ui/display/win/screen_win_unittest.cc
+++ b/ui/display/win/screen_win_unittest.cc
@@ -269,18 +269,18 @@
   gfx::PointF origin(0, 0);
   gfx::PointF middle(365, 694);
   gfx::PointF lower_right(1919, 1199);
-  EXPECT_EQ(origin, ScreenWin::ScreenToDIPPoint(origin));
-  EXPECT_EQ(middle, ScreenWin::ScreenToDIPPoint(middle));
-  EXPECT_EQ(lower_right, ScreenWin::ScreenToDIPPoint(lower_right));
+  EXPECT_EQ(origin, GetScreenWin()->ScreenToDIPPoint(origin));
+  EXPECT_EQ(middle, GetScreenWin()->ScreenToDIPPoint(middle));
+  EXPECT_EQ(lower_right, GetScreenWin()->ScreenToDIPPoint(lower_right));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1x, DIPToScreenPoints) {
   gfx::Point origin(0, 0);
   gfx::Point middle(365, 694);
   gfx::Point lower_right(1919, 1199);
-  EXPECT_EQ(origin, ScreenWin::DIPToScreenPoint(origin));
-  EXPECT_EQ(middle, ScreenWin::DIPToScreenPoint(middle));
-  EXPECT_EQ(lower_right, ScreenWin::DIPToScreenPoint(lower_right));
+  EXPECT_EQ(origin, GetScreenWin()->DIPToScreenPoint(origin));
+  EXPECT_EQ(middle, GetScreenWin()->DIPToScreenPoint(middle));
+  EXPECT_EQ(lower_right, GetScreenWin()->DIPToScreenPoint(lower_right));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1x, ClientToDIPPoints) {
@@ -288,9 +288,9 @@
   gfx::Point origin(0, 0);
   gfx::Point middle(365, 694);
   gfx::Point lower_right(1919, 1199);
-  EXPECT_EQ(origin, ScreenWin::ClientToDIPPoint(hwnd, origin));
-  EXPECT_EQ(middle, ScreenWin::ClientToDIPPoint(hwnd, middle));
-  EXPECT_EQ(lower_right, ScreenWin::ClientToDIPPoint(hwnd, lower_right));
+  EXPECT_EQ(origin, GetScreenWin()->ClientToDIPPoint(hwnd, origin));
+  EXPECT_EQ(middle, GetScreenWin()->ClientToDIPPoint(hwnd, middle));
+  EXPECT_EQ(lower_right, GetScreenWin()->ClientToDIPPoint(hwnd, lower_right));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1x, DIPToClientPoints) {
@@ -298,69 +298,69 @@
   gfx::Point origin(0, 0);
   gfx::Point middle(365, 694);
   gfx::Point lower_right(1919, 1199);
-  EXPECT_EQ(origin, ScreenWin::DIPToClientPoint(hwnd, origin));
-  EXPECT_EQ(middle, ScreenWin::DIPToClientPoint(hwnd, middle));
-  EXPECT_EQ(lower_right, ScreenWin::DIPToClientPoint(hwnd, lower_right));
+  EXPECT_EQ(origin, GetScreenWin()->DIPToClientPoint(hwnd, origin));
+  EXPECT_EQ(middle, GetScreenWin()->DIPToClientPoint(hwnd, middle));
+  EXPECT_EQ(lower_right, GetScreenWin()->DIPToClientPoint(hwnd, lower_right));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1x, ScreenToDIPRects) {
   HWND hwnd = GetFakeHwnd();
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
-  EXPECT_EQ(origin, ScreenWin::ScreenToDIPRect(hwnd, origin));
-  EXPECT_EQ(middle, ScreenWin::ScreenToDIPRect(hwnd, middle));
+  EXPECT_EQ(origin, GetScreenWin()->ScreenToDIPRect(hwnd, origin));
+  EXPECT_EQ(middle, GetScreenWin()->ScreenToDIPRect(hwnd, middle));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1x, DIPToScreenRects) {
   HWND hwnd = GetFakeHwnd();
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
-  EXPECT_EQ(origin, ScreenWin::DIPToScreenRect(hwnd, origin));
-  EXPECT_EQ(middle, ScreenWin::DIPToScreenRect(hwnd, middle));
+  EXPECT_EQ(origin, GetScreenWin()->DIPToScreenRect(hwnd, origin));
+  EXPECT_EQ(middle, GetScreenWin()->DIPToScreenRect(hwnd, middle));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1x, DIPToScreenRectNullHWND) {
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
-  EXPECT_EQ(origin, ScreenWin::DIPToScreenRect(nullptr, origin));
-  EXPECT_EQ(middle, ScreenWin::DIPToScreenRect(nullptr, middle));
+  EXPECT_EQ(origin, GetScreenWin()->DIPToScreenRect(nullptr, origin));
+  EXPECT_EQ(middle, GetScreenWin()->DIPToScreenRect(nullptr, middle));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1x, ClientToDIPRects) {
   HWND hwnd = GetFakeHwnd();
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
-  EXPECT_EQ(origin, ScreenWin::ClientToDIPRect(hwnd, origin));
-  EXPECT_EQ(middle, ScreenWin::ClientToDIPRect(hwnd, middle));
+  EXPECT_EQ(origin, GetScreenWin()->ClientToDIPRect(hwnd, origin));
+  EXPECT_EQ(middle, GetScreenWin()->ClientToDIPRect(hwnd, middle));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1x, DIPToClientRects) {
   HWND hwnd = GetFakeHwnd();
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
-  EXPECT_EQ(origin, ScreenWin::DIPToClientRect(hwnd, origin));
-  EXPECT_EQ(middle, ScreenWin::DIPToClientRect(hwnd, middle));
+  EXPECT_EQ(origin, GetScreenWin()->DIPToClientRect(hwnd, origin));
+  EXPECT_EQ(middle, GetScreenWin()->DIPToClientRect(hwnd, middle));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1x, ScreenToDIPSize) {
   HWND hwnd = GetFakeHwnd();
   gfx::Size size(42, 131);
-  EXPECT_EQ(size, ScreenWin::ScreenToDIPSize(hwnd, size));
+  EXPECT_EQ(size, GetScreenWin()->ScreenToDIPSize(hwnd, size));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1x, DIPToScreenSize) {
   HWND hwnd = GetFakeHwnd();
   gfx::Size size(42, 131);
-  EXPECT_EQ(size, ScreenWin::DIPToScreenSize(hwnd, size));
+  EXPECT_EQ(size, GetScreenWin()->DIPToScreenSize(hwnd, size));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1x, GetSystemMetricsInDIP) {
-  EXPECT_EQ(31, ScreenWin::GetSystemMetricsInDIP(31));
-  EXPECT_EQ(42, ScreenWin::GetSystemMetricsInDIP(42));
+  EXPECT_EQ(31, GetScreenWin()->GetSystemMetricsInDIP(31));
+  EXPECT_EQ(42, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1x, GetScaleFactorForHWND) {
-  EXPECT_EQ(1.0, ScreenWin::GetScaleFactorForHWND(GetFakeHwnd()));
+  EXPECT_EQ(1.0, GetScreenWin()->GetScaleFactorForHWND(GetFakeHwnd()));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1x, GetDisplays) {
@@ -460,97 +460,99 @@
 
 TEST_F(ScreenWinTestSingleDisplay1_25x, ScreenToDIPPoints) {
   expect_point_f_eq(gfx::PointF(0, 0),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(0, 0)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(292, 555.2F),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(365, 694)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(365, 694)));
   expect_point_f_eq(gfx::PointF(1535.2F, 959.2F),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(1919, 1199)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1919, 1199)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_25x, DIPToScreenPoints) {
-  EXPECT_EQ(gfx::Point(0, 0), ScreenWin::DIPToScreenPoint(gfx::Point(0, 0)));
+  EXPECT_EQ(gfx::Point(0, 0),
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(303, 577),
-            ScreenWin::DIPToScreenPoint(gfx::Point(243, 462)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(243, 462)));
   EXPECT_EQ(gfx::Point(1598, 998),
-            ScreenWin::DIPToScreenPoint(gfx::Point(1279, 799)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(1279, 799)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_25x, ClientToDIPPoints) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::ClientToDIPPoint(hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->ClientToDIPPoint(hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(292, 555),
-            ScreenWin::ClientToDIPPoint(hwnd, gfx::Point(365, 694)));
+            GetScreenWin()->ClientToDIPPoint(hwnd, gfx::Point(365, 694)));
   EXPECT_EQ(gfx::Point(1535, 959),
-            ScreenWin::ClientToDIPPoint(hwnd, gfx::Point(1919, 1199)));
+            GetScreenWin()->ClientToDIPPoint(hwnd, gfx::Point(1919, 1199)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_25x, DIPToClientPoints) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::DIPToClientPoint(hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->DIPToClientPoint(hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(303, 577),
-            ScreenWin::DIPToClientPoint(hwnd, gfx::Point(243, 462)));
+            GetScreenWin()->DIPToClientPoint(hwnd, gfx::Point(243, 462)));
   EXPECT_EQ(gfx::Point(1598, 998),
-            ScreenWin::DIPToClientPoint(hwnd, gfx::Point(1279, 799)));
+            GetScreenWin()->DIPToClientPoint(hwnd, gfx::Point(1279, 799)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_25x, ScreenToDIPRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 40, 80),
-            ScreenWin::ScreenToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
+            GetScreenWin()->ScreenToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
   EXPECT_EQ(gfx::Rect(202, 396, 34, 43),
-            ScreenWin::ScreenToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
+            GetScreenWin()->ScreenToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_25x, DIPToScreenRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 43, 84),
-            ScreenWin::DIPToScreenRect(hwnd, gfx::Rect(0, 0, 34, 67)));
+            GetScreenWin()->DIPToScreenRect(hwnd, gfx::Rect(0, 0, 34, 67)));
   EXPECT_EQ(gfx::Rect(210, 412, 35, 46),
-            ScreenWin::DIPToScreenRect(hwnd, gfx::Rect(168, 330, 28, 36)));
+            GetScreenWin()->DIPToScreenRect(hwnd, gfx::Rect(168, 330, 28, 36)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_25x, DIPToScreenRectNullHWND) {
   EXPECT_EQ(gfx::Rect(0, 0, 43, 84),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 34, 67)));
-  EXPECT_EQ(gfx::Rect(210, 412, 35, 46),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(168, 330, 28, 36)));
+            GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 34, 67)));
+  EXPECT_EQ(
+      gfx::Rect(210, 412, 35, 46),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(168, 330, 28, 36)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_25x, ClientToDIPRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 40, 80),
-            ScreenWin::ClientToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
+            GetScreenWin()->ClientToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
   EXPECT_EQ(gfx::Rect(202, 396, 34, 43),
-            ScreenWin::ClientToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
+            GetScreenWin()->ClientToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_25x, DIPToClientRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 43, 84),
-            ScreenWin::DIPToClientRect(hwnd, gfx::Rect(0, 0, 34, 67)));
+            GetScreenWin()->DIPToClientRect(hwnd, gfx::Rect(0, 0, 34, 67)));
   EXPECT_EQ(gfx::Rect(210, 412, 35, 46),
-            ScreenWin::DIPToClientRect(hwnd, gfx::Rect(168, 330, 28, 36)));
+            GetScreenWin()->DIPToClientRect(hwnd, gfx::Rect(168, 330, 28, 36)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_25x, ScreenToDIPSize) {
   EXPECT_EQ(gfx::Size(34, 105),
-            ScreenWin::ScreenToDIPSize(GetFakeHwnd(), gfx::Size(42, 131)));
+            GetScreenWin()->ScreenToDIPSize(GetFakeHwnd(), gfx::Size(42, 131)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_25x, DIPToScreenSize) {
   EXPECT_EQ(gfx::Size(35, 110),
-            ScreenWin::DIPToScreenSize(GetFakeHwnd(), gfx::Size(28, 88)));
+            GetScreenWin()->DIPToScreenSize(GetFakeHwnd(), gfx::Size(28, 88)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_25x, GetSystemMetricsInDIP) {
-  EXPECT_EQ(25, ScreenWin::GetSystemMetricsInDIP(31));
-  EXPECT_EQ(34, ScreenWin::GetSystemMetricsInDIP(42));
+  EXPECT_EQ(25, GetScreenWin()->GetSystemMetricsInDIP(31));
+  EXPECT_EQ(34, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_25x, GetScaleFactorForHWND) {
-  EXPECT_EQ(1.25, ScreenWin::GetScaleFactorForHWND(GetFakeHwnd()));
+  EXPECT_EQ(1.25, GetScreenWin()->GetScaleFactorForHWND(GetFakeHwnd()));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_25x, GetDisplays) {
@@ -619,97 +621,99 @@
 
 TEST_F(ScreenWinTestSingleDisplay1_5x, ScreenToDIPPoints) {
   expect_point_f_eq(gfx::PointF(0, 0),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(0, 0)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(243.3333F, 462.6666F),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(365, 694)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(365, 694)));
   expect_point_f_eq(gfx::PointF(1279.3333F, 799.3333F),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(1919, 1199)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1919, 1199)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_5x, DIPToScreenPoints) {
-  EXPECT_EQ(gfx::Point(0, 0), ScreenWin::DIPToScreenPoint(gfx::Point(0, 0)));
+  EXPECT_EQ(gfx::Point(0, 0),
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 693),
-            ScreenWin::DIPToScreenPoint(gfx::Point(243, 462)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(243, 462)));
   EXPECT_EQ(gfx::Point(1918, 1198),
-            ScreenWin::DIPToScreenPoint(gfx::Point(1279, 799)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(1279, 799)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_5x, ClientToDIPPoints) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::ClientToDIPPoint(hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->ClientToDIPPoint(hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(243, 462),
-            ScreenWin::ClientToDIPPoint(hwnd, gfx::Point(365, 694)));
+            GetScreenWin()->ClientToDIPPoint(hwnd, gfx::Point(365, 694)));
   EXPECT_EQ(gfx::Point(1279, 799),
-            ScreenWin::ClientToDIPPoint(hwnd, gfx::Point(1919, 1199)));
+            GetScreenWin()->ClientToDIPPoint(hwnd, gfx::Point(1919, 1199)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_5x, DIPToClientPoints) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::DIPToClientPoint(hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->DIPToClientPoint(hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 693),
-            ScreenWin::DIPToClientPoint(hwnd, gfx::Point(243, 462)));
+            GetScreenWin()->DIPToClientPoint(hwnd, gfx::Point(243, 462)));
   EXPECT_EQ(gfx::Point(1918, 1198),
-            ScreenWin::DIPToClientPoint(hwnd, gfx::Point(1279, 799)));
+            GetScreenWin()->DIPToClientPoint(hwnd, gfx::Point(1279, 799)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_5x, ScreenToDIPRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 34, 67),
-            ScreenWin::ScreenToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
+            GetScreenWin()->ScreenToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
   EXPECT_EQ(gfx::Rect(168, 330, 28, 36),
-            ScreenWin::ScreenToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
+            GetScreenWin()->ScreenToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_5x, DIPToScreenRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 51, 101),
-            ScreenWin::DIPToScreenRect(hwnd, gfx::Rect(0, 0, 34, 67)));
+            GetScreenWin()->DIPToScreenRect(hwnd, gfx::Rect(0, 0, 34, 67)));
   EXPECT_EQ(gfx::Rect(252, 495, 42, 54),
-            ScreenWin::DIPToScreenRect(hwnd, gfx::Rect(168, 330, 28, 36)));
+            GetScreenWin()->DIPToScreenRect(hwnd, gfx::Rect(168, 330, 28, 36)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_5x, DIPToScreenRectNullHWND) {
   EXPECT_EQ(gfx::Rect(0, 0, 51, 101),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 34, 67)));
-  EXPECT_EQ(gfx::Rect(252, 495, 42, 54),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(168, 330, 28, 36)));
+            GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 34, 67)));
+  EXPECT_EQ(
+      gfx::Rect(252, 495, 42, 54),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(168, 330, 28, 36)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_5x, ClientToDIPRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 34, 67),
-            ScreenWin::ClientToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
+            GetScreenWin()->ClientToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
   EXPECT_EQ(gfx::Rect(168, 330, 28, 36),
-            ScreenWin::ClientToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
+            GetScreenWin()->ClientToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_5x, DIPToClientRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 51, 101),
-            ScreenWin::DIPToClientRect(hwnd, gfx::Rect(0, 0, 34, 67)));
+            GetScreenWin()->DIPToClientRect(hwnd, gfx::Rect(0, 0, 34, 67)));
   EXPECT_EQ(gfx::Rect(252, 495, 42, 54),
-            ScreenWin::DIPToClientRect(hwnd, gfx::Rect(168, 330, 28, 36)));
+            GetScreenWin()->DIPToClientRect(hwnd, gfx::Rect(168, 330, 28, 36)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_5x, ScreenToDIPSize) {
   EXPECT_EQ(gfx::Size(28, 88),
-            ScreenWin::ScreenToDIPSize(GetFakeHwnd(), gfx::Size(42, 131)));
+            GetScreenWin()->ScreenToDIPSize(GetFakeHwnd(), gfx::Size(42, 131)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_5x, DIPToScreenSize) {
   EXPECT_EQ(gfx::Size(42, 132),
-            ScreenWin::DIPToScreenSize(GetFakeHwnd(), gfx::Size(28, 88)));
+            GetScreenWin()->DIPToScreenSize(GetFakeHwnd(), gfx::Size(28, 88)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_5x, GetSystemMetricsInDIP) {
-  EXPECT_EQ(21, ScreenWin::GetSystemMetricsInDIP(31));
-  EXPECT_EQ(28, ScreenWin::GetSystemMetricsInDIP(42));
+  EXPECT_EQ(21, GetScreenWin()->GetSystemMetricsInDIP(31));
+  EXPECT_EQ(28, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_5x, GetScaleFactorForHWND) {
-  EXPECT_EQ(1.5, ScreenWin::GetScaleFactorForHWND(GetFakeHwnd()));
+  EXPECT_EQ(1.5, GetScreenWin()->GetScaleFactorForHWND(GetFakeHwnd()));
 }
 
 TEST_F(ScreenWinTestSingleDisplay1_5x, GetDisplays) {
@@ -777,97 +781,99 @@
 
 TEST_F(ScreenWinTestSingleDisplay2x, ScreenToDIPPoints) {
   expect_point_f_eq(gfx::PointF(0, 0),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(0, 0)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(182.5, 347),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(365, 694)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(365, 694)));
   expect_point_f_eq(gfx::PointF(959.5, 599.5),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(1919, 1199)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1919, 1199)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay2x, DIPToScreenPoints) {
-  EXPECT_EQ(gfx::Point(0, 0), ScreenWin::DIPToScreenPoint(gfx::Point(0, 0)));
+  EXPECT_EQ(gfx::Point(0, 0),
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 694),
-            ScreenWin::DIPToScreenPoint(gfx::Point(182, 347)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(182, 347)));
   EXPECT_EQ(gfx::Point(1918, 1198),
-            ScreenWin::DIPToScreenPoint(gfx::Point(959, 599)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(959, 599)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay2x, ClientToDIPPoints) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::ClientToDIPPoint(hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->ClientToDIPPoint(hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(182, 347),
-            ScreenWin::ClientToDIPPoint(hwnd, gfx::Point(365, 694)));
+            GetScreenWin()->ClientToDIPPoint(hwnd, gfx::Point(365, 694)));
   EXPECT_EQ(gfx::Point(959, 599),
-            ScreenWin::ClientToDIPPoint(hwnd, gfx::Point(1919, 1199)));
+            GetScreenWin()->ClientToDIPPoint(hwnd, gfx::Point(1919, 1199)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay2x, DIPToClientPoints) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::DIPToClientPoint(hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->DIPToClientPoint(hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 694),
-            ScreenWin::DIPToClientPoint(hwnd, gfx::Point(182, 347)));
+            GetScreenWin()->DIPToClientPoint(hwnd, gfx::Point(182, 347)));
   EXPECT_EQ(gfx::Point(1918, 1198),
-            ScreenWin::DIPToClientPoint(hwnd, gfx::Point(959, 599)));
+            GetScreenWin()->DIPToClientPoint(hwnd, gfx::Point(959, 599)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay2x, ScreenToDIPRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
-            ScreenWin::ScreenToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
+            GetScreenWin()->ScreenToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
   EXPECT_EQ(gfx::Rect(126, 248, 21, 26),
-            ScreenWin::ScreenToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
+            GetScreenWin()->ScreenToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay2x, DIPToScreenRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToScreenRect(hwnd, gfx::Rect(0, 0, 25, 50)));
+            GetScreenWin()->DIPToScreenRect(hwnd, gfx::Rect(0, 0, 25, 50)));
   EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToScreenRect(hwnd, gfx::Rect(126, 248, 21, 26)));
+            GetScreenWin()->DIPToScreenRect(hwnd, gfx::Rect(126, 248, 21, 26)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay2x, DIPToScreenRectNullHWND) {
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
-  EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(126, 248, 21, 26)));
+            GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
+  EXPECT_EQ(
+      gfx::Rect(252, 496, 42, 52),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(126, 248, 21, 26)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay2x, ClientToDIPRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
-            ScreenWin::ClientToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
+            GetScreenWin()->ClientToDIPRect(hwnd, gfx::Rect(0, 0, 50, 100)));
   EXPECT_EQ(gfx::Rect(126, 248, 21, 26),
-            ScreenWin::ClientToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
+            GetScreenWin()->ClientToDIPRect(hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay2x, DIPToClientRects) {
   HWND hwnd = GetFakeHwnd();
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToClientRect(hwnd, gfx::Rect(0, 0, 25, 50)));
+            GetScreenWin()->DIPToClientRect(hwnd, gfx::Rect(0, 0, 25, 50)));
   EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToClientRect(hwnd, gfx::Rect(126, 248, 21, 26)));
+            GetScreenWin()->DIPToClientRect(hwnd, gfx::Rect(126, 248, 21, 26)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay2x, ScreenToDIPSize) {
   EXPECT_EQ(gfx::Size(21, 66),
-            ScreenWin::ScreenToDIPSize(GetFakeHwnd(), gfx::Size(42, 131)));
+            GetScreenWin()->ScreenToDIPSize(GetFakeHwnd(), gfx::Size(42, 131)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay2x, DIPToScreenSize) {
   EXPECT_EQ(gfx::Size(42, 132),
-            ScreenWin::DIPToScreenSize(GetFakeHwnd(), gfx::Size(21, 66)));
+            GetScreenWin()->DIPToScreenSize(GetFakeHwnd(), gfx::Size(21, 66)));
 }
 
 TEST_F(ScreenWinTestSingleDisplay2x, GetSystemMetricsInDIP) {
-  EXPECT_EQ(16, ScreenWin::GetSystemMetricsInDIP(31));
-  EXPECT_EQ(21, ScreenWin::GetSystemMetricsInDIP(42));
+  EXPECT_EQ(16, GetScreenWin()->GetSystemMetricsInDIP(31));
+  EXPECT_EQ(21, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
 TEST_F(ScreenWinTestSingleDisplay2x, GetScaleFactorForHWND) {
-  EXPECT_EQ(2.0, ScreenWin::GetScaleFactorForHWND(GetFakeHwnd()));
+  EXPECT_EQ(2.0, GetScreenWin()->GetScaleFactorForHWND(GetFakeHwnd()));
 }
 
 TEST_F(ScreenWinTestSingleDisplay2x, GetDisplays) {
@@ -943,32 +949,36 @@
   gfx::PointF left_origin(0, 0);
   gfx::PointF left_middle(365, 694);
   gfx::PointF left_lower_right(1919, 1199);
-  EXPECT_EQ(left_origin, ScreenWin::ScreenToDIPPoint(left_origin));
-  EXPECT_EQ(left_middle, ScreenWin::ScreenToDIPPoint(left_middle));
-  EXPECT_EQ(left_lower_right, ScreenWin::ScreenToDIPPoint(left_lower_right));
+  EXPECT_EQ(left_origin, GetScreenWin()->ScreenToDIPPoint(left_origin));
+  EXPECT_EQ(left_middle, GetScreenWin()->ScreenToDIPPoint(left_middle));
+  EXPECT_EQ(left_lower_right,
+            GetScreenWin()->ScreenToDIPPoint(left_lower_right));
 
   gfx::PointF right_origin(1920, 0);
   gfx::PointF right_middle(2384, 351);
   gfx::PointF right_lower_right(2719, 599);
-  EXPECT_EQ(right_origin, ScreenWin::ScreenToDIPPoint(right_origin));
-  EXPECT_EQ(right_middle, ScreenWin::ScreenToDIPPoint(right_middle));
-  EXPECT_EQ(right_lower_right, ScreenWin::ScreenToDIPPoint(right_lower_right));
+  EXPECT_EQ(right_origin, GetScreenWin()->ScreenToDIPPoint(right_origin));
+  EXPECT_EQ(right_middle, GetScreenWin()->ScreenToDIPPoint(right_middle));
+  EXPECT_EQ(right_lower_right,
+            GetScreenWin()->ScreenToDIPPoint(right_lower_right));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x, DIPToScreenPoints) {
   gfx::Point left_origin(0, 0);
   gfx::Point left_middle(365, 694);
   gfx::Point left_lower_right(1919, 1199);
-  EXPECT_EQ(left_origin, ScreenWin::DIPToScreenPoint(left_origin));
-  EXPECT_EQ(left_middle, ScreenWin::DIPToScreenPoint(left_middle));
-  EXPECT_EQ(left_lower_right, ScreenWin::DIPToScreenPoint(left_lower_right));
+  EXPECT_EQ(left_origin, GetScreenWin()->DIPToScreenPoint(left_origin));
+  EXPECT_EQ(left_middle, GetScreenWin()->DIPToScreenPoint(left_middle));
+  EXPECT_EQ(left_lower_right,
+            GetScreenWin()->DIPToScreenPoint(left_lower_right));
 
   gfx::Point right_origin(1920, 0);
   gfx::Point right_middle(2384, 351);
   gfx::Point right_lower_right(2719, 599);
-  EXPECT_EQ(right_origin, ScreenWin::DIPToScreenPoint(right_origin));
-  EXPECT_EQ(right_middle, ScreenWin::DIPToScreenPoint(right_middle));
-  EXPECT_EQ(right_lower_right, ScreenWin::DIPToScreenPoint(right_lower_right));
+  EXPECT_EQ(right_origin, GetScreenWin()->DIPToScreenPoint(right_origin));
+  EXPECT_EQ(right_middle, GetScreenWin()->DIPToScreenPoint(right_middle));
+  EXPECT_EQ(right_lower_right,
+            GetScreenWin()->DIPToScreenPoint(right_lower_right));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x, ClientToDIPPoints) {
@@ -976,14 +986,16 @@
   gfx::Point origin(0, 0);
   gfx::Point middle(365, 694);
   gfx::Point lower_right(1919, 1199);
-  EXPECT_EQ(origin, ScreenWin::ClientToDIPPoint(left_hwnd, origin));
-  EXPECT_EQ(middle, ScreenWin::ClientToDIPPoint(left_hwnd, middle));
-  EXPECT_EQ(lower_right, ScreenWin::ClientToDIPPoint(left_hwnd, lower_right));
+  EXPECT_EQ(origin, GetScreenWin()->ClientToDIPPoint(left_hwnd, origin));
+  EXPECT_EQ(middle, GetScreenWin()->ClientToDIPPoint(left_hwnd, middle));
+  EXPECT_EQ(lower_right,
+            GetScreenWin()->ClientToDIPPoint(left_hwnd, lower_right));
 
   HWND right_hwnd = GetRightFakeHwnd();
-  EXPECT_EQ(origin, ScreenWin::ClientToDIPPoint(right_hwnd, origin));
-  EXPECT_EQ(middle, ScreenWin::ClientToDIPPoint(right_hwnd, middle));
-  EXPECT_EQ(lower_right, ScreenWin::ClientToDIPPoint(right_hwnd, lower_right));
+  EXPECT_EQ(origin, GetScreenWin()->ClientToDIPPoint(right_hwnd, origin));
+  EXPECT_EQ(middle, GetScreenWin()->ClientToDIPPoint(right_hwnd, middle));
+  EXPECT_EQ(lower_right,
+            GetScreenWin()->ClientToDIPPoint(right_hwnd, lower_right));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x, DIPToClientPoints) {
@@ -991,118 +1003,130 @@
   gfx::Point origin(0, 0);
   gfx::Point middle(365, 694);
   gfx::Point lower_right(1919, 1199);
-  EXPECT_EQ(origin, ScreenWin::DIPToClientPoint(left_hwnd, origin));
-  EXPECT_EQ(middle, ScreenWin::DIPToClientPoint(left_hwnd, middle));
-  EXPECT_EQ(lower_right, ScreenWin::DIPToClientPoint(left_hwnd, lower_right));
+  EXPECT_EQ(origin, GetScreenWin()->DIPToClientPoint(left_hwnd, origin));
+  EXPECT_EQ(middle, GetScreenWin()->DIPToClientPoint(left_hwnd, middle));
+  EXPECT_EQ(lower_right,
+            GetScreenWin()->DIPToClientPoint(left_hwnd, lower_right));
 
   HWND right_hwnd = GetRightFakeHwnd();
-  EXPECT_EQ(origin, ScreenWin::DIPToClientPoint(right_hwnd, origin));
-  EXPECT_EQ(middle, ScreenWin::DIPToClientPoint(right_hwnd, middle));
-  EXPECT_EQ(lower_right, ScreenWin::DIPToClientPoint(right_hwnd, lower_right));
+  EXPECT_EQ(origin, GetScreenWin()->DIPToClientPoint(right_hwnd, origin));
+  EXPECT_EQ(middle, GetScreenWin()->DIPToClientPoint(right_hwnd, middle));
+  EXPECT_EQ(lower_right,
+            GetScreenWin()->DIPToClientPoint(right_hwnd, lower_right));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x, ScreenToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   gfx::Rect left_origin(0, 0, 50, 100);
   gfx::Rect left_middle(253, 495, 41, 52);
-  EXPECT_EQ(left_origin, ScreenWin::ScreenToDIPRect(left_hwnd, left_origin));
-  EXPECT_EQ(left_middle, ScreenWin::ScreenToDIPRect(left_hwnd, left_middle));
+  EXPECT_EQ(left_origin,
+            GetScreenWin()->ScreenToDIPRect(left_hwnd, left_origin));
+  EXPECT_EQ(left_middle,
+            GetScreenWin()->ScreenToDIPRect(left_hwnd, left_middle));
 
   HWND right_hwnd = GetRightFakeHwnd();
   gfx::Rect right_origin(1920, 0, 200, 300);
   gfx::Rect right_middle(2000, 496, 100, 200);
-  EXPECT_EQ(right_origin, ScreenWin::ScreenToDIPRect(right_hwnd, right_origin));
-  EXPECT_EQ(right_middle, ScreenWin::ScreenToDIPRect(right_hwnd, right_middle));
+  EXPECT_EQ(right_origin,
+            GetScreenWin()->ScreenToDIPRect(right_hwnd, right_origin));
+  EXPECT_EQ(right_middle,
+            GetScreenWin()->ScreenToDIPRect(right_hwnd, right_middle));
 
   gfx::Rect right_origin_left(1900, 200, 100, 100);
   EXPECT_EQ(right_origin_left,
-            ScreenWin::ScreenToDIPRect(right_hwnd, right_origin_left));
+            GetScreenWin()->ScreenToDIPRect(right_hwnd, right_origin_left));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x, DIPToScreenRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   gfx::Rect left_origin(0, 0, 50, 100);
   gfx::Rect left_middle(253, 495, 41, 52);
-  EXPECT_EQ(left_origin, ScreenWin::DIPToScreenRect(left_hwnd, left_origin));
-  EXPECT_EQ(left_middle, ScreenWin::DIPToScreenRect(left_hwnd, left_middle));
+  EXPECT_EQ(left_origin,
+            GetScreenWin()->DIPToScreenRect(left_hwnd, left_origin));
+  EXPECT_EQ(left_middle,
+            GetScreenWin()->DIPToScreenRect(left_hwnd, left_middle));
 
   HWND right_hwnd = GetRightFakeHwnd();
   gfx::Rect right_origin(1920, 0, 200, 300);
   gfx::Rect right_middle(2000, 496, 100, 200);
-  EXPECT_EQ(right_origin, ScreenWin::DIPToScreenRect(right_hwnd, right_origin));
-  EXPECT_EQ(right_middle, ScreenWin::DIPToScreenRect(right_hwnd, right_middle));
+  EXPECT_EQ(right_origin,
+            GetScreenWin()->DIPToScreenRect(right_hwnd, right_origin));
+  EXPECT_EQ(right_middle,
+            GetScreenWin()->DIPToScreenRect(right_hwnd, right_middle));
 
   gfx::Rect right_origin_left(1900, 200, 100, 100);
   EXPECT_EQ(right_origin_left,
-            ScreenWin::DIPToScreenRect(right_hwnd, right_origin_left));
+            GetScreenWin()->DIPToScreenRect(right_hwnd, right_origin_left));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x, DIPToScreenRectNullHWND) {
   gfx::Rect left_origin(0, 0, 50, 100);
   gfx::Rect left_middle(253, 495, 41, 52);
-  EXPECT_EQ(left_origin, ScreenWin::DIPToScreenRect(nullptr, left_origin));
-  EXPECT_EQ(left_middle, ScreenWin::DIPToScreenRect(nullptr, left_middle));
+  EXPECT_EQ(left_origin, GetScreenWin()->DIPToScreenRect(nullptr, left_origin));
+  EXPECT_EQ(left_middle, GetScreenWin()->DIPToScreenRect(nullptr, left_middle));
 
   gfx::Rect right_origin(1920, 0, 200, 300);
   gfx::Rect right_middle(2000, 496, 100, 200);
-  EXPECT_EQ(right_origin, ScreenWin::DIPToScreenRect(nullptr, right_origin));
-  EXPECT_EQ(right_middle, ScreenWin::DIPToScreenRect(nullptr, right_middle));
+  EXPECT_EQ(right_origin,
+            GetScreenWin()->DIPToScreenRect(nullptr, right_origin));
+  EXPECT_EQ(right_middle,
+            GetScreenWin()->DIPToScreenRect(nullptr, right_middle));
 
   gfx::Rect right_origin_left(1900, 200, 100, 100);
   EXPECT_EQ(right_origin_left,
-            ScreenWin::DIPToScreenRect(nullptr, right_origin_left));
+            GetScreenWin()->DIPToScreenRect(nullptr, right_origin_left));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x, ClientToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
-  EXPECT_EQ(origin, ScreenWin::ClientToDIPRect(left_hwnd, origin));
-  EXPECT_EQ(middle, ScreenWin::ClientToDIPRect(left_hwnd, middle));
+  EXPECT_EQ(origin, GetScreenWin()->ClientToDIPRect(left_hwnd, origin));
+  EXPECT_EQ(middle, GetScreenWin()->ClientToDIPRect(left_hwnd, middle));
 
   HWND right_hwnd = GetRightFakeHwnd();
-  EXPECT_EQ(origin, ScreenWin::ClientToDIPRect(right_hwnd, origin));
-  EXPECT_EQ(middle, ScreenWin::ClientToDIPRect(right_hwnd, middle));
+  EXPECT_EQ(origin, GetScreenWin()->ClientToDIPRect(right_hwnd, origin));
+  EXPECT_EQ(middle, GetScreenWin()->ClientToDIPRect(right_hwnd, middle));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x, DIPToClientRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
-  EXPECT_EQ(origin, ScreenWin::DIPToClientRect(left_hwnd, origin));
-  EXPECT_EQ(middle, ScreenWin::DIPToClientRect(left_hwnd, middle));
+  EXPECT_EQ(origin, GetScreenWin()->DIPToClientRect(left_hwnd, origin));
+  EXPECT_EQ(middle, GetScreenWin()->DIPToClientRect(left_hwnd, middle));
 
   HWND right_hwnd = GetRightFakeHwnd();
-  EXPECT_EQ(origin, ScreenWin::DIPToClientRect(right_hwnd, origin));
-  EXPECT_EQ(middle, ScreenWin::DIPToClientRect(right_hwnd, middle));
+  EXPECT_EQ(origin, GetScreenWin()->DIPToClientRect(right_hwnd, origin));
+  EXPECT_EQ(middle, GetScreenWin()->DIPToClientRect(right_hwnd, middle));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x, ScreenToDIPSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   gfx::Size size(42, 131);
-  EXPECT_EQ(size, ScreenWin::ScreenToDIPSize(left_hwnd, size));
+  EXPECT_EQ(size, GetScreenWin()->ScreenToDIPSize(left_hwnd, size));
 
   HWND right_hwnd = GetRightFakeHwnd();
-  EXPECT_EQ(size, ScreenWin::ScreenToDIPSize(right_hwnd, size));
+  EXPECT_EQ(size, GetScreenWin()->ScreenToDIPSize(right_hwnd, size));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x, DIPToScreenSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   gfx::Size size(42, 131);
-  EXPECT_EQ(size, ScreenWin::DIPToScreenSize(left_hwnd, size));
+  EXPECT_EQ(size, GetScreenWin()->DIPToScreenSize(left_hwnd, size));
 
   HWND right_hwnd = GetRightFakeHwnd();
-  EXPECT_EQ(size, ScreenWin::DIPToScreenSize(right_hwnd, size));
+  EXPECT_EQ(size, GetScreenWin()->DIPToScreenSize(right_hwnd, size));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x, GetSystemMetricsInDIP) {
-  EXPECT_EQ(31, ScreenWin::GetSystemMetricsInDIP(31));
-  EXPECT_EQ(42, ScreenWin::GetSystemMetricsInDIP(42));
+  EXPECT_EQ(31, GetScreenWin()->GetSystemMetricsInDIP(31));
+  EXPECT_EQ(42, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x, GetScaleFactorForHWND) {
-  EXPECT_EQ(1.0, ScreenWin::GetScaleFactorForHWND(GetLeftFakeHwnd()));
-  EXPECT_EQ(1.0, ScreenWin::GetScaleFactorForHWND(GetRightFakeHwnd()));
+  EXPECT_EQ(1.0, GetScreenWin()->GetScaleFactorForHWND(GetLeftFakeHwnd()));
+  EXPECT_EQ(1.0, GetScreenWin()->GetScaleFactorForHWND(GetRightFakeHwnd()));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x, GetDisplays) {
@@ -1216,177 +1240,186 @@
 
 TEST_F(ScreenWinTestTwoDisplays2x, ScreenToDIPPoints) {
   expect_point_f_eq(gfx::PointF(0, 0),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(0, 0)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(182.5, 347),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(365, 694)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(365, 694)));
   expect_point_f_eq(gfx::PointF(959.5, 599.5),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(1919, 1199)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1919, 1199)));
 
   expect_point_f_eq(gfx::PointF(960, 0),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(1920, 0)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1920, 0)));
   expect_point_f_eq(gfx::PointF(1192, 175.5),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(2384, 351)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(2384, 351)));
   expect_point_f_eq(gfx::PointF(1359.5, 299.5),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(2719, 599)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(2719, 599)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x, DIPToScreenPoints) {
-  EXPECT_EQ(gfx::Point(0, 0), ScreenWin::DIPToScreenPoint(gfx::Point(0, 0)));
+  EXPECT_EQ(gfx::Point(0, 0),
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 694),
-            ScreenWin::DIPToScreenPoint(gfx::Point(182, 347)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(182, 347)));
   EXPECT_EQ(gfx::Point(1918, 1198),
-            ScreenWin::DIPToScreenPoint(gfx::Point(959, 599)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(959, 599)));
 
   EXPECT_EQ(gfx::Point(1920, 0),
-            ScreenWin::DIPToScreenPoint(gfx::Point(960, 0)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(960, 0)));
   EXPECT_EQ(gfx::Point(2384, 350),
-            ScreenWin::DIPToScreenPoint(gfx::Point(1192, 175)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(1192, 175)));
   EXPECT_EQ(gfx::Point(2718, 598),
-            ScreenWin::DIPToScreenPoint(gfx::Point(1359, 299)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(1359, 299)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x, ClientToDIPPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::ClientToDIPPoint(left_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->ClientToDIPPoint(left_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(182, 347),
-            ScreenWin::ClientToDIPPoint(left_hwnd, gfx::Point(365, 694)));
-  EXPECT_EQ(gfx::Point(959, 599),
-            ScreenWin::ClientToDIPPoint(left_hwnd, gfx::Point(1919, 1199)));
+            GetScreenWin()->ClientToDIPPoint(left_hwnd, gfx::Point(365, 694)));
+  EXPECT_EQ(gfx::Point(959, 599), GetScreenWin()->ClientToDIPPoint(
+                                      left_hwnd, gfx::Point(1919, 1199)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::ClientToDIPPoint(right_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->ClientToDIPPoint(right_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(182, 347),
-            ScreenWin::ClientToDIPPoint(right_hwnd, gfx::Point(365, 694)));
-  EXPECT_EQ(gfx::Point(959, 599),
-            ScreenWin::ClientToDIPPoint(right_hwnd, gfx::Point(1919, 1199)));
+            GetScreenWin()->ClientToDIPPoint(right_hwnd, gfx::Point(365, 694)));
+  EXPECT_EQ(gfx::Point(959, 599), GetScreenWin()->ClientToDIPPoint(
+                                      right_hwnd, gfx::Point(1919, 1199)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x, DIPToClientPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::DIPToClientPoint(left_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 694),
-            ScreenWin::DIPToClientPoint(left_hwnd, gfx::Point(182, 347)));
+            GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(182, 347)));
   EXPECT_EQ(gfx::Point(1918, 1198),
-            ScreenWin::DIPToClientPoint(left_hwnd, gfx::Point(959, 599)));
+            GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(959, 599)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::DIPToClientPoint(right_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->DIPToClientPoint(right_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 694),
-            ScreenWin::DIPToClientPoint(right_hwnd, gfx::Point(182, 347)));
+            GetScreenWin()->DIPToClientPoint(right_hwnd, gfx::Point(182, 347)));
   EXPECT_EQ(gfx::Point(1918, 1198),
-            ScreenWin::DIPToClientPoint(right_hwnd, gfx::Point(959, 599)));
+            GetScreenWin()->DIPToClientPoint(right_hwnd, gfx::Point(959, 599)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x, ScreenToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
-            ScreenWin::ScreenToDIPRect(left_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(126, 248, 21, 26),
-            ScreenWin::ScreenToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
+  EXPECT_EQ(gfx::Rect(0, 0, 25, 50), GetScreenWin()->ScreenToDIPRect(
+                                         left_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(126, 248, 21, 26),
+      GetScreenWin()->ScreenToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Rect(960, 0, 100, 150),
-            ScreenWin::ScreenToDIPRect(right_hwnd,
-                                       gfx::Rect(1920, 0, 200, 300)));
+            GetScreenWin()->ScreenToDIPRect(right_hwnd,
+                                            gfx::Rect(1920, 0, 200, 300)));
   EXPECT_EQ(gfx::Rect(1000, 248, 50, 100),
-            ScreenWin::ScreenToDIPRect(right_hwnd,
-                                       gfx::Rect(2000, 496, 100, 200)));
+            GetScreenWin()->ScreenToDIPRect(right_hwnd,
+                                            gfx::Rect(2000, 496, 100, 200)));
 
   EXPECT_EQ(gfx::Rect(950, 100, 50, 50),
-            ScreenWin::ScreenToDIPRect(right_hwnd,
-                                       gfx::Rect(1900, 200, 100, 100)));
+            GetScreenWin()->ScreenToDIPRect(right_hwnd,
+                                            gfx::Rect(1900, 200, 100, 100)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x, DIPToScreenRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToScreenRect(left_hwnd, gfx::Rect(0, 0, 25, 50)));
-  EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToScreenRect(left_hwnd, gfx::Rect(126, 248, 21, 26)));
+  EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToScreenRect(
+                                          left_hwnd, gfx::Rect(0, 0, 25, 50)));
+  EXPECT_EQ(
+      gfx::Rect(252, 496, 42, 52),
+      GetScreenWin()->DIPToScreenRect(left_hwnd, gfx::Rect(126, 248, 21, 26)));
 
   HWND right_hwnd = GetRightFakeHwnd();
-  EXPECT_EQ(gfx::Rect(1920, 0, 200, 300),
-            ScreenWin::DIPToScreenRect(right_hwnd,
-                                       gfx::Rect(960, 0, 100, 150)));
+  EXPECT_EQ(
+      gfx::Rect(1920, 0, 200, 300),
+      GetScreenWin()->DIPToScreenRect(right_hwnd, gfx::Rect(960, 0, 100, 150)));
   EXPECT_EQ(gfx::Rect(2000, 496, 100, 200),
-            ScreenWin::DIPToScreenRect(right_hwnd,
-                                       gfx::Rect(1000, 248, 50, 100)));
+            GetScreenWin()->DIPToScreenRect(right_hwnd,
+                                            gfx::Rect(1000, 248, 50, 100)));
 
-  EXPECT_EQ(gfx::Rect(1900, 200, 100, 100),
-            ScreenWin::DIPToScreenRect(right_hwnd,
-                                       gfx::Rect(950, 100, 50, 50)));
+  EXPECT_EQ(
+      gfx::Rect(1900, 200, 100, 100),
+      GetScreenWin()->DIPToScreenRect(right_hwnd, gfx::Rect(950, 100, 50, 50)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x, DIPToScreenRectNullHWND) {
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
-  EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(126, 248, 21, 26)));
+            GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
+  EXPECT_EQ(
+      gfx::Rect(252, 496, 42, 52),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(126, 248, 21, 26)));
 
-  EXPECT_EQ(gfx::Rect(1920, 0, 200, 300),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(960, 0, 100, 150)));
-  EXPECT_EQ(gfx::Rect(2000, 496, 100, 200),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(1000, 248, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(1920, 0, 200, 300),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(960, 0, 100, 150)));
+  EXPECT_EQ(
+      gfx::Rect(2000, 496, 100, 200),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(1000, 248, 50, 100)));
 
-  EXPECT_EQ(gfx::Rect(1900, 200, 100, 100),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(950, 100, 50, 50)));
+  EXPECT_EQ(
+      gfx::Rect(1900, 200, 100, 100),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(950, 100, 50, 50)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x, ClientToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
-            ScreenWin::ClientToDIPRect(left_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(126, 248, 21, 26),
-            ScreenWin::ClientToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
+  EXPECT_EQ(gfx::Rect(0, 0, 25, 50), GetScreenWin()->ClientToDIPRect(
+                                         left_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(126, 248, 21, 26),
+      GetScreenWin()->ClientToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
 
   HWND right_hwnd = GetRightFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
-            ScreenWin::ClientToDIPRect(right_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(126, 248, 21, 26),
-            ScreenWin::ClientToDIPRect(right_hwnd,
-                                       gfx::Rect(253, 496, 41, 52)));
+  EXPECT_EQ(gfx::Rect(0, 0, 25, 50), GetScreenWin()->ClientToDIPRect(
+                                         right_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(126, 248, 21, 26),
+      GetScreenWin()->ClientToDIPRect(right_hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x, DIPToClientRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToClientRect(left_hwnd, gfx::Rect(0, 0, 25, 50)));
-  EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToClientRect(left_hwnd, gfx::Rect(126, 248, 21, 26)));
+  EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToClientRect(
+                                          left_hwnd, gfx::Rect(0, 0, 25, 50)));
+  EXPECT_EQ(
+      gfx::Rect(252, 496, 42, 52),
+      GetScreenWin()->DIPToClientRect(left_hwnd, gfx::Rect(126, 248, 21, 26)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x, ScreenToDIPSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(21, 66),
-            ScreenWin::ScreenToDIPSize(left_hwnd, gfx::Size(42, 131)));
+            GetScreenWin()->ScreenToDIPSize(left_hwnd, gfx::Size(42, 131)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Size(21, 66),
-            ScreenWin::ScreenToDIPSize(right_hwnd, gfx::Size(42, 131)));
+            GetScreenWin()->ScreenToDIPSize(right_hwnd, gfx::Size(42, 131)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x, DIPToScreenSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(42, 132),
-            ScreenWin::DIPToScreenSize(left_hwnd, gfx::Size(21, 66)));
+            GetScreenWin()->DIPToScreenSize(left_hwnd, gfx::Size(21, 66)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Size(42, 132),
-            ScreenWin::DIPToScreenSize(right_hwnd, gfx::Size(21, 66)));
+            GetScreenWin()->DIPToScreenSize(right_hwnd, gfx::Size(21, 66)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x, GetSystemMetricsInDIP) {
-  EXPECT_EQ(16, ScreenWin::GetSystemMetricsInDIP(31));
-  EXPECT_EQ(21, ScreenWin::GetSystemMetricsInDIP(42));
+  EXPECT_EQ(16, GetScreenWin()->GetSystemMetricsInDIP(31));
+  EXPECT_EQ(21, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x, GetScaleFactorForHWND) {
-  EXPECT_EQ(2.0, ScreenWin::GetScaleFactorForHWND(GetLeftFakeHwnd()));
-  EXPECT_EQ(2.0, ScreenWin::GetScaleFactorForHWND(GetRightFakeHwnd()));
+  EXPECT_EQ(2.0, GetScreenWin()->GetScaleFactorForHWND(GetLeftFakeHwnd()));
+  EXPECT_EQ(2.0, GetScreenWin()->GetScaleFactorForHWND(GetRightFakeHwnd()));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x, GetDisplays) {
@@ -1535,84 +1568,84 @@
   gfx::PointF primary_origin(0, 0);
   gfx::PointF primary_middle(250, 252);
   gfx::PointF primary_lower_right(639, 479);
-  EXPECT_EQ(primary_origin, ScreenWin::ScreenToDIPPoint(primary_origin));
-  EXPECT_EQ(primary_middle, ScreenWin::ScreenToDIPPoint(primary_middle));
+  EXPECT_EQ(primary_origin, GetScreenWin()->ScreenToDIPPoint(primary_origin));
+  EXPECT_EQ(primary_middle, GetScreenWin()->ScreenToDIPPoint(primary_middle));
   EXPECT_EQ(primary_lower_right,
-            ScreenWin::ScreenToDIPPoint(primary_lower_right));
+            GetScreenWin()->ScreenToDIPPoint(primary_lower_right));
 
   gfx::PointF monitor1_origin(640, 0);
   gfx::PointF monitor1_middle(852, 357);
   gfx::PointF monitor1_lower_right(1663, 759);
-  EXPECT_EQ(monitor1_origin, ScreenWin::ScreenToDIPPoint(monitor1_origin));
-  EXPECT_EQ(monitor1_middle, ScreenWin::ScreenToDIPPoint(monitor1_middle));
+  EXPECT_EQ(monitor1_origin, GetScreenWin()->ScreenToDIPPoint(monitor1_origin));
+  EXPECT_EQ(monitor1_middle, GetScreenWin()->ScreenToDIPPoint(monitor1_middle));
   EXPECT_EQ(monitor1_lower_right,
-            ScreenWin::ScreenToDIPPoint(monitor1_lower_right));
+            GetScreenWin()->ScreenToDIPPoint(monitor1_lower_right));
 
   gfx::PointF monitor2_origin(0, 480);
   gfx::PointF monitor2_middle(321, 700);
   gfx::PointF monitor2_lower_right(639, 779);
-  EXPECT_EQ(monitor2_origin, ScreenWin::ScreenToDIPPoint(monitor2_origin));
-  EXPECT_EQ(monitor2_middle, ScreenWin::ScreenToDIPPoint(monitor2_middle));
+  EXPECT_EQ(monitor2_origin, GetScreenWin()->ScreenToDIPPoint(monitor2_origin));
+  EXPECT_EQ(monitor2_middle, GetScreenWin()->ScreenToDIPPoint(monitor2_middle));
   EXPECT_EQ(monitor2_lower_right,
-            ScreenWin::ScreenToDIPPoint(monitor2_lower_right));
+            GetScreenWin()->ScreenToDIPPoint(monitor2_lower_right));
 
   gfx::PointF monitor3_origin(1664, 768);
   gfx::PointF monitor3_middle(1823, 1000);
   gfx::PointF monitor3_lower_right(2063, 1167);
-  EXPECT_EQ(monitor3_origin, ScreenWin::ScreenToDIPPoint(monitor3_origin));
-  EXPECT_EQ(monitor3_middle, ScreenWin::ScreenToDIPPoint(monitor3_middle));
+  EXPECT_EQ(monitor3_origin, GetScreenWin()->ScreenToDIPPoint(monitor3_origin));
+  EXPECT_EQ(monitor3_middle, GetScreenWin()->ScreenToDIPPoint(monitor3_middle));
   EXPECT_EQ(monitor3_lower_right,
-            ScreenWin::ScreenToDIPPoint(monitor3_lower_right));
+            GetScreenWin()->ScreenToDIPPoint(monitor3_lower_right));
 
   gfx::PointF monitor4_origin(1864, 1168);
   gfx::PointF monitor4_middle(1955, 1224);
   gfx::PointF monitor4_lower_right(2063, 1367);
-  EXPECT_EQ(monitor4_origin, ScreenWin::ScreenToDIPPoint(monitor4_origin));
-  EXPECT_EQ(monitor4_middle, ScreenWin::ScreenToDIPPoint(monitor4_middle));
+  EXPECT_EQ(monitor4_origin, GetScreenWin()->ScreenToDIPPoint(monitor4_origin));
+  EXPECT_EQ(monitor4_middle, GetScreenWin()->ScreenToDIPPoint(monitor4_middle));
   EXPECT_EQ(monitor4_lower_right,
-            ScreenWin::ScreenToDIPPoint(monitor4_lower_right));
+            GetScreenWin()->ScreenToDIPPoint(monitor4_lower_right));
 }
 
 TEST_F(ScreenWinTestManyDisplays1x, DIPToScreenPoints) {
   gfx::Point primary_origin(0, 0);
   gfx::Point primary_middle(250, 252);
   gfx::Point primary_lower_right(639, 479);
-  EXPECT_EQ(primary_origin, ScreenWin::DIPToScreenPoint(primary_origin));
-  EXPECT_EQ(primary_middle, ScreenWin::DIPToScreenPoint(primary_middle));
+  EXPECT_EQ(primary_origin, GetScreenWin()->DIPToScreenPoint(primary_origin));
+  EXPECT_EQ(primary_middle, GetScreenWin()->DIPToScreenPoint(primary_middle));
   EXPECT_EQ(primary_lower_right,
-            ScreenWin::DIPToScreenPoint(primary_lower_right));
+            GetScreenWin()->DIPToScreenPoint(primary_lower_right));
 
   gfx::Point monitor1_origin(640, 0);
   gfx::Point monitor1_middle(852, 357);
   gfx::Point monitor1_lower_right(1663, 759);
-  EXPECT_EQ(monitor1_origin, ScreenWin::DIPToScreenPoint(monitor1_origin));
-  EXPECT_EQ(monitor1_middle, ScreenWin::DIPToScreenPoint(monitor1_middle));
+  EXPECT_EQ(monitor1_origin, GetScreenWin()->DIPToScreenPoint(monitor1_origin));
+  EXPECT_EQ(monitor1_middle, GetScreenWin()->DIPToScreenPoint(monitor1_middle));
   EXPECT_EQ(monitor1_lower_right,
-            ScreenWin::DIPToScreenPoint(monitor1_lower_right));
+            GetScreenWin()->DIPToScreenPoint(monitor1_lower_right));
 
   gfx::Point monitor2_origin(0, 480);
   gfx::Point monitor2_middle(321, 700);
   gfx::Point monitor2_lower_right(639, 779);
-  EXPECT_EQ(monitor2_origin, ScreenWin::DIPToScreenPoint(monitor2_origin));
-  EXPECT_EQ(monitor2_middle, ScreenWin::DIPToScreenPoint(monitor2_middle));
+  EXPECT_EQ(monitor2_origin, GetScreenWin()->DIPToScreenPoint(monitor2_origin));
+  EXPECT_EQ(monitor2_middle, GetScreenWin()->DIPToScreenPoint(monitor2_middle));
   EXPECT_EQ(monitor2_lower_right,
-            ScreenWin::DIPToScreenPoint(monitor2_lower_right));
+            GetScreenWin()->DIPToScreenPoint(monitor2_lower_right));
 
   gfx::Point monitor3_origin(1664, 768);
   gfx::Point monitor3_middle(1823, 1000);
   gfx::Point monitor3_lower_right(2063, 1167);
-  EXPECT_EQ(monitor3_origin, ScreenWin::DIPToScreenPoint(monitor3_origin));
-  EXPECT_EQ(monitor3_middle, ScreenWin::DIPToScreenPoint(monitor3_middle));
+  EXPECT_EQ(monitor3_origin, GetScreenWin()->DIPToScreenPoint(monitor3_origin));
+  EXPECT_EQ(monitor3_middle, GetScreenWin()->DIPToScreenPoint(monitor3_middle));
   EXPECT_EQ(monitor3_lower_right,
-            ScreenWin::DIPToScreenPoint(monitor3_lower_right));
+            GetScreenWin()->DIPToScreenPoint(monitor3_lower_right));
 
   gfx::Point monitor4_origin(1864, 1168);
   gfx::Point monitor4_middle(1955, 1224);
   gfx::Point monitor4_lower_right(2063, 1367);
-  EXPECT_EQ(monitor4_origin, ScreenWin::DIPToScreenPoint(monitor4_origin));
-  EXPECT_EQ(monitor4_middle, ScreenWin::DIPToScreenPoint(monitor4_middle));
+  EXPECT_EQ(monitor4_origin, GetScreenWin()->DIPToScreenPoint(monitor4_origin));
+  EXPECT_EQ(monitor4_middle, GetScreenWin()->DIPToScreenPoint(monitor4_middle));
   EXPECT_EQ(monitor4_lower_right,
-            ScreenWin::DIPToScreenPoint(monitor4_lower_right));
+            GetScreenWin()->DIPToScreenPoint(monitor4_lower_right));
 }
 
 TEST_F(ScreenWinTestManyDisplays1x, ClientToDIPPoints) {
@@ -1622,10 +1655,10 @@
   ASSERT_EQ(5, GetScreen()->GetNumDisplays());
   for (size_t i = 0; i < 5u; ++i) {
     SCOPED_TRACE(base::StringPrintf("i=%zu", i));
-    EXPECT_EQ(origin, ScreenWin::ClientToDIPPoint(GetFakeHwnd(i), origin));
-    EXPECT_EQ(middle, ScreenWin::ClientToDIPPoint(GetFakeHwnd(i), middle));
+    EXPECT_EQ(origin, GetScreenWin()->ClientToDIPPoint(GetFakeHwnd(i), origin));
+    EXPECT_EQ(middle, GetScreenWin()->ClientToDIPPoint(GetFakeHwnd(i), middle));
     EXPECT_EQ(lower_right,
-              ScreenWin::ClientToDIPPoint(GetFakeHwnd(i), lower_right));
+              GetScreenWin()->ClientToDIPPoint(GetFakeHwnd(i), lower_right));
   }
 }
 
@@ -1636,10 +1669,10 @@
   ASSERT_EQ(5, GetScreen()->GetNumDisplays());
   for (size_t i = 0; i < 5u; ++i) {
     SCOPED_TRACE(base::StringPrintf("i=%zu", i));
-    EXPECT_EQ(origin, ScreenWin::DIPToClientPoint(GetFakeHwnd(i), origin));
-    EXPECT_EQ(middle, ScreenWin::DIPToClientPoint(GetFakeHwnd(i), middle));
+    EXPECT_EQ(origin, GetScreenWin()->DIPToClientPoint(GetFakeHwnd(i), origin));
+    EXPECT_EQ(middle, GetScreenWin()->DIPToClientPoint(GetFakeHwnd(i), middle));
     EXPECT_EQ(lower_right,
-              ScreenWin::DIPToClientPoint(GetFakeHwnd(i), lower_right));
+              GetScreenWin()->DIPToClientPoint(GetFakeHwnd(i), lower_right));
   }
 }
 
@@ -1647,111 +1680,111 @@
   gfx::Rect primary_origin(0, 0, 50, 100);
   gfx::Rect primary_middle(250, 252, 40, 50);
   EXPECT_EQ(primary_origin,
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(0), primary_origin));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(0), primary_origin));
   EXPECT_EQ(primary_middle,
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(0), primary_middle));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(0), primary_middle));
 
   gfx::Rect monitor1_origin(640, 0, 25, 43);
   gfx::Rect monitor1_middle(852, 357, 37, 45);
   EXPECT_EQ(monitor1_origin,
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(1), monitor1_origin));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(1), monitor1_origin));
   EXPECT_EQ(monitor1_middle,
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(1), monitor1_middle));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(1), monitor1_middle));
 
   gfx::Rect monitor2_origin(0, 480, 42, 40);
   gfx::Rect monitor2_middle(321, 700, 103, 203);
   EXPECT_EQ(monitor2_origin,
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(2), monitor2_origin));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(2), monitor2_origin));
   EXPECT_EQ(monitor2_middle,
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(2), monitor2_middle));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(2), monitor2_middle));
 
   gfx::Rect monitor3_origin(1664, 768, 24, 102);
   gfx::Rect monitor3_middle(1823, 1000, 35, 35);
   EXPECT_EQ(monitor3_origin,
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(3), monitor3_origin));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(3), monitor3_origin));
   EXPECT_EQ(monitor3_middle,
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(3), monitor3_middle));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(3), monitor3_middle));
 
   gfx::Rect monitor4_origin(1864, 1168, 15, 20);
   gfx::Rect monitor4_middle(1955, 1224, 25, 30);
   EXPECT_EQ(monitor4_origin,
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(4), monitor4_origin));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(4), monitor4_origin));
   EXPECT_EQ(monitor4_middle,
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(4), monitor4_middle));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(4), monitor4_middle));
 }
 
 TEST_F(ScreenWinTestManyDisplays1x, DIPToScreenRects) {
   gfx::Rect primary_origin(0, 0, 50, 100);
   gfx::Rect primary_middle(250, 252, 40, 50);
   EXPECT_EQ(primary_origin,
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(0), primary_origin));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(0), primary_origin));
   EXPECT_EQ(primary_middle,
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(0), primary_middle));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(0), primary_middle));
 
   gfx::Rect monitor1_origin(640, 0, 25, 43);
   gfx::Rect monitor1_middle(852, 357, 37, 45);
   EXPECT_EQ(monitor1_origin,
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(1), monitor1_origin));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(1), monitor1_origin));
   EXPECT_EQ(monitor1_middle,
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(1), monitor1_middle));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(1), monitor1_middle));
 
   gfx::Rect monitor2_origin(0, 480, 42, 40);
   gfx::Rect monitor2_middle(321, 700, 103, 203);
   EXPECT_EQ(monitor2_origin,
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(2), monitor2_origin));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(2), monitor2_origin));
   EXPECT_EQ(monitor2_middle,
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(2), monitor2_middle));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(2), monitor2_middle));
 
   gfx::Rect monitor3_origin(1664, 768, 24, 102);
   gfx::Rect monitor3_middle(1823, 1000, 35, 35);
   EXPECT_EQ(monitor3_origin,
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(3), monitor3_origin));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(3), monitor3_origin));
   EXPECT_EQ(monitor3_middle,
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(3), monitor3_middle));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(3), monitor3_middle));
 
   gfx::Rect monitor4_origin(1864, 1168, 15, 20);
   gfx::Rect monitor4_middle(1955, 1224, 25, 30);
   EXPECT_EQ(monitor4_origin,
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(4), monitor4_origin));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(4), monitor4_origin));
   EXPECT_EQ(monitor4_middle,
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(4), monitor4_middle));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(4), monitor4_middle));
 }
 
 TEST_F(ScreenWinTestManyDisplays1x, DIPToScreenRectNullHWND) {
   gfx::Rect primary_origin(0, 0, 50, 100);
   gfx::Rect primary_middle(250, 252, 40, 50);
   EXPECT_EQ(primary_origin,
-            ScreenWin::DIPToScreenRect(nullptr, primary_origin));
+            GetScreenWin()->DIPToScreenRect(nullptr, primary_origin));
   EXPECT_EQ(primary_middle,
-            ScreenWin::DIPToScreenRect(nullptr, primary_middle));
+            GetScreenWin()->DIPToScreenRect(nullptr, primary_middle));
 
   gfx::Rect monitor1_origin(640, 0, 25, 43);
   gfx::Rect monitor1_middle(852, 357, 37, 45);
   EXPECT_EQ(monitor1_origin,
-            ScreenWin::DIPToScreenRect(nullptr, monitor1_origin));
+            GetScreenWin()->DIPToScreenRect(nullptr, monitor1_origin));
   EXPECT_EQ(monitor1_middle,
-            ScreenWin::DIPToScreenRect(nullptr, monitor1_middle));
+            GetScreenWin()->DIPToScreenRect(nullptr, monitor1_middle));
 
   gfx::Rect monitor2_origin(0, 480, 42, 40);
   gfx::Rect monitor2_middle(321, 700, 103, 203);
   EXPECT_EQ(monitor2_origin,
-            ScreenWin::DIPToScreenRect(nullptr, monitor2_origin));
+            GetScreenWin()->DIPToScreenRect(nullptr, monitor2_origin));
   EXPECT_EQ(monitor2_middle,
-            ScreenWin::DIPToScreenRect(nullptr, monitor2_middle));
+            GetScreenWin()->DIPToScreenRect(nullptr, monitor2_middle));
 
   gfx::Rect monitor3_origin(1664, 768, 24, 102);
   gfx::Rect monitor3_middle(1823, 1000, 35, 35);
   EXPECT_EQ(monitor3_origin,
-            ScreenWin::DIPToScreenRect(nullptr, monitor3_origin));
+            GetScreenWin()->DIPToScreenRect(nullptr, monitor3_origin));
   EXPECT_EQ(monitor3_middle,
-            ScreenWin::DIPToScreenRect(nullptr, monitor3_middle));
+            GetScreenWin()->DIPToScreenRect(nullptr, monitor3_middle));
 
   gfx::Rect monitor4_origin(1864, 1168, 15, 20);
   gfx::Rect monitor4_middle(1955, 1224, 25, 30);
   EXPECT_EQ(monitor4_origin,
-            ScreenWin::DIPToScreenRect(nullptr, monitor4_origin));
+            GetScreenWin()->DIPToScreenRect(nullptr, monitor4_origin));
   EXPECT_EQ(monitor4_middle,
-            ScreenWin::DIPToScreenRect(nullptr, monitor4_middle));
+            GetScreenWin()->DIPToScreenRect(nullptr, monitor4_middle));
 }
 
 TEST_F(ScreenWinTestManyDisplays1x, ClientToDIPRects) {
@@ -1760,8 +1793,8 @@
   ASSERT_EQ(5, GetScreen()->GetNumDisplays());
   for (size_t i = 0; i < 5u; ++i) {
     SCOPED_TRACE(base::StringPrintf("i=%zu", i));
-    EXPECT_EQ(origin, ScreenWin::ClientToDIPRect(GetFakeHwnd(i), origin));
-    EXPECT_EQ(middle, ScreenWin::ClientToDIPRect(GetFakeHwnd(i), middle));
+    EXPECT_EQ(origin, GetScreenWin()->ClientToDIPRect(GetFakeHwnd(i), origin));
+    EXPECT_EQ(middle, GetScreenWin()->ClientToDIPRect(GetFakeHwnd(i), middle));
   }
 }
 
@@ -1771,8 +1804,8 @@
   ASSERT_EQ(5, GetScreen()->GetNumDisplays());
   for (size_t i = 0; i < 5u; ++i) {
     SCOPED_TRACE(base::StringPrintf("i=%zu", i));
-    EXPECT_EQ(origin, ScreenWin::DIPToClientRect(GetFakeHwnd(i), origin));
-    EXPECT_EQ(middle, ScreenWin::DIPToClientRect(GetFakeHwnd(i), middle));
+    EXPECT_EQ(origin, GetScreenWin()->DIPToClientRect(GetFakeHwnd(i), origin));
+    EXPECT_EQ(middle, GetScreenWin()->DIPToClientRect(GetFakeHwnd(i), middle));
   }
 }
 
@@ -1781,7 +1814,7 @@
   ASSERT_EQ(5, GetScreen()->GetNumDisplays());
   for (size_t i = 0; i < 5u; ++i) {
     SCOPED_TRACE(base::StringPrintf("i=%zu", i));
-    EXPECT_EQ(size, ScreenWin::ScreenToDIPSize(GetFakeHwnd(i), size));
+    EXPECT_EQ(size, GetScreenWin()->ScreenToDIPSize(GetFakeHwnd(i), size));
   }
 }
 
@@ -1790,19 +1823,19 @@
   ASSERT_EQ(5, GetScreen()->GetNumDisplays());
   for (size_t i = 0; i < 5u; ++i) {
     SCOPED_TRACE(base::StringPrintf("i=%zu", i));
-    EXPECT_EQ(size, ScreenWin::DIPToScreenSize(GetFakeHwnd(i), size));
+    EXPECT_EQ(size, GetScreenWin()->DIPToScreenSize(GetFakeHwnd(i), size));
   }
 }
 
 TEST_F(ScreenWinTestManyDisplays1x, GetSystemMetricsInDIP) {
-  EXPECT_EQ(31, ScreenWin::GetSystemMetricsInDIP(31));
-  EXPECT_EQ(42, ScreenWin::GetSystemMetricsInDIP(42));
+  EXPECT_EQ(31, GetScreenWin()->GetSystemMetricsInDIP(31));
+  EXPECT_EQ(42, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
 TEST_F(ScreenWinTestManyDisplays1x, GetScaleFactorForHWND) {
   for (size_t i = 0; i < 5u; ++i) {
     SCOPED_TRACE(base::StringPrintf("i=%zu", i));
-    EXPECT_EQ(1.0, ScreenWin::GetScaleFactorForHWND(GetFakeHwnd(i)));
+    EXPECT_EQ(1.0, GetScreenWin()->GetScaleFactorForHWND(GetFakeHwnd(i)));
   }
 }
 
@@ -1970,84 +2003,85 @@
 TEST_F(ScreenWinTestManyDisplays2x, ScreenToDIPPoints) {
   // Primary Monitor Points
   expect_point_f_eq(gfx::PointF(0, 0),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(0, 0)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(125, 126),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(250, 252)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(250, 252)));
   expect_point_f_eq(gfx::PointF(319.5, 239.5),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(639, 479)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(639, 479)));
 
   // Monitor 1
   expect_point_f_eq(gfx::PointF(320, 0),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(640, 0)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(640, 0)));
   expect_point_f_eq(gfx::PointF(426, 178.5),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(852, 357)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(852, 357)));
   expect_point_f_eq(gfx::PointF(831.5, 379.5),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(1663, 759)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1663, 759)));
 
   // Monitor 2
   expect_point_f_eq(gfx::PointF(0, 240),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(0, 480)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 480)));
   expect_point_f_eq(gfx::PointF(160.5, 350),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(321, 700)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(321, 700)));
   expect_point_f_eq(gfx::PointF(319.5, 389.5),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(639, 779)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(639, 779)));
 
   // Monitor 3
   expect_point_f_eq(gfx::PointF(832, 384),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(1664, 768)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1664, 768)));
   expect_point_f_eq(gfx::PointF(911.5, 500),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(1823, 1000)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1823, 1000)));
   expect_point_f_eq(gfx::PointF(1031.5, 583.5),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(2063, 1167)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(2063, 1167)));
 
   // Monitor 4
   expect_point_f_eq(gfx::PointF(932, 584),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(1864, 1168)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1864, 1168)));
   expect_point_f_eq(gfx::PointF(977.5, 612),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(1955, 1224)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1955, 1224)));
   expect_point_f_eq(gfx::PointF(1031.5, 683.5),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(2063, 1367)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(2063, 1367)));
 }
 
 TEST_F(ScreenWinTestManyDisplays2x, DIPToScreenPoints) {
   // Primary Monitor Points
-  EXPECT_EQ(gfx::Point(0, 0), ScreenWin::DIPToScreenPoint(gfx::Point(0, 0)));
+  EXPECT_EQ(gfx::Point(0, 0),
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(250, 252),
-            ScreenWin::DIPToScreenPoint(gfx::Point(125, 126)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(125, 126)));
   EXPECT_EQ(gfx::Point(638, 478),
-            ScreenWin::DIPToScreenPoint(gfx::Point(319, 239)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(319, 239)));
 
   // Monitor 1
   EXPECT_EQ(gfx::Point(640, 0),
-            ScreenWin::DIPToScreenPoint(gfx::Point(320, 0)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(320, 0)));
   EXPECT_EQ(gfx::Point(852, 356),
-            ScreenWin::DIPToScreenPoint(gfx::Point(426, 178)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(426, 178)));
   EXPECT_EQ(gfx::Point(1662, 758),
-            ScreenWin::DIPToScreenPoint(gfx::Point(831, 379)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(831, 379)));
 
   // Monitor 2
   EXPECT_EQ(gfx::Point(0, 480),
-            ScreenWin::DIPToScreenPoint(gfx::Point(0, 240)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 240)));
   EXPECT_EQ(gfx::Point(320, 700),
-            ScreenWin::DIPToScreenPoint(gfx::Point(160, 350)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(160, 350)));
   EXPECT_EQ(gfx::Point(638, 778),
-            ScreenWin::DIPToScreenPoint(gfx::Point(319, 389)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(319, 389)));
 
   // Monitor 3
   EXPECT_EQ(gfx::Point(1664, 768),
-            ScreenWin::DIPToScreenPoint(gfx::Point(832, 384)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(832, 384)));
   EXPECT_EQ(gfx::Point(1822, 1000),
-            ScreenWin::DIPToScreenPoint(gfx::Point(911, 500)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(911, 500)));
   EXPECT_EQ(gfx::Point(2062, 1166),
-            ScreenWin::DIPToScreenPoint(gfx::Point(1031, 583)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(1031, 583)));
 
   // Monitor 4
   EXPECT_EQ(gfx::Point(1864, 1168),
-            ScreenWin::DIPToScreenPoint(gfx::Point(932, 584)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(932, 584)));
   EXPECT_EQ(gfx::Point(1954, 1224),
-            ScreenWin::DIPToScreenPoint(gfx::Point(977, 612)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(977, 612)));
   EXPECT_EQ(gfx::Point(2062, 1366),
-            ScreenWin::DIPToScreenPoint(gfx::Point(1031, 683)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(1031, 683)));
 }
 
 TEST_F(ScreenWinTestManyDisplays2x, ClientToDIPPoints) {
@@ -2061,11 +2095,11 @@
   for (size_t i = 0; i < 5u; ++i) {
     SCOPED_TRACE(base::StringPrintf("i=%zu", i));
     EXPECT_EQ(dip_origin,
-              ScreenWin::ClientToDIPPoint(GetFakeHwnd(i), client_origin));
+              GetScreenWin()->ClientToDIPPoint(GetFakeHwnd(i), client_origin));
     EXPECT_EQ(dip_middle,
-              ScreenWin::ClientToDIPPoint(GetFakeHwnd(i), client_middle));
-    EXPECT_EQ(dip_lower_right,
-              ScreenWin::ClientToDIPPoint(GetFakeHwnd(i), client_lower_right));
+              GetScreenWin()->ClientToDIPPoint(GetFakeHwnd(i), client_middle));
+    EXPECT_EQ(dip_lower_right, GetScreenWin()->ClientToDIPPoint(
+                                   GetFakeHwnd(i), client_lower_right));
   }
 }
 
@@ -2080,128 +2114,135 @@
   for (size_t i = 0; i < 5u; ++i) {
     SCOPED_TRACE(base::StringPrintf("i=%zu", i));
     EXPECT_EQ(client_origin,
-              ScreenWin::DIPToClientPoint(GetFakeHwnd(i), dip_origin));
+              GetScreenWin()->DIPToClientPoint(GetFakeHwnd(i), dip_origin));
     EXPECT_EQ(client_middle,
-              ScreenWin::DIPToClientPoint(GetFakeHwnd(i), dip_middle));
-    EXPECT_EQ(client_lower_right,
-              ScreenWin::DIPToClientPoint(GetFakeHwnd(i), dip_lower_right));
+              GetScreenWin()->DIPToClientPoint(GetFakeHwnd(i), dip_middle));
+    EXPECT_EQ(client_lower_right, GetScreenWin()->DIPToClientPoint(
+                                      GetFakeHwnd(i), dip_lower_right));
   }
 }
 
 TEST_F(ScreenWinTestManyDisplays2x, ScreenToDIPRects) {
   // Primary Monitor
   EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(0),
-                                       gfx::Rect(0, 0, 50, 100)));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(0),
+                                            gfx::Rect(0, 0, 50, 100)));
   EXPECT_EQ(gfx::Rect(125, 126, 20, 25),
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(0),
-                                       gfx::Rect(250, 252, 40, 50)));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(0),
+                                            gfx::Rect(250, 252, 40, 50)));
 
   // Monitor 1
   EXPECT_EQ(gfx::Rect(320, 0, 13, 22),
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(1),
-                                       gfx::Rect(640, 0, 25, 43)));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(1),
+                                            gfx::Rect(640, 0, 25, 43)));
   EXPECT_EQ(gfx::Rect(426, 178, 19, 23),
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(1),
-                                       gfx::Rect(852, 357, 37, 45)));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(1),
+                                            gfx::Rect(852, 357, 37, 45)));
 
   // Monitor 2
   EXPECT_EQ(gfx::Rect(0, 240, 21, 20),
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(2),
-                                       gfx::Rect(0, 480, 42, 40)));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(2),
+                                            gfx::Rect(0, 480, 42, 40)));
   EXPECT_EQ(gfx::Rect(160, 350, 52, 102),
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(2),
-                                       gfx::Rect(321, 700, 103, 203)));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(2),
+                                            gfx::Rect(321, 700, 103, 203)));
 
   // Monitor 3
   EXPECT_EQ(gfx::Rect(832, 384, 12, 51),
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(3),
-                                       gfx::Rect(1664, 768, 24, 102)));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(3),
+                                            gfx::Rect(1664, 768, 24, 102)));
   EXPECT_EQ(gfx::Rect(911, 500, 18, 18),
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(3),
-                                       gfx::Rect(1823, 1000, 35, 35)));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(3),
+                                            gfx::Rect(1823, 1000, 35, 35)));
 
   // Monitor 4
   EXPECT_EQ(gfx::Rect(932, 584, 8, 10),
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(4),
-                                       gfx::Rect(1864, 1168, 15, 20)));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(4),
+                                            gfx::Rect(1864, 1168, 15, 20)));
   EXPECT_EQ(gfx::Rect(977, 612, 13, 15),
-            ScreenWin::ScreenToDIPRect(GetFakeHwnd(4),
-                                       gfx::Rect(1955, 1224, 25, 30)));
+            GetScreenWin()->ScreenToDIPRect(GetFakeHwnd(4),
+                                            gfx::Rect(1955, 1224, 25, 30)));
 }
 
 TEST_F(ScreenWinTestManyDisplays2x, DIPToScreenRects) {
   // Primary Monitor
-  EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(0),
-                                       gfx::Rect(0, 0, 25, 50)));
+  EXPECT_EQ(
+      gfx::Rect(0, 0, 50, 100),
+      GetScreenWin()->DIPToScreenRect(GetFakeHwnd(0), gfx::Rect(0, 0, 25, 50)));
   EXPECT_EQ(gfx::Rect(250, 252, 40, 50),
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(0),
-                                       gfx::Rect(125, 126, 20, 25)));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(0),
+                                            gfx::Rect(125, 126, 20, 25)));
 
   // Monitor 1
   EXPECT_EQ(gfx::Rect(640, 0, 26, 44),
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(1),
-                                       gfx::Rect(320, 0, 13, 22)));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(1),
+                                            gfx::Rect(320, 0, 13, 22)));
   EXPECT_EQ(gfx::Rect(852, 356, 38, 46),
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(1),
-                                       gfx::Rect(426, 178, 19, 23)));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(1),
+                                            gfx::Rect(426, 178, 19, 23)));
 
   // Monitor 2
   EXPECT_EQ(gfx::Rect(0, 480, 42, 40),
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(2),
-                                       gfx::Rect(0, 240, 21, 20)));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(2),
+                                            gfx::Rect(0, 240, 21, 20)));
   EXPECT_EQ(gfx::Rect(320, 700, 104, 204),
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(2),
-                                       gfx::Rect(160, 350, 52, 102)));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(2),
+                                            gfx::Rect(160, 350, 52, 102)));
 
   // Monitor 3
   EXPECT_EQ(gfx::Rect(1664, 768, 24, 102),
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(3),
-                                       gfx::Rect(832, 384, 12, 51)));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(3),
+                                            gfx::Rect(832, 384, 12, 51)));
   EXPECT_EQ(gfx::Rect(1822, 1000, 36, 36),
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(3),
-                                       gfx::Rect(911, 500, 18, 18)));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(3),
+                                            gfx::Rect(911, 500, 18, 18)));
 
   // Monitor 4
   EXPECT_EQ(gfx::Rect(1864, 1168, 16, 20),
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(4),
-                                       gfx::Rect(932, 584, 8, 10)));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(4),
+                                            gfx::Rect(932, 584, 8, 10)));
   EXPECT_EQ(gfx::Rect(1954, 1224, 26, 30),
-            ScreenWin::DIPToScreenRect(GetFakeHwnd(4),
-                                       gfx::Rect(977, 612, 13, 15)));
+            GetScreenWin()->DIPToScreenRect(GetFakeHwnd(4),
+                                            gfx::Rect(977, 612, 13, 15)));
 }
 
 TEST_F(ScreenWinTestManyDisplays2x, DIPToScreenRectNullHWND) {
   // Primary Monitor
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
-  EXPECT_EQ(gfx::Rect(250, 252, 40, 50),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(125, 126, 20, 25)));
+            GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
+  EXPECT_EQ(
+      gfx::Rect(250, 252, 40, 50),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(125, 126, 20, 25)));
 
   // Monitor 1
-  EXPECT_EQ(gfx::Rect(640, 0, 26, 44),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(320, 0, 13, 22)));
-  EXPECT_EQ(gfx::Rect(852, 356, 38, 46),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(426, 178, 19, 23)));
+  EXPECT_EQ(gfx::Rect(640, 0, 26, 44), GetScreenWin()->DIPToScreenRect(
+                                           nullptr, gfx::Rect(320, 0, 13, 22)));
+  EXPECT_EQ(
+      gfx::Rect(852, 356, 38, 46),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(426, 178, 19, 23)));
 
   // Monitor 2
-  EXPECT_EQ(gfx::Rect(0, 480, 42, 40),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 240, 21, 20)));
-  EXPECT_EQ(gfx::Rect(320, 700, 104, 204),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(160, 350, 52, 102)));
+  EXPECT_EQ(gfx::Rect(0, 480, 42, 40), GetScreenWin()->DIPToScreenRect(
+                                           nullptr, gfx::Rect(0, 240, 21, 20)));
+  EXPECT_EQ(
+      gfx::Rect(320, 700, 104, 204),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(160, 350, 52, 102)));
 
   // Monitor 3
-  EXPECT_EQ(gfx::Rect(1664, 768, 24, 102),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(832, 384, 12, 51)));
-  EXPECT_EQ(gfx::Rect(1822, 1000, 36, 36),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(911, 500, 18, 18)));
+  EXPECT_EQ(
+      gfx::Rect(1664, 768, 24, 102),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(832, 384, 12, 51)));
+  EXPECT_EQ(
+      gfx::Rect(1822, 1000, 36, 36),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(911, 500, 18, 18)));
 
   // Monitor 4
-  EXPECT_EQ(gfx::Rect(1864, 1168, 16, 20),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(932, 584, 8, 10)));
-  EXPECT_EQ(gfx::Rect(1954, 1224, 26, 30),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(977, 612, 13, 15)));
+  EXPECT_EQ(
+      gfx::Rect(1864, 1168, 16, 20),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(932, 584, 8, 10)));
+  EXPECT_EQ(
+      gfx::Rect(1954, 1224, 26, 30),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(977, 612, 13, 15)));
 }
 
 TEST_F(ScreenWinTestManyDisplays2x, ClientToDIPRects) {
@@ -2212,10 +2253,10 @@
   ASSERT_EQ(5, GetScreen()->GetNumDisplays());
   for (size_t i = 0; i < 5u; ++i) {
     SCOPED_TRACE(base::StringPrintf("i=%zu", i));
-    EXPECT_EQ(client_dip_origin,
-              ScreenWin::ClientToDIPRect(GetFakeHwnd(i), client_screen_origin));
-    EXPECT_EQ(client_dip_middle,
-              ScreenWin::ClientToDIPRect(GetFakeHwnd(i), client_screen_middle));
+    EXPECT_EQ(client_dip_origin, GetScreenWin()->ClientToDIPRect(
+                                     GetFakeHwnd(i), client_screen_origin));
+    EXPECT_EQ(client_dip_middle, GetScreenWin()->ClientToDIPRect(
+                                     GetFakeHwnd(i), client_screen_middle));
   }
 }
 
@@ -2227,11 +2268,10 @@
   ASSERT_EQ(5, GetScreen()->GetNumDisplays());
   for (size_t i = 0; i < 5u; ++i) {
     SCOPED_TRACE(base::StringPrintf("i=%zu", i));
-    EXPECT_EQ(client_screen_origin,
-              ScreenWin::DIPToClientRect(GetFakeHwnd(i), client_dip_origin));
-    EXPECT_EQ(client_screen_middle,
-              ScreenWin::DIPToClientRect(GetFakeHwnd(i), client_dip_middle));
-
+    EXPECT_EQ(client_screen_origin, GetScreenWin()->DIPToClientRect(
+                                        GetFakeHwnd(i), client_dip_origin));
+    EXPECT_EQ(client_screen_middle, GetScreenWin()->DIPToClientRect(
+                                        GetFakeHwnd(i), client_dip_middle));
   }
 }
 
@@ -2242,7 +2282,7 @@
   for (size_t i = 0; i < 5u; ++i) {
     SCOPED_TRACE(base::StringPrintf("i=%zu", i));
     EXPECT_EQ(dip_size,
-              ScreenWin::ScreenToDIPSize(GetFakeHwnd(i), screen_size));
+              GetScreenWin()->ScreenToDIPSize(GetFakeHwnd(i), screen_size));
   }
 }
 
@@ -2253,19 +2293,19 @@
   for (size_t i = 0; i < 5u; ++i) {
     SCOPED_TRACE(base::StringPrintf("i=%zu", i));
     EXPECT_EQ(screen_size,
-              ScreenWin::DIPToScreenSize(GetFakeHwnd(i), dip_size));
+              GetScreenWin()->DIPToScreenSize(GetFakeHwnd(i), dip_size));
   }
 }
 
 TEST_F(ScreenWinTestManyDisplays2x, GetSystemMetricsInDIP) {
-  EXPECT_EQ(16, ScreenWin::GetSystemMetricsInDIP(31));
-  EXPECT_EQ(21, ScreenWin::GetSystemMetricsInDIP(42));
+  EXPECT_EQ(16, GetScreenWin()->GetSystemMetricsInDIP(31));
+  EXPECT_EQ(21, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
 TEST_F(ScreenWinTestManyDisplays2x, GetScaleFactorForHWND) {
   for (size_t i = 0; i < 5u; ++i) {
     SCOPED_TRACE(base::StringPrintf("i=%zu", i));
-    EXPECT_EQ(2.0, ScreenWin::GetScaleFactorForHWND(GetFakeHwnd(i)));
+    EXPECT_EQ(2.0, GetScreenWin()->GetScaleFactorForHWND(GetFakeHwnd(i)));
   }
 }
 
@@ -2404,187 +2444,193 @@
 
 TEST_F(ScreenWinTestTwoDisplays1x2x, ScreenToDIPPoints) {
   expect_point_f_eq(gfx::PointF(0, 0),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(0, 0)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(365, 694),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(365, 694)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(365, 694)));
   expect_point_f_eq(gfx::PointF(1919, 1199),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(1919, 1199)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1919, 1199)));
 
   expect_point_f_eq(gfx::PointF(1920, 0),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(1920, 0)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1920, 0)));
   expect_point_f_eq(gfx::PointF(2152, 175.5),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(2384, 351)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(2384, 351)));
   expect_point_f_eq(gfx::PointF(2319.5, 299.5),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(2719, 599)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(2719, 599)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x2x, DIPToScreenPoints) {
-  EXPECT_EQ(gfx::Point(0, 0), ScreenWin::DIPToScreenPoint(gfx::Point(0, 0)));
+  EXPECT_EQ(gfx::Point(0, 0),
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(365, 694),
-            ScreenWin::DIPToScreenPoint(gfx::Point(365, 694)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(365, 694)));
   EXPECT_EQ(gfx::Point(1919, 1199),
-            ScreenWin::DIPToScreenPoint(gfx::Point(1919, 1199)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(1919, 1199)));
 
   EXPECT_EQ(gfx::Point(1920, 0),
-            ScreenWin::DIPToScreenPoint(gfx::Point(1920, 0)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(1920, 0)));
   EXPECT_EQ(gfx::Point(2384, 350),
-            ScreenWin::DIPToScreenPoint(gfx::Point(2152, 175)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(2152, 175)));
   EXPECT_EQ(gfx::Point(2718, 598),
-            ScreenWin::DIPToScreenPoint(gfx::Point(2319, 299)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(2319, 299)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x2x, ClientToDIPPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::ClientToDIPPoint(left_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->ClientToDIPPoint(left_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(365, 694),
-            ScreenWin::ClientToDIPPoint(left_hwnd, gfx::Point(365, 694)));
-  EXPECT_EQ(gfx::Point(1919, 1199),
-            ScreenWin::ClientToDIPPoint(left_hwnd, gfx::Point(1919, 1199)));
+            GetScreenWin()->ClientToDIPPoint(left_hwnd, gfx::Point(365, 694)));
+  EXPECT_EQ(gfx::Point(1919, 1199), GetScreenWin()->ClientToDIPPoint(
+                                        left_hwnd, gfx::Point(1919, 1199)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::ClientToDIPPoint(right_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->ClientToDIPPoint(right_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(182, 347),
-            ScreenWin::ClientToDIPPoint(right_hwnd, gfx::Point(365, 694)));
-  EXPECT_EQ(gfx::Point(959, 599),
-            ScreenWin::ClientToDIPPoint(right_hwnd, gfx::Point(1919, 1199)));
+            GetScreenWin()->ClientToDIPPoint(right_hwnd, gfx::Point(365, 694)));
+  EXPECT_EQ(gfx::Point(959, 599), GetScreenWin()->ClientToDIPPoint(
+                                      right_hwnd, gfx::Point(1919, 1199)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x2x, DIPToClientPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::DIPToClientPoint(left_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(365, 694),
-            ScreenWin::DIPToClientPoint(left_hwnd, gfx::Point(365, 694)));
-  EXPECT_EQ(gfx::Point(1919, 1199),
-            ScreenWin::DIPToClientPoint(left_hwnd, gfx::Point(1919, 1199)));
+            GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(365, 694)));
+  EXPECT_EQ(gfx::Point(1919, 1199), GetScreenWin()->DIPToClientPoint(
+                                        left_hwnd, gfx::Point(1919, 1199)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::DIPToClientPoint(right_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->DIPToClientPoint(right_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 694),
-            ScreenWin::DIPToClientPoint(right_hwnd, gfx::Point(182, 347)));
+            GetScreenWin()->DIPToClientPoint(right_hwnd, gfx::Point(182, 347)));
   EXPECT_EQ(gfx::Point(1918, 1198),
-            ScreenWin::DIPToClientPoint(right_hwnd, gfx::Point(959, 599)));
+            GetScreenWin()->DIPToClientPoint(right_hwnd, gfx::Point(959, 599)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x2x, ScreenToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::ScreenToDIPRect(left_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(253, 496, 41, 52),
-            ScreenWin::ScreenToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
+  EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->ScreenToDIPRect(
+                                          left_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(253, 496, 41, 52),
+      GetScreenWin()->ScreenToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Rect(1920, 0, 100, 150),
-            ScreenWin::ScreenToDIPRect(right_hwnd,
-                                       gfx::Rect(1920, 0, 200, 300)));
+            GetScreenWin()->ScreenToDIPRect(right_hwnd,
+                                            gfx::Rect(1920, 0, 200, 300)));
   EXPECT_EQ(gfx::Rect(1960, 248, 50, 100),
-            ScreenWin::ScreenToDIPRect(right_hwnd,
-                                       gfx::Rect(2000, 496, 100, 200)));
+            GetScreenWin()->ScreenToDIPRect(right_hwnd,
+                                            gfx::Rect(2000, 496, 100, 200)));
 
   EXPECT_EQ(gfx::Rect(1910, 100, 50, 50),
-            ScreenWin::ScreenToDIPRect(right_hwnd,
-                                       gfx::Rect(1900, 200, 100, 100)));
+            GetScreenWin()->ScreenToDIPRect(right_hwnd,
+                                            gfx::Rect(1900, 200, 100, 100)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x2x, DIPToScreenRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToScreenRect(left_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToScreenRect(left_hwnd, gfx::Rect(252, 496, 42, 52)));
+  EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToScreenRect(
+                                          left_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(252, 496, 42, 52),
+      GetScreenWin()->DIPToScreenRect(left_hwnd, gfx::Rect(252, 496, 42, 52)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Rect(1920, 0, 200, 300),
-            ScreenWin::DIPToScreenRect(right_hwnd,
-                                       gfx::Rect(1920, 0, 100, 150)));
+            GetScreenWin()->DIPToScreenRect(right_hwnd,
+                                            gfx::Rect(1920, 0, 100, 150)));
   EXPECT_EQ(gfx::Rect(2000, 496, 100, 200),
-            ScreenWin::DIPToScreenRect(right_hwnd,
-                                       gfx::Rect(1960, 248, 50, 100)));
+            GetScreenWin()->DIPToScreenRect(right_hwnd,
+                                            gfx::Rect(1960, 248, 50, 100)));
 
   EXPECT_EQ(gfx::Rect(1900, 200, 100, 100),
-          ScreenWin::DIPToScreenRect(right_hwnd,
-                                     gfx::Rect(1910, 100, 50, 50)));
+            GetScreenWin()->DIPToScreenRect(right_hwnd,
+                                            gfx::Rect(1910, 100, 50, 50)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x2x, DIPToScreenRectNullHWND) {
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(252, 496, 42, 52)));
+            GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(252, 496, 42, 52),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(252, 496, 42, 52)));
 
-  EXPECT_EQ(gfx::Rect(1920, 0, 200, 300),
-            ScreenWin::DIPToScreenRect(nullptr,
-                                       gfx::Rect(1920, 0, 100, 150)));
-  EXPECT_EQ(gfx::Rect(2000, 496, 100, 200),
-            ScreenWin::DIPToScreenRect(nullptr,
-                                       gfx::Rect(1960, 248, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(1920, 0, 200, 300),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(1920, 0, 100, 150)));
+  EXPECT_EQ(
+      gfx::Rect(2000, 496, 100, 200),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(1960, 248, 50, 100)));
 
-  EXPECT_EQ(gfx::Rect(1900, 200, 100, 100),
-          ScreenWin::DIPToScreenRect(nullptr,
-                                     gfx::Rect(1910, 100, 50, 50)));
+  EXPECT_EQ(
+      gfx::Rect(1900, 200, 100, 100),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(1910, 100, 50, 50)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x2x, ClientToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::ClientToDIPRect(left_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(253, 496, 41, 52),
-            ScreenWin::ClientToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
+  EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->ClientToDIPRect(
+                                          left_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(253, 496, 41, 52),
+      GetScreenWin()->ClientToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
 
   HWND right_hwnd = GetRightFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
-            ScreenWin::ClientToDIPRect(right_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(126, 248, 21, 26),
-            ScreenWin::ClientToDIPRect(right_hwnd,
-                                       gfx::Rect(253, 496, 41, 52)));
+  EXPECT_EQ(gfx::Rect(0, 0, 25, 50), GetScreenWin()->ClientToDIPRect(
+                                         right_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(126, 248, 21, 26),
+      GetScreenWin()->ClientToDIPRect(right_hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x2x, DIPToClientRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToClientRect(left_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToClientRect(left_hwnd, gfx::Rect(252, 496, 42, 52)));
+  EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToClientRect(
+                                          left_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(252, 496, 42, 52),
+      GetScreenWin()->DIPToClientRect(left_hwnd, gfx::Rect(252, 496, 42, 52)));
 
   HWND right_hwnd = GetRightFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToClientRect(right_hwnd, gfx::Rect(0, 0, 25, 50)));
-  EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToClientRect(right_hwnd,
-                                       gfx::Rect(126, 248, 21, 26)));
+  EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToClientRect(
+                                          right_hwnd, gfx::Rect(0, 0, 25, 50)));
+  EXPECT_EQ(
+      gfx::Rect(252, 496, 42, 52),
+      GetScreenWin()->DIPToClientRect(right_hwnd, gfx::Rect(126, 248, 21, 26)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x2x, ScreenToDIPSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(42, 131),
-            ScreenWin::ScreenToDIPSize(left_hwnd, gfx::Size(42, 131)));
+            GetScreenWin()->ScreenToDIPSize(left_hwnd, gfx::Size(42, 131)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Size(21, 66),
-            ScreenWin::ScreenToDIPSize(right_hwnd, gfx::Size(42, 131)));
+            GetScreenWin()->ScreenToDIPSize(right_hwnd, gfx::Size(42, 131)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x2x, DIPToScreenSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(21, 66),
-            ScreenWin::DIPToScreenSize(left_hwnd, gfx::Size(21, 66)));
+            GetScreenWin()->DIPToScreenSize(left_hwnd, gfx::Size(21, 66)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Size(42, 132),
-            ScreenWin::DIPToScreenSize(right_hwnd, gfx::Size(21, 66)));
+            GetScreenWin()->DIPToScreenSize(right_hwnd, gfx::Size(21, 66)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x2x, GetSystemMetricsInDIP) {
-  EXPECT_EQ(31, ScreenWin::GetSystemMetricsInDIP(31));
-  EXPECT_EQ(42, ScreenWin::GetSystemMetricsInDIP(42));
+  EXPECT_EQ(31, GetScreenWin()->GetSystemMetricsInDIP(31));
+  EXPECT_EQ(42, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x2x, GetScaleFactorForHWND) {
-  EXPECT_EQ(1.0, ScreenWin::GetScaleFactorForHWND(GetLeftFakeHwnd()));
-  EXPECT_EQ(2.0, ScreenWin::GetScaleFactorForHWND(GetRightFakeHwnd()));
+  EXPECT_EQ(1.0, GetScreenWin()->GetScaleFactorForHWND(GetLeftFakeHwnd()));
+  EXPECT_EQ(2.0, GetScreenWin()->GetScaleFactorForHWND(GetRightFakeHwnd()));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1x2x, GetDisplays) {
@@ -2699,185 +2745,195 @@
 
 TEST_F(ScreenWinTestTwoDisplays1_5x1x, ScreenToDIPPoints) {
   expect_point_f_eq(gfx::PointF(0, 0),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(0, 0)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(243.3333F, 301.3333F),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(365, 452)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(365, 452)));
   expect_point_f_eq(gfx::PointF(532.6666F, 399.3333F),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(799, 599)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(799, 599)));
 
   expect_point_f_eq(gfx::PointF(534, -80),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(800, 120)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(800, 120)));
   expect_point_f_eq(gfx::PointF(860, 151),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(1126, 351)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1126, 351)));
   expect_point_f_eq(gfx::PointF(1173, 399),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(1439, 599)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1439, 599)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1_5x1x, DIPToScreenPoints) {
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::DIPToScreenPoint(gfx::Point(0, 0)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 451),
-            ScreenWin::DIPToScreenPoint(gfx::Point(243, 301)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(243, 301)));
   EXPECT_EQ(gfx::Point(798, 598),
-            ScreenWin::DIPToScreenPoint(gfx::Point(532, 399)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(532, 399)));
 
   EXPECT_EQ(gfx::Point(800, 120),
-            ScreenWin::DIPToScreenPoint(gfx::Point(534, -80)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(534, -80)));
   EXPECT_EQ(gfx::Point(1126, 351),
-            ScreenWin::DIPToScreenPoint(gfx::Point(860, 151)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(860, 151)));
   EXPECT_EQ(gfx::Point(1439, 599),
-            ScreenWin::DIPToScreenPoint(gfx::Point(1173, 399)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(1173, 399)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1_5x1x, ClientToDIPPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::ClientToDIPPoint(left_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->ClientToDIPPoint(left_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(243, 462),
-            ScreenWin::ClientToDIPPoint(left_hwnd, gfx::Point(365, 694)));
-  EXPECT_EQ(gfx::Point(1279, 799),
-            ScreenWin::ClientToDIPPoint(left_hwnd, gfx::Point(1919, 1199)));
+            GetScreenWin()->ClientToDIPPoint(left_hwnd, gfx::Point(365, 694)));
+  EXPECT_EQ(gfx::Point(1279, 799), GetScreenWin()->ClientToDIPPoint(
+                                       left_hwnd, gfx::Point(1919, 1199)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::ClientToDIPPoint(right_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->ClientToDIPPoint(right_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(365, 694),
-            ScreenWin::ClientToDIPPoint(right_hwnd, gfx::Point(365, 694)));
-  EXPECT_EQ(gfx::Point(1919, 1199),
-            ScreenWin::ClientToDIPPoint(right_hwnd, gfx::Point(1919, 1199)));
+            GetScreenWin()->ClientToDIPPoint(right_hwnd, gfx::Point(365, 694)));
+  EXPECT_EQ(gfx::Point(1919, 1199), GetScreenWin()->ClientToDIPPoint(
+                                        right_hwnd, gfx::Point(1919, 1199)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1_5x1x, DIPToClientPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::DIPToClientPoint(left_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 693),
-            ScreenWin::DIPToClientPoint(left_hwnd, gfx::Point(243, 462)));
+            GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(243, 462)));
   EXPECT_EQ(gfx::Point(1918, 1198),
-            ScreenWin::DIPToClientPoint(left_hwnd, gfx::Point(1279, 799)));
+            GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(1279, 799)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::DIPToClientPoint(right_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->DIPToClientPoint(right_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(365, 694),
-            ScreenWin::DIPToClientPoint(right_hwnd, gfx::Point(365, 694)));
-  EXPECT_EQ(gfx::Point(1919, 1199),
-            ScreenWin::DIPToClientPoint(right_hwnd, gfx::Point(1919, 1199)));
+            GetScreenWin()->DIPToClientPoint(right_hwnd, gfx::Point(365, 694)));
+  EXPECT_EQ(gfx::Point(1919, 1199), GetScreenWin()->DIPToClientPoint(
+                                        right_hwnd, gfx::Point(1919, 1199)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1_5x1x, ScreenToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 34, 67),
-            ScreenWin::ScreenToDIPRect(left_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(168, 330, 28, 36),
-            ScreenWin::ScreenToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
+  EXPECT_EQ(gfx::Rect(0, 0, 34, 67), GetScreenWin()->ScreenToDIPRect(
+                                         left_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(168, 330, 28, 36),
+      GetScreenWin()->ScreenToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Rect(534, -80, 200, 300),
-            ScreenWin::ScreenToDIPRect(right_hwnd,
-                                       gfx::Rect(800, 120, 200, 300)));
+            GetScreenWin()->ScreenToDIPRect(right_hwnd,
+                                            gfx::Rect(800, 120, 200, 300)));
   EXPECT_EQ(gfx::Rect(987, 296, 100, 200),
-            ScreenWin::ScreenToDIPRect(right_hwnd,
-                                       gfx::Rect(1253, 496, 100, 200)));
+            GetScreenWin()->ScreenToDIPRect(right_hwnd,
+                                            gfx::Rect(1253, 496, 100, 200)));
 
   EXPECT_EQ(gfx::Rect(514, 0, 100, 100),
-          ScreenWin::ScreenToDIPRect(right_hwnd,
-                                     gfx::Rect(780, 200, 100, 100)));
+            GetScreenWin()->ScreenToDIPRect(right_hwnd,
+                                            gfx::Rect(780, 200, 100, 100)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1_5x1x, DIPToScreenRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 51, 101),
-            ScreenWin::DIPToScreenRect(left_hwnd, gfx::Rect(0, 0, 34, 67)));
-  EXPECT_EQ(gfx::Rect(252, 495, 42, 54),
-            ScreenWin::DIPToScreenRect(left_hwnd, gfx::Rect(168, 330, 28, 36)));
+  EXPECT_EQ(gfx::Rect(0, 0, 51, 101), GetScreenWin()->DIPToScreenRect(
+                                          left_hwnd, gfx::Rect(0, 0, 34, 67)));
+  EXPECT_EQ(
+      gfx::Rect(252, 495, 42, 54),
+      GetScreenWin()->DIPToScreenRect(left_hwnd, gfx::Rect(168, 330, 28, 36)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Rect(800, 120, 200, 300),
-            ScreenWin::DIPToScreenRect(right_hwnd,
-                                       gfx::Rect(534, -80, 200, 300)));
+            GetScreenWin()->DIPToScreenRect(right_hwnd,
+                                            gfx::Rect(534, -80, 200, 300)));
   EXPECT_EQ(gfx::Rect(1253, 496, 100, 200),
-            ScreenWin::DIPToScreenRect(right_hwnd,
-                                       gfx::Rect(987, 296, 100, 200)));
+            GetScreenWin()->DIPToScreenRect(right_hwnd,
+                                            gfx::Rect(987, 296, 100, 200)));
 
-  EXPECT_EQ(gfx::Rect(780, 200, 100, 100),
-          ScreenWin::DIPToScreenRect(right_hwnd,
-                                     gfx::Rect(514, 0, 100, 100)));
+  EXPECT_EQ(
+      gfx::Rect(780, 200, 100, 100),
+      GetScreenWin()->DIPToScreenRect(right_hwnd, gfx::Rect(514, 0, 100, 100)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1_5x1x, DIPToScreenRectNullHWND) {
   EXPECT_EQ(gfx::Rect(0, 0, 51, 101),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 34, 67)));
-  EXPECT_EQ(gfx::Rect(252, 495, 42, 54),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(168, 330, 28, 36)));
+            GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 34, 67)));
+  EXPECT_EQ(
+      gfx::Rect(252, 495, 42, 54),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(168, 330, 28, 36)));
 
-  EXPECT_EQ(gfx::Rect(800, 120, 200, 300),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(534, -80, 200, 300)));
-  EXPECT_EQ(gfx::Rect(1253, 496, 100, 200),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(987, 296, 100, 200)));
+  EXPECT_EQ(
+      gfx::Rect(800, 120, 200, 300),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(534, -80, 200, 300)));
+  EXPECT_EQ(
+      gfx::Rect(1253, 496, 100, 200),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(987, 296, 100, 200)));
 
-  EXPECT_EQ(gfx::Rect(780, 200, 100, 100),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(514, 0, 100, 100)));
+  EXPECT_EQ(
+      gfx::Rect(780, 200, 100, 100),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(514, 0, 100, 100)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1_5x1x, ClientToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 34, 67),
-            ScreenWin::ClientToDIPRect(left_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(168, 330, 28, 36),
-            ScreenWin::ClientToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
+  EXPECT_EQ(gfx::Rect(0, 0, 34, 67), GetScreenWin()->ClientToDIPRect(
+                                         left_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(168, 330, 28, 36),
+      GetScreenWin()->ClientToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
 
   HWND right_hwnd = GetRightFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::ClientToDIPRect(right_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(253, 496, 41, 52),
-            ScreenWin::ClientToDIPRect(right_hwnd,
-                                       gfx::Rect(253, 496, 41, 52)));
+  EXPECT_EQ(
+      gfx::Rect(0, 0, 50, 100),
+      GetScreenWin()->ClientToDIPRect(right_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(253, 496, 41, 52),
+      GetScreenWin()->ClientToDIPRect(right_hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1_5x1x, DIPToClientRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 51, 101),
-            ScreenWin::DIPToClientRect(left_hwnd, gfx::Rect(0, 0, 34, 67)));
-  EXPECT_EQ(gfx::Rect(252, 495, 42, 54),
-            ScreenWin::DIPToClientRect(left_hwnd, gfx::Rect(168, 330, 28, 36)));
+  EXPECT_EQ(gfx::Rect(0, 0, 51, 101), GetScreenWin()->DIPToClientRect(
+                                          left_hwnd, gfx::Rect(0, 0, 34, 67)));
+  EXPECT_EQ(
+      gfx::Rect(252, 495, 42, 54),
+      GetScreenWin()->DIPToClientRect(left_hwnd, gfx::Rect(168, 330, 28, 36)));
 
   HWND right_hwnd = GetRightFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToClientRect(right_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(253, 496, 41, 52),
-            ScreenWin::DIPToClientRect(right_hwnd,
-                                       gfx::Rect(253, 496, 41, 52)));
+  EXPECT_EQ(
+      gfx::Rect(0, 0, 50, 100),
+      GetScreenWin()->DIPToClientRect(right_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(253, 496, 41, 52),
+      GetScreenWin()->DIPToClientRect(right_hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1_5x1x, ScreenToDIPSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(28, 88),
-            ScreenWin::ScreenToDIPSize(left_hwnd, gfx::Size(42, 131)));
+            GetScreenWin()->ScreenToDIPSize(left_hwnd, gfx::Size(42, 131)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Size(42, 131),
-            ScreenWin::ScreenToDIPSize(right_hwnd, gfx::Size(42, 131)));
+            GetScreenWin()->ScreenToDIPSize(right_hwnd, gfx::Size(42, 131)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1_5x1x, DIPToScreenSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(42, 131),
-            ScreenWin::DIPToScreenSize(left_hwnd, gfx::Size(28, 87)));
+            GetScreenWin()->DIPToScreenSize(left_hwnd, gfx::Size(28, 87)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Size(42, 131),
-            ScreenWin::DIPToScreenSize(right_hwnd, gfx::Size(42, 131)));
+            GetScreenWin()->DIPToScreenSize(right_hwnd, gfx::Size(42, 131)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1_5x1x, GetSystemMetricsInDIP) {
-  EXPECT_EQ(21, ScreenWin::GetSystemMetricsInDIP(31));
-  EXPECT_EQ(28, ScreenWin::GetSystemMetricsInDIP(42));
+  EXPECT_EQ(21, GetScreenWin()->GetSystemMetricsInDIP(31));
+  EXPECT_EQ(28, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1_5x1x, GetScaleFactorForHWND) {
-  EXPECT_EQ(1.5, ScreenWin::GetScaleFactorForHWND(GetLeftFakeHwnd()));
-  EXPECT_EQ(1.0, ScreenWin::GetScaleFactorForHWND(GetRightFakeHwnd()));
+  EXPECT_EQ(1.5, GetScreenWin()->GetScaleFactorForHWND(GetLeftFakeHwnd()));
+  EXPECT_EQ(1.0, GetScreenWin()->GetScaleFactorForHWND(GetRightFakeHwnd()));
 }
 
 TEST_F(ScreenWinTestTwoDisplays1_5x1x, GetDisplays) {
@@ -2988,185 +3044,195 @@
 
 TEST_F(ScreenWinTestTwoDisplays2x1x, ScreenToDIPPoints) {
   expect_point_f_eq(gfx::PointF(0, 0),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(0, 0)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(182.5, 347),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(365, 694)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(365, 694)));
   expect_point_f_eq(gfx::PointF(959.5, 599.5),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(1919, 1199)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1919, 1199)));
 
   expect_point_f_eq(gfx::PointF(960, 0),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(1920, 0)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1920, 0)));
   expect_point_f_eq(gfx::PointF(1424, 351),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(2384, 351)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(2384, 351)));
   expect_point_f_eq(gfx::PointF(1759, 599),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(2719, 599)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(2719, 599)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1x, DIPToScreenPoints) {
-  EXPECT_EQ(gfx::Point(0, 0), ScreenWin::DIPToScreenPoint(gfx::Point(0, 0)));
+  EXPECT_EQ(gfx::Point(0, 0),
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 694),
-            ScreenWin::DIPToScreenPoint(gfx::Point(182, 347)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(182, 347)));
   EXPECT_EQ(gfx::Point(1918, 1198),
-            ScreenWin::DIPToScreenPoint(gfx::Point(959, 599)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(959, 599)));
 
   EXPECT_EQ(gfx::Point(1920, 0),
-            ScreenWin::DIPToScreenPoint(gfx::Point(960, 0)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(960, 0)));
   EXPECT_EQ(gfx::Point(2384, 351),
-            ScreenWin::DIPToScreenPoint(gfx::Point(1424, 351)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(1424, 351)));
   EXPECT_EQ(gfx::Point(2719, 599),
-            ScreenWin::DIPToScreenPoint(gfx::Point(1759, 599)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(1759, 599)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1x, ClientToDIPPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::ClientToDIPPoint(left_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->ClientToDIPPoint(left_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(182, 347),
-            ScreenWin::ClientToDIPPoint(left_hwnd, gfx::Point(365, 694)));
-  EXPECT_EQ(gfx::Point(959, 599),
-            ScreenWin::ClientToDIPPoint(left_hwnd, gfx::Point(1919, 1199)));
+            GetScreenWin()->ClientToDIPPoint(left_hwnd, gfx::Point(365, 694)));
+  EXPECT_EQ(gfx::Point(959, 599), GetScreenWin()->ClientToDIPPoint(
+                                      left_hwnd, gfx::Point(1919, 1199)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::ClientToDIPPoint(right_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->ClientToDIPPoint(right_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(365, 694),
-            ScreenWin::ClientToDIPPoint(right_hwnd, gfx::Point(365, 694)));
-  EXPECT_EQ(gfx::Point(1919, 1199),
-            ScreenWin::ClientToDIPPoint(right_hwnd, gfx::Point(1919, 1199)));
+            GetScreenWin()->ClientToDIPPoint(right_hwnd, gfx::Point(365, 694)));
+  EXPECT_EQ(gfx::Point(1919, 1199), GetScreenWin()->ClientToDIPPoint(
+                                        right_hwnd, gfx::Point(1919, 1199)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1x, DIPToClientPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::DIPToClientPoint(left_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 694),
-            ScreenWin::DIPToClientPoint(left_hwnd, gfx::Point(182, 347)));
+            GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(182, 347)));
   EXPECT_EQ(gfx::Point(1918, 1198),
-            ScreenWin::DIPToClientPoint(left_hwnd, gfx::Point(959, 599)));
+            GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(959, 599)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::DIPToClientPoint(right_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->DIPToClientPoint(right_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(365, 694),
-            ScreenWin::DIPToClientPoint(right_hwnd, gfx::Point(365, 694)));
-  EXPECT_EQ(gfx::Point(1919, 1199),
-            ScreenWin::DIPToClientPoint(right_hwnd, gfx::Point(1919, 1199)));
+            GetScreenWin()->DIPToClientPoint(right_hwnd, gfx::Point(365, 694)));
+  EXPECT_EQ(gfx::Point(1919, 1199), GetScreenWin()->DIPToClientPoint(
+                                        right_hwnd, gfx::Point(1919, 1199)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1x, ScreenToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
-            ScreenWin::ScreenToDIPRect(left_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(126, 248, 21, 26),
-            ScreenWin::ScreenToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
+  EXPECT_EQ(gfx::Rect(0, 0, 25, 50), GetScreenWin()->ScreenToDIPRect(
+                                         left_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(126, 248, 21, 26),
+      GetScreenWin()->ScreenToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Rect(960, 0, 200, 300),
-            ScreenWin::ScreenToDIPRect(right_hwnd,
-                                       gfx::Rect(1920, 0, 200, 300)));
+            GetScreenWin()->ScreenToDIPRect(right_hwnd,
+                                            gfx::Rect(1920, 0, 200, 300)));
   EXPECT_EQ(gfx::Rect(1040, 496, 100, 200),
-            ScreenWin::ScreenToDIPRect(right_hwnd,
-                                       gfx::Rect(2000, 496, 100, 200)));
+            GetScreenWin()->ScreenToDIPRect(right_hwnd,
+                                            gfx::Rect(2000, 496, 100, 200)));
 
   EXPECT_EQ(gfx::Rect(940, 200, 100, 100),
-        ScreenWin::ScreenToDIPRect(right_hwnd,
-                                   gfx::Rect(1900, 200, 100, 100)));
+            GetScreenWin()->ScreenToDIPRect(right_hwnd,
+                                            gfx::Rect(1900, 200, 100, 100)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1x, DIPToScreenRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToScreenRect(left_hwnd, gfx::Rect(0, 0, 25, 50)));
-  EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToScreenRect(left_hwnd, gfx::Rect(126, 248, 21, 26)));
+  EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToScreenRect(
+                                          left_hwnd, gfx::Rect(0, 0, 25, 50)));
+  EXPECT_EQ(
+      gfx::Rect(252, 496, 42, 52),
+      GetScreenWin()->DIPToScreenRect(left_hwnd, gfx::Rect(126, 248, 21, 26)));
 
   HWND right_hwnd = GetRightFakeHwnd();
-  EXPECT_EQ(gfx::Rect(1920, 0, 200, 300),
-            ScreenWin::DIPToScreenRect(right_hwnd,
-                                       gfx::Rect(960, 0, 200, 300)));
+  EXPECT_EQ(
+      gfx::Rect(1920, 0, 200, 300),
+      GetScreenWin()->DIPToScreenRect(right_hwnd, gfx::Rect(960, 0, 200, 300)));
   EXPECT_EQ(gfx::Rect(2000, 496, 100, 200),
-            ScreenWin::DIPToScreenRect(right_hwnd,
-                                       gfx::Rect(1040, 496, 100, 200)));
+            GetScreenWin()->DIPToScreenRect(right_hwnd,
+                                            gfx::Rect(1040, 496, 100, 200)));
 
   EXPECT_EQ(gfx::Rect(1900, 200, 100, 100),
-        ScreenWin::DIPToScreenRect(right_hwnd,
-                                   gfx::Rect(940, 200, 100, 100)));
+            GetScreenWin()->DIPToScreenRect(right_hwnd,
+                                            gfx::Rect(940, 200, 100, 100)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1x, DIPToScreenRectNullHWND) {
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
-  EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(126, 248, 21, 26)));
+            GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
+  EXPECT_EQ(
+      gfx::Rect(252, 496, 42, 52),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(126, 248, 21, 26)));
 
-  EXPECT_EQ(gfx::Rect(1920, 0, 200, 300),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(960, 0, 200, 300)));
+  EXPECT_EQ(
+      gfx::Rect(1920, 0, 200, 300),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(960, 0, 200, 300)));
   EXPECT_EQ(
       gfx::Rect(2000, 496, 100, 200),
-      ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(1040, 496, 100, 200)));
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(1040, 496, 100, 200)));
 
-  EXPECT_EQ(gfx::Rect(1900, 200, 100, 100),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(940, 200, 100, 100)));
+  EXPECT_EQ(
+      gfx::Rect(1900, 200, 100, 100),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(940, 200, 100, 100)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1x, ClientToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
-            ScreenWin::ClientToDIPRect(left_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(126, 248, 21, 26),
-            ScreenWin::ClientToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
+  EXPECT_EQ(gfx::Rect(0, 0, 25, 50), GetScreenWin()->ClientToDIPRect(
+                                         left_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(126, 248, 21, 26),
+      GetScreenWin()->ClientToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
 
   HWND right_hwnd = GetRightFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::ClientToDIPRect(right_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(253, 496, 41, 52),
-            ScreenWin::ClientToDIPRect(right_hwnd,
-                                       gfx::Rect(253, 496, 41, 52)));
+  EXPECT_EQ(
+      gfx::Rect(0, 0, 50, 100),
+      GetScreenWin()->ClientToDIPRect(right_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(253, 496, 41, 52),
+      GetScreenWin()->ClientToDIPRect(right_hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1x, DIPToClientRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToClientRect(left_hwnd, gfx::Rect(0, 0, 25, 50)));
-  EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToClientRect(left_hwnd, gfx::Rect(126, 248, 21, 26)));
+  EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToClientRect(
+                                          left_hwnd, gfx::Rect(0, 0, 25, 50)));
+  EXPECT_EQ(
+      gfx::Rect(252, 496, 42, 52),
+      GetScreenWin()->DIPToClientRect(left_hwnd, gfx::Rect(126, 248, 21, 26)));
 
   HWND right_hwnd = GetRightFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToClientRect(right_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(253, 496, 41, 52),
-            ScreenWin::DIPToClientRect(right_hwnd,
-                                       gfx::Rect(253, 496, 41, 52)));
+  EXPECT_EQ(
+      gfx::Rect(0, 0, 50, 100),
+      GetScreenWin()->DIPToClientRect(right_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(253, 496, 41, 52),
+      GetScreenWin()->DIPToClientRect(right_hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1x, ScreenToDIPSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(21, 66),
-            ScreenWin::ScreenToDIPSize(left_hwnd, gfx::Size(42, 131)));
+            GetScreenWin()->ScreenToDIPSize(left_hwnd, gfx::Size(42, 131)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Size(42, 131),
-            ScreenWin::ScreenToDIPSize(right_hwnd, gfx::Size(42, 131)));
+            GetScreenWin()->ScreenToDIPSize(right_hwnd, gfx::Size(42, 131)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1x, DIPToScreenSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(42, 132),
-            ScreenWin::DIPToScreenSize(left_hwnd, gfx::Size(21, 66)));
+            GetScreenWin()->DIPToScreenSize(left_hwnd, gfx::Size(21, 66)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Size(42, 131),
-            ScreenWin::DIPToScreenSize(right_hwnd, gfx::Size(42, 131)));
+            GetScreenWin()->DIPToScreenSize(right_hwnd, gfx::Size(42, 131)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1x, GetSystemMetricsInDIP) {
-  EXPECT_EQ(16, ScreenWin::GetSystemMetricsInDIP(31));
-  EXPECT_EQ(21, ScreenWin::GetSystemMetricsInDIP(42));
+  EXPECT_EQ(16, GetScreenWin()->GetSystemMetricsInDIP(31));
+  EXPECT_EQ(21, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1x, GetScaleFactorForHWND) {
-  EXPECT_EQ(2.0, ScreenWin::GetScaleFactorForHWND(GetLeftFakeHwnd()));
-  EXPECT_EQ(1.0, ScreenWin::GetScaleFactorForHWND(GetRightFakeHwnd()));
+  EXPECT_EQ(2.0, GetScreenWin()->GetScaleFactorForHWND(GetLeftFakeHwnd()));
+  EXPECT_EQ(1.0, GetScreenWin()->GetScaleFactorForHWND(GetRightFakeHwnd()));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1x, GetDisplays) {
@@ -3283,184 +3349,193 @@
 
 TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, ScreenToDIPPoints) {
   expect_point_f_eq(gfx::PointF(0, 0),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(0, 0)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(182.5, 347),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(365, 694)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(365, 694)));
   expect_point_f_eq(gfx::PointF(1599.5, 799.5),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(3199, 1599)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(3199, 1599)));
 
   expect_point_f_eq(gfx::PointF(3200, 0),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(6400, 0)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(6400, 0)));
   expect_point_f_eq(gfx::PointF(4192, 175.5),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(8384, 351)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(8384, 351)));
   expect_point_f_eq(gfx::PointF(5119.5, 1199.5),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(10239, 2399)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(10239, 2399)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToScreenPoints) {
-  EXPECT_EQ(gfx::Point(0, 0), ScreenWin::DIPToScreenPoint(gfx::Point(0, 0)));
+  EXPECT_EQ(gfx::Point(0, 0),
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 694),
-            ScreenWin::DIPToScreenPoint(gfx::Point(182, 347)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(182, 347)));
   EXPECT_EQ(gfx::Point(3198, 1598),
-            ScreenWin::DIPToScreenPoint(gfx::Point(1599, 799)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(1599, 799)));
 
   EXPECT_EQ(gfx::Point(6400, 0),
-            ScreenWin::DIPToScreenPoint(gfx::Point(3200, 0)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(3200, 0)));
   EXPECT_EQ(gfx::Point(8384, 350),
-            ScreenWin::DIPToScreenPoint(gfx::Point(4192, 175)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(4192, 175)));
   EXPECT_EQ(gfx::Point(10238, 2398),
-            ScreenWin::DIPToScreenPoint(gfx::Point(5119, 1199)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(5119, 1199)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, ClientToDIPPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::ClientToDIPPoint(left_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->ClientToDIPPoint(left_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(182, 347),
-            ScreenWin::ClientToDIPPoint(left_hwnd, gfx::Point(365, 694)));
-  EXPECT_EQ(gfx::Point(959, 599),
-            ScreenWin::ClientToDIPPoint(left_hwnd, gfx::Point(1919, 1199)));
+            GetScreenWin()->ClientToDIPPoint(left_hwnd, gfx::Point(365, 694)));
+  EXPECT_EQ(gfx::Point(959, 599), GetScreenWin()->ClientToDIPPoint(
+                                      left_hwnd, gfx::Point(1919, 1199)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::ClientToDIPPoint(right_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->ClientToDIPPoint(right_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(182, 347),
-            ScreenWin::ClientToDIPPoint(right_hwnd, gfx::Point(365, 694)));
-  EXPECT_EQ(gfx::Point(959, 599),
-            ScreenWin::ClientToDIPPoint(right_hwnd, gfx::Point(1919, 1199)));
+            GetScreenWin()->ClientToDIPPoint(right_hwnd, gfx::Point(365, 694)));
+  EXPECT_EQ(gfx::Point(959, 599), GetScreenWin()->ClientToDIPPoint(
+                                      right_hwnd, gfx::Point(1919, 1199)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToClientPoints) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::DIPToClientPoint(left_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 694),
-            ScreenWin::DIPToClientPoint(left_hwnd, gfx::Point(182, 347)));
+            GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(182, 347)));
   EXPECT_EQ(gfx::Point(1918, 1198),
-            ScreenWin::DIPToClientPoint(left_hwnd, gfx::Point(959, 599)));
+            GetScreenWin()->DIPToClientPoint(left_hwnd, gfx::Point(959, 599)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::DIPToClientPoint(right_hwnd, gfx::Point(0, 0)));
+            GetScreenWin()->DIPToClientPoint(right_hwnd, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 694),
-            ScreenWin::DIPToClientPoint(right_hwnd, gfx::Point(182, 347)));
+            GetScreenWin()->DIPToClientPoint(right_hwnd, gfx::Point(182, 347)));
   EXPECT_EQ(gfx::Point(1918, 1198),
-            ScreenWin::DIPToClientPoint(right_hwnd, gfx::Point(959, 599)));
+            GetScreenWin()->DIPToClientPoint(right_hwnd, gfx::Point(959, 599)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, ScreenToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
-            ScreenWin::ScreenToDIPRect(left_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(126, 248, 21, 26),
-            ScreenWin::ScreenToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
+  EXPECT_EQ(gfx::Rect(0, 0, 25, 50), GetScreenWin()->ScreenToDIPRect(
+                                         left_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(126, 248, 21, 26),
+      GetScreenWin()->ScreenToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Rect(3200, 0, 100, 150),
-            ScreenWin::ScreenToDIPRect(right_hwnd,
-                                       gfx::Rect(6400, 0, 200, 300)));
+            GetScreenWin()->ScreenToDIPRect(right_hwnd,
+                                            gfx::Rect(6400, 0, 200, 300)));
   EXPECT_EQ(gfx::Rect(3500, 248, 50, 100),
-            ScreenWin::ScreenToDIPRect(right_hwnd,
-                                       gfx::Rect(7000, 496, 100, 200)));
+            GetScreenWin()->ScreenToDIPRect(right_hwnd,
+                                            gfx::Rect(7000, 496, 100, 200)));
 
   EXPECT_EQ(gfx::Rect(3190, 100, 50, 50),
-      ScreenWin::ScreenToDIPRect(right_hwnd,
-                                 gfx::Rect(6380, 200, 100, 100)));
+            GetScreenWin()->ScreenToDIPRect(right_hwnd,
+                                            gfx::Rect(6380, 200, 100, 100)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToScreenRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToScreenRect(left_hwnd, gfx::Rect(0, 0, 25, 50)));
-  EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToScreenRect(left_hwnd, gfx::Rect(126, 248, 21, 26)));
+  EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToScreenRect(
+                                          left_hwnd, gfx::Rect(0, 0, 25, 50)));
+  EXPECT_EQ(
+      gfx::Rect(252, 496, 42, 52),
+      GetScreenWin()->DIPToScreenRect(left_hwnd, gfx::Rect(126, 248, 21, 26)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Rect(6400, 0, 200, 300),
-            ScreenWin::DIPToScreenRect(right_hwnd,
-                                       gfx::Rect(3200, 0, 100, 150)));
+            GetScreenWin()->DIPToScreenRect(right_hwnd,
+                                            gfx::Rect(3200, 0, 100, 150)));
   EXPECT_EQ(gfx::Rect(7000, 496, 100, 200),
-            ScreenWin::DIPToScreenRect(right_hwnd,
-                                       gfx::Rect(3500, 248, 50, 100)));
+            GetScreenWin()->DIPToScreenRect(right_hwnd,
+                                            gfx::Rect(3500, 248, 50, 100)));
 
   EXPECT_EQ(gfx::Rect(6380, 200, 100, 100),
-      ScreenWin::DIPToScreenRect(right_hwnd,
-                                 gfx::Rect(3190, 100, 50, 50)));
+            GetScreenWin()->DIPToScreenRect(right_hwnd,
+                                            gfx::Rect(3190, 100, 50, 50)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToScreenRectNullHWND) {
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
-  EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(126, 248, 21, 26)));
+            GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
+  EXPECT_EQ(
+      gfx::Rect(252, 496, 42, 52),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(126, 248, 21, 26)));
 
-  EXPECT_EQ(gfx::Rect(6400, 0, 200, 300),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(3200, 0, 100, 150)));
-  EXPECT_EQ(gfx::Rect(7000, 496, 100, 200),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(3500, 248, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(6400, 0, 200, 300),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(3200, 0, 100, 150)));
+  EXPECT_EQ(
+      gfx::Rect(7000, 496, 100, 200),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(3500, 248, 50, 100)));
 
-  EXPECT_EQ(gfx::Rect(6380, 200, 100, 100),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(3190, 100, 50, 50)));
+  EXPECT_EQ(
+      gfx::Rect(6380, 200, 100, 100),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(3190, 100, 50, 50)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, ClientToDIPRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
-            ScreenWin::ClientToDIPRect(left_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(126, 248, 21, 26),
-            ScreenWin::ClientToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
+  EXPECT_EQ(gfx::Rect(0, 0, 25, 50), GetScreenWin()->ClientToDIPRect(
+                                         left_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(126, 248, 21, 26),
+      GetScreenWin()->ClientToDIPRect(left_hwnd, gfx::Rect(253, 496, 41, 52)));
 
   HWND right_hwnd = GetRightFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
-            ScreenWin::ClientToDIPRect(right_hwnd, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(126, 248, 21, 26),
-            ScreenWin::ClientToDIPRect(right_hwnd,
-                                       gfx::Rect(253, 496, 41, 52)));
+  EXPECT_EQ(gfx::Rect(0, 0, 25, 50), GetScreenWin()->ClientToDIPRect(
+                                         right_hwnd, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(126, 248, 21, 26),
+      GetScreenWin()->ClientToDIPRect(right_hwnd, gfx::Rect(253, 496, 41, 52)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToClientRects) {
   HWND left_hwnd = GetLeftFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToClientRect(left_hwnd, gfx::Rect(0, 0, 25, 50)));
-  EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToClientRect(left_hwnd, gfx::Rect(126, 248, 21, 26)));
+  EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToClientRect(
+                                          left_hwnd, gfx::Rect(0, 0, 25, 50)));
+  EXPECT_EQ(
+      gfx::Rect(252, 496, 42, 52),
+      GetScreenWin()->DIPToClientRect(left_hwnd, gfx::Rect(126, 248, 21, 26)));
 
   HWND right_hwnd = GetRightFakeHwnd();
-  EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToClientRect(right_hwnd, gfx::Rect(0, 0, 25, 50)));
-  EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToClientRect(right_hwnd,
-                                       gfx::Rect(126, 248, 21, 26)));
+  EXPECT_EQ(gfx::Rect(0, 0, 50, 100), GetScreenWin()->DIPToClientRect(
+                                          right_hwnd, gfx::Rect(0, 0, 25, 50)));
+  EXPECT_EQ(
+      gfx::Rect(252, 496, 42, 52),
+      GetScreenWin()->DIPToClientRect(right_hwnd, gfx::Rect(126, 248, 21, 26)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, ScreenToDIPSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(21, 66),
-            ScreenWin::ScreenToDIPSize(left_hwnd, gfx::Size(42, 131)));
+            GetScreenWin()->ScreenToDIPSize(left_hwnd, gfx::Size(42, 131)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Size(21, 66),
-            ScreenWin::ScreenToDIPSize(right_hwnd, gfx::Size(42, 131)));
+            GetScreenWin()->ScreenToDIPSize(right_hwnd, gfx::Size(42, 131)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, DIPToScreenSize) {
   HWND left_hwnd = GetLeftFakeHwnd();
   EXPECT_EQ(gfx::Size(42, 132),
-            ScreenWin::DIPToScreenSize(left_hwnd, gfx::Size(21, 66)));
+            GetScreenWin()->DIPToScreenSize(left_hwnd, gfx::Size(21, 66)));
 
   HWND right_hwnd = GetRightFakeHwnd();
   EXPECT_EQ(gfx::Size(42, 132),
-            ScreenWin::DIPToScreenSize(right_hwnd, gfx::Size(21, 66)));
+            GetScreenWin()->DIPToScreenSize(right_hwnd, gfx::Size(21, 66)));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, GetSystemMetricsInDIP) {
-  EXPECT_EQ(16, ScreenWin::GetSystemMetricsInDIP(31));
-  EXPECT_EQ(21, ScreenWin::GetSystemMetricsInDIP(42));
+  EXPECT_EQ(16, GetScreenWin()->GetSystemMetricsInDIP(31));
+  EXPECT_EQ(21, GetScreenWin()->GetSystemMetricsInDIP(42));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, GetScaleFactorForHWND) {
-  EXPECT_EQ(2.0, ScreenWin::GetScaleFactorForHWND(GetLeftFakeHwnd()));
-  EXPECT_EQ(2.0, ScreenWin::GetScaleFactorForHWND(GetRightFakeHwnd()));
+  EXPECT_EQ(2.0, GetScreenWin()->GetScaleFactorForHWND(GetLeftFakeHwnd()));
+  EXPECT_EQ(2.0, GetScreenWin()->GetScaleFactorForHWND(GetRightFakeHwnd()));
 }
 
 TEST_F(ScreenWinTestTwoDisplays2x1xVirtualized, GetDisplays) {
@@ -3552,6 +3627,7 @@
   }
 
   void TearDown() override {
+    ScreenWin::ResetFallbackScreenForTesting();
     Display::ResetForceDeviceScaleFactorForTesting();
     testing::Test::TearDown();
   }
@@ -3563,84 +3639,86 @@
   gfx::PointF origin(0, 0);
   gfx::PointF middle(365, 694);
   gfx::PointF lower_right(1919, 1199);
-  EXPECT_EQ(origin, ScreenWin::ScreenToDIPPoint(origin));
-  EXPECT_EQ(middle, ScreenWin::ScreenToDIPPoint(middle));
-  EXPECT_EQ(lower_right, ScreenWin::ScreenToDIPPoint(lower_right));
+  EXPECT_EQ(origin, GetScreenWin()->ScreenToDIPPoint(origin));
+  EXPECT_EQ(middle, GetScreenWin()->ScreenToDIPPoint(middle));
+  EXPECT_EQ(lower_right, GetScreenWin()->ScreenToDIPPoint(lower_right));
 }
 
 TEST_F(ScreenWinUninitializedForced1x, DIPToScreenPoints) {
   gfx::Point origin(0, 0);
   gfx::Point middle(365, 694);
   gfx::Point lower_right(1919, 1199);
-  EXPECT_EQ(origin, ScreenWin::DIPToScreenPoint(origin));
-  EXPECT_EQ(middle, ScreenWin::DIPToScreenPoint(middle));
-  EXPECT_EQ(lower_right, ScreenWin::DIPToScreenPoint(lower_right));
+  EXPECT_EQ(origin, GetScreenWin()->DIPToScreenPoint(origin));
+  EXPECT_EQ(middle, GetScreenWin()->DIPToScreenPoint(middle));
+  EXPECT_EQ(lower_right, GetScreenWin()->DIPToScreenPoint(lower_right));
 }
 
 TEST_F(ScreenWinUninitializedForced1x, ClientToDIPPoints) {
   gfx::Point origin(0, 0);
   gfx::Point middle(365, 694);
   gfx::Point lower_right(1919, 1199);
-  EXPECT_EQ(origin, ScreenWin::ClientToDIPPoint(nullptr, origin));
-  EXPECT_EQ(middle, ScreenWin::ClientToDIPPoint(nullptr, middle));
-  EXPECT_EQ(lower_right, ScreenWin::ClientToDIPPoint(nullptr, lower_right));
+  EXPECT_EQ(origin, GetScreenWin()->ClientToDIPPoint(nullptr, origin));
+  EXPECT_EQ(middle, GetScreenWin()->ClientToDIPPoint(nullptr, middle));
+  EXPECT_EQ(lower_right,
+            GetScreenWin()->ClientToDIPPoint(nullptr, lower_right));
 }
 
 TEST_F(ScreenWinUninitializedForced1x, DIPToClientPoints) {
   gfx::Point origin(0, 0);
   gfx::Point middle(365, 694);
   gfx::Point lower_right(1919, 1199);
-  EXPECT_EQ(origin, ScreenWin::DIPToClientPoint(nullptr, origin));
-  EXPECT_EQ(middle, ScreenWin::DIPToClientPoint(nullptr, middle));
-  EXPECT_EQ(lower_right, ScreenWin::DIPToClientPoint(nullptr, lower_right));
+  EXPECT_EQ(origin, GetScreenWin()->DIPToClientPoint(nullptr, origin));
+  EXPECT_EQ(middle, GetScreenWin()->DIPToClientPoint(nullptr, middle));
+  EXPECT_EQ(lower_right,
+            GetScreenWin()->DIPToClientPoint(nullptr, lower_right));
 }
 
 TEST_F(ScreenWinUninitializedForced1x, ScreenToDIPRects) {
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
-  EXPECT_EQ(origin, ScreenWin::ScreenToDIPRect(nullptr, origin));
-  EXPECT_EQ(middle, ScreenWin::ScreenToDIPRect(nullptr, middle));
+  EXPECT_EQ(origin, GetScreenWin()->ScreenToDIPRect(nullptr, origin));
+  EXPECT_EQ(middle, GetScreenWin()->ScreenToDIPRect(nullptr, middle));
 }
 
 TEST_F(ScreenWinUninitializedForced1x, DIPToScreenRects) {
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
-  EXPECT_EQ(origin, ScreenWin::DIPToScreenRect(nullptr, origin));
-  EXPECT_EQ(middle, ScreenWin::DIPToScreenRect(nullptr, middle));
+  EXPECT_EQ(origin, GetScreenWin()->DIPToScreenRect(nullptr, origin));
+  EXPECT_EQ(middle, GetScreenWin()->DIPToScreenRect(nullptr, middle));
 }
 
 TEST_F(ScreenWinUninitializedForced1x, ClientToDIPRects) {
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
-  EXPECT_EQ(origin, ScreenWin::ClientToDIPRect(nullptr, origin));
-  EXPECT_EQ(middle, ScreenWin::ClientToDIPRect(nullptr, middle));
+  EXPECT_EQ(origin, GetScreenWin()->ClientToDIPRect(nullptr, origin));
+  EXPECT_EQ(middle, GetScreenWin()->ClientToDIPRect(nullptr, middle));
 }
 
 TEST_F(ScreenWinUninitializedForced1x, DIPToClientRects) {
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
-  EXPECT_EQ(origin, ScreenWin::DIPToClientRect(nullptr, origin));
-  EXPECT_EQ(middle, ScreenWin::DIPToClientRect(nullptr, middle));
+  EXPECT_EQ(origin, GetScreenWin()->DIPToClientRect(nullptr, origin));
+  EXPECT_EQ(middle, GetScreenWin()->DIPToClientRect(nullptr, middle));
 }
 
 TEST_F(ScreenWinUninitializedForced1x, ScreenToDIPSize) {
   gfx::Size size(42, 131);
-  EXPECT_EQ(size, ScreenWin::ScreenToDIPSize(nullptr, size));
+  EXPECT_EQ(size, GetScreenWin()->ScreenToDIPSize(nullptr, size));
 }
 
 TEST_F(ScreenWinUninitializedForced1x, DIPToScreenSize) {
   gfx::Size size(42, 131);
-  EXPECT_EQ(size, ScreenWin::DIPToScreenSize(nullptr, size));
+  EXPECT_EQ(size, GetScreenWin()->DIPToScreenSize(nullptr, size));
 }
 
 TEST_F(ScreenWinUninitializedForced1x, GetSystemMetricsInDIP) {
   // GetSystemMetricsInDIP falls back to the system's GetSystemMetrics, so this
   // test is to make sure we don't crash.
-  ScreenWin::GetSystemMetricsInDIP(SM_CXSIZEFRAME);
+  GetScreenWin()->GetSystemMetricsInDIP(SM_CXSIZEFRAME);
 }
 
 TEST_F(ScreenWinUninitializedForced1x, GetScaleFactorForHWND) {
-  EXPECT_EQ(1.0, ScreenWin::GetScaleFactorForHWND(nullptr));
+  EXPECT_EQ(1.0, GetScreenWin()->GetScaleFactorForHWND(nullptr));
 }
 
 namespace {
@@ -3662,6 +3740,7 @@
   }
 
   void TearDown() override {
+    ScreenWin::ResetFallbackScreenForTesting();
     Display::ResetForceDeviceScaleFactorForTesting();
     testing::Test::TearDown();
   }
@@ -3671,85 +3750,90 @@
 
 TEST_F(ScreenWinUninitializedForced2x, ScreenToDIPPoints) {
   expect_point_f_eq(gfx::PointF(0, 0),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(0, 0)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(0, 0)));
   expect_point_f_eq(gfx::PointF(182.5, 347),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(365, 694)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(365, 694)));
   expect_point_f_eq(gfx::PointF(959.5, 599.5),
-                    ScreenWin::ScreenToDIPPoint(gfx::PointF(1919, 1199)));
+                    GetScreenWin()->ScreenToDIPPoint(gfx::PointF(1919, 1199)));
 }
 
 TEST_F(ScreenWinUninitializedForced2x, DIPToScreenPoints) {
-  EXPECT_EQ(gfx::Point(0, 0), ScreenWin::DIPToScreenPoint(gfx::Point(0, 0)));
+  EXPECT_EQ(gfx::Point(0, 0),
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 694),
-            ScreenWin::DIPToScreenPoint(gfx::Point(182, 347)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(182, 347)));
   EXPECT_EQ(gfx::Point(1918, 1198),
-            ScreenWin::DIPToScreenPoint(gfx::Point(959, 599)));
+            GetScreenWin()->DIPToScreenPoint(gfx::Point(959, 599)));
 }
 
 TEST_F(ScreenWinUninitializedForced2x, ClientToDIPPoints) {
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::ClientToDIPPoint(nullptr, gfx::Point(0, 0)));
+            GetScreenWin()->ClientToDIPPoint(nullptr, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(182, 347),
-            ScreenWin::ClientToDIPPoint(nullptr, gfx::Point(365, 694)));
+            GetScreenWin()->ClientToDIPPoint(nullptr, gfx::Point(365, 694)));
   EXPECT_EQ(gfx::Point(959, 599),
-            ScreenWin::ClientToDIPPoint(nullptr, gfx::Point(1919, 1199)));
+            GetScreenWin()->ClientToDIPPoint(nullptr, gfx::Point(1919, 1199)));
 }
 
 TEST_F(ScreenWinUninitializedForced2x, DIPToClientPoints) {
   EXPECT_EQ(gfx::Point(0, 0),
-            ScreenWin::DIPToClientPoint(nullptr, gfx::Point(0, 0)));
+            GetScreenWin()->DIPToClientPoint(nullptr, gfx::Point(0, 0)));
   EXPECT_EQ(gfx::Point(364, 694),
-            ScreenWin::DIPToClientPoint(nullptr, gfx::Point(182, 347)));
+            GetScreenWin()->DIPToClientPoint(nullptr, gfx::Point(182, 347)));
   EXPECT_EQ(gfx::Point(1918, 1198),
-            ScreenWin::DIPToClientPoint(nullptr, gfx::Point(959, 599)));
+            GetScreenWin()->DIPToClientPoint(nullptr, gfx::Point(959, 599)));
 }
 
 TEST_F(ScreenWinUninitializedForced2x, ScreenToDIPRects) {
   EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
-            ScreenWin::ScreenToDIPRect(nullptr, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(126, 248, 21, 26),
-            ScreenWin::ScreenToDIPRect(nullptr, gfx::Rect(253, 496, 41, 52)));
+            GetScreenWin()->ScreenToDIPRect(nullptr, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(126, 248, 21, 26),
+      GetScreenWin()->ScreenToDIPRect(nullptr, gfx::Rect(253, 496, 41, 52)));
 }
 
 TEST_F(ScreenWinUninitializedForced2x, DIPToScreenRects) {
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
-  EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToScreenRect(nullptr, gfx::Rect(126, 248, 21, 26)));
+            GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(0, 0, 25, 50)));
+  EXPECT_EQ(
+      gfx::Rect(252, 496, 42, 52),
+      GetScreenWin()->DIPToScreenRect(nullptr, gfx::Rect(126, 248, 21, 26)));
 }
 
 TEST_F(ScreenWinUninitializedForced2x, ClientToDIPRects) {
   EXPECT_EQ(gfx::Rect(0, 0, 25, 50),
-            ScreenWin::ClientToDIPRect(nullptr, gfx::Rect(0, 0, 50, 100)));
-  EXPECT_EQ(gfx::Rect(126, 248, 21, 26),
-            ScreenWin::ClientToDIPRect(nullptr, gfx::Rect(253, 496, 41, 52)));
+            GetScreenWin()->ClientToDIPRect(nullptr, gfx::Rect(0, 0, 50, 100)));
+  EXPECT_EQ(
+      gfx::Rect(126, 248, 21, 26),
+      GetScreenWin()->ClientToDIPRect(nullptr, gfx::Rect(253, 496, 41, 52)));
 }
 
 TEST_F(ScreenWinUninitializedForced2x, DIPToClientRects) {
   EXPECT_EQ(gfx::Rect(0, 0, 50, 100),
-            ScreenWin::DIPToClientRect(nullptr, gfx::Rect(0, 0, 25, 50)));
-  EXPECT_EQ(gfx::Rect(252, 496, 42, 52),
-            ScreenWin::DIPToClientRect(nullptr, gfx::Rect(126, 248, 21, 26)));
+            GetScreenWin()->DIPToClientRect(nullptr, gfx::Rect(0, 0, 25, 50)));
+  EXPECT_EQ(
+      gfx::Rect(252, 496, 42, 52),
+      GetScreenWin()->DIPToClientRect(nullptr, gfx::Rect(126, 248, 21, 26)));
 }
 
 TEST_F(ScreenWinUninitializedForced2x, ScreenToDIPSize) {
   EXPECT_EQ(gfx::Size(21, 66),
-            ScreenWin::ScreenToDIPSize(nullptr, gfx::Size(42, 131)));
+            GetScreenWin()->ScreenToDIPSize(nullptr, gfx::Size(42, 131)));
 }
 
 TEST_F(ScreenWinUninitializedForced2x, DIPToScreenSize) {
   EXPECT_EQ(gfx::Size(42, 132),
-            ScreenWin::DIPToScreenSize(nullptr, gfx::Size(21, 66)));
+            GetScreenWin()->DIPToScreenSize(nullptr, gfx::Size(21, 66)));
 }
 
 TEST_F(ScreenWinUninitializedForced2x, GetSystemMetricsInDIP) {
   // This falls back to the system's GetSystemMetrics, so
   // this test is to make sure we don't crash.
-  ScreenWin::GetSystemMetricsInDIP(SM_CXSIZEFRAME);
+  GetScreenWin()->GetSystemMetricsInDIP(SM_CXSIZEFRAME);
 }
 
 TEST_F(ScreenWinUninitializedForced2x, GetScaleFactorForHWND) {
-  EXPECT_EQ(2.0, ScreenWin::GetScaleFactorForHWND(nullptr));
+  EXPECT_EQ(2.0, GetScreenWin()->GetScaleFactorForHWND(nullptr));
 }
 
 namespace {
@@ -3830,16 +3914,16 @@
   gfx::Point origin(0, 0);
   gfx::Point middle(365, 694);
   gfx::Point lower_right(1919, 1199);
-  EXPECT_EQ(origin, ScreenWin::DIPToScreenPoint(origin));
-  EXPECT_EQ(middle, ScreenWin::DIPToScreenPoint(middle));
-  EXPECT_EQ(lower_right, ScreenWin::DIPToScreenPoint(lower_right));
+  EXPECT_EQ(origin, GetScreenWin()->DIPToScreenPoint(origin));
+  EXPECT_EQ(middle, GetScreenWin()->DIPToScreenPoint(middle));
+  EXPECT_EQ(lower_right, GetScreenWin()->DIPToScreenPoint(lower_right));
 }
 
 TEST_F(ScreenWinTestNoDisplay, DIPToScreenRectNullHWND) {
   gfx::Rect origin(0, 0, 50, 100);
   gfx::Rect middle(253, 495, 41, 52);
-  EXPECT_EQ(origin, ScreenWin::DIPToScreenRect(nullptr, origin));
-  EXPECT_EQ(middle, ScreenWin::DIPToScreenRect(nullptr, middle));
+  EXPECT_EQ(origin, GetScreenWin()->DIPToScreenRect(nullptr, origin));
+  EXPECT_EQ(middle, GetScreenWin()->DIPToScreenRect(nullptr, middle));
 }
 
 // GetPrimaryDisplay should return a valid display even if there is no display.
diff --git a/ui/display/win/test/virtual_display_util_win.cc b/ui/display/win/test/virtual_display_util_win.cc
index 988703e..6abd951 100644
--- a/ui/display/win/test/virtual_display_util_win.cc
+++ b/ui/display/win/test/virtual_display_util_win.cc
@@ -215,7 +215,8 @@
     const display::Display& new_display) {
   std::vector<MonitorConfig> requested = current_config_.requested_configs();
   HMONITOR monitor = ::MonitorFromPoint(
-      win::ScreenWin::DIPToScreenPoint(new_display.work_area().CenterPoint())
+      win::GetScreenWin()
+          ->DIPToScreenPoint(new_display.work_area().CenterPoint())
           .ToPOINT(),
       MONITOR_DEFAULTTONEAREST);
   std::optional<DISPLAYCONFIG_PATH_INFO> path_info =
diff --git a/ui/events/blink/web_input_event_builders_win.cc b/ui/events/blink/web_input_event_builders_win.cc
index 44e733d..2e5a3f3 100644
--- a/ui/events/blink/web_input_event_builders_win.cc
+++ b/ui/events/blink/web_input_event_builders_win.cc
@@ -153,7 +153,7 @@
   ClientToScreen(hwnd, &global_point);
 
   // We need to convert the global point back to DIP before using it.
-  gfx::PointF dip_global_point = display::win::ScreenWin::ScreenToDIPPoint(
+  gfx::PointF dip_global_point = display::win::GetScreenWin()->ScreenToDIPPoint(
       gfx::PointF(global_point.x, global_point.y));
 
   result.SetPositionInScreen(dip_global_point.x(), dip_global_point.y());
diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn
index 428ba01..e531cb42 100644
--- a/ui/gfx/BUILD.gn
+++ b/ui/gfx/BUILD.gn
@@ -246,6 +246,8 @@
       "win/text_analysis_source.h",
       "win/window_impl.cc",
       "win/window_impl.h",
+      "win/wuc_backdrop.cc",
+      "win/wuc_backdrop.h",
     ]
   }
   if (is_apple) {
diff --git a/ui/gfx/win/wuc_backdrop.cc b/ui/gfx/win/wuc_backdrop.cc
new file mode 100644
index 0000000..ba7daf3
--- /dev/null
+++ b/ui/gfx/win/wuc_backdrop.cc
@@ -0,0 +1,149 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/gfx/win/wuc_backdrop.h"
+
+#include <dispatcherqueue.h>
+#include <windows.ui.composition.core.h>
+#include <wrl/client.h>
+
+#include "base/debug/dump_without_crashing.h"
+#include "base/logging.h"
+#include "base/scoped_native_library.h"
+#include "base/threading/sequence_local_storage_slot.h"
+#include "base/win/core_winrt_util.h"
+#include "base/win/hstring_reference.h"
+
+namespace gfx {
+
+namespace {
+using Microsoft::WRL::ComPtr;
+using CreateDispatcherQueueControllerProc =
+    decltype(&::CreateDispatcherQueueController);
+namespace WUC = ABI::Windows::UI::Composition;
+
+FARPROC LoadCoreMessagingFunction(const char* function_name) {
+  static HMODULE const handle = base::LoadSystemLibrary(L"CoreMessaging.dll");
+  return handle ? ::GetProcAddress(handle, function_name) : nullptr;
+}
+
+CreateDispatcherQueueControllerProc GetOrCreateDispatcherQueueControllerProc() {
+  static CreateDispatcherQueueControllerProc const function =
+      reinterpret_cast<CreateDispatcherQueueControllerProc>(
+          LoadCoreMessagingFunction("CreateDispatcherQueueController"));
+  return function;
+}
+
+HRESULT GetDispatcherQueueController(
+    DispatcherQueueOptions options,
+    ABI::Windows::System::IDispatcherQueueController** controller) {
+  CreateDispatcherQueueControllerProc create_dispatcher_queue_controller_func =
+      GetOrCreateDispatcherQueueControllerProc();
+  CHECK(create_dispatcher_queue_controller_func);
+  return create_dispatcher_queue_controller_func(options, controller);
+}
+
+bool EnsurePerThreadDispatcherQueueController() {
+  // Maintain one DispatcherQueueController per thread.
+  // DispatcherQueueController and its associated DispatcherQueue will be kept
+  // alive by the OS while the event loop is running.
+  static base::SequenceLocalStorageSlot<
+      Microsoft::WRL::ComPtr<ABI::Windows::System::IDispatcherQueueController>>
+      queue_controller_slot;
+
+  if (queue_controller_slot) {
+    return true;
+  }
+
+  ComPtr<ABI::Windows::System::IDispatcherQueueController> queue_controller;
+  HRESULT hr = GetDispatcherQueueController(
+      {sizeof(DispatcherQueueOptions), DQTYPE_THREAD_CURRENT, DQTAT_COM_NONE},
+      &queue_controller);
+  CHECK_EQ(hr, S_OK);
+  queue_controller_slot.emplace(std::move(queue_controller));
+  return true;
+}
+
+ComPtr<WUC::ICompositor> GetOrCreateCompositor() {
+  EnsurePerThreadDispatcherQueueController();
+  // Maintain one Compositor per thread. SequenceLocalStorageSlot is
+  // needed because ICompositor has a non-trivial destructor.
+  static base::SequenceLocalStorageSlot<ComPtr<WUC::ICompositor>>
+      compositor_slot;
+
+  if (compositor_slot) {
+    return *compositor_slot;
+  }
+
+  ComPtr<WUC::ICompositor> compositor;
+  HRESULT hr = base::win::RoActivateInstance(
+      base::win::HStringReference(
+          RuntimeClass_Windows_UI_Composition_Compositor)
+          .Get(),
+      &compositor);
+  CHECK_EQ(hr, S_OK);
+  compositor_slot.emplace(compositor);
+  return compositor;
+}
+}  // namespace
+
+WUCBackdrop::WUCBackdrop(HWND hwnd) {
+  ComPtr<WUC::ICompositor> compositor = GetOrCreateCompositor();
+
+  ComPtr<WUC::Desktop::ICompositorDesktopInterop> interop;
+  HRESULT hr = compositor.As(&interop);
+  CHECK_EQ(hr, S_OK);
+
+  hr = interop->CreateDesktopWindowTarget(hwnd, /*isTopmost=*/false,
+                                          &desktop_window_target_);
+  CHECK_EQ(hr, S_OK);
+
+  ComPtr<WUC::ICompositionTarget> wuc_composition_target;
+  hr = desktop_window_target_.As(&wuc_composition_target);
+  CHECK_EQ(hr, S_OK);
+
+  hr = compositor->CreateSpriteVisual(&backdrop_sprite_visual_);
+  CHECK_EQ(hr, S_OK);
+
+  ComPtr<WUC::IVisual> sprite_visual_as_visual;
+  hr = backdrop_sprite_visual_.As(&sprite_visual_as_visual);
+  CHECK_EQ(hr, S_OK);
+  hr = wuc_composition_target->put_Root(sprite_visual_as_visual.Get());
+  CHECK_EQ(hr, S_OK);
+
+  ComPtr<WUC::IVisual2> sprite_visual_as_visual2;
+  hr = sprite_visual_as_visual.As(&sprite_visual_as_visual2);
+  CHECK_EQ(hr, S_OK);
+  hr = sprite_visual_as_visual2->put_RelativeSizeAdjustment({1.0f, 1.0f});
+  CHECK_EQ(hr, S_OK);
+}
+
+void WUCBackdrop::UpdateBackdropColor(SkColor color) {
+  if (!solid_color_brush_) {
+    ComPtr<WUC::ICompositor> compositor = GetOrCreateCompositor();
+    if (!compositor) {
+      return;
+    }
+
+    HRESULT hr = compositor->CreateColorBrush(&solid_color_brush_);
+    CHECK_EQ(hr, S_OK);
+
+    ComPtr<WUC::ICompositionBrush> brush;
+    hr = solid_color_brush_.As(&brush);
+    CHECK_EQ(hr, S_OK);
+    hr = backdrop_sprite_visual_->put_Brush(brush.Get());
+    CHECK_EQ(hr, S_OK);
+  }
+
+  HRESULT hr =
+      solid_color_brush_->put_Color({static_cast<BYTE>(SkColorGetA(color)),
+                                     static_cast<BYTE>(SkColorGetR(color)),
+                                     static_cast<BYTE>(SkColorGetG(color)),
+                                     static_cast<BYTE>(SkColorGetB(color))});
+  CHECK_EQ(hr, S_OK);
+}
+
+WUCBackdrop::~WUCBackdrop() = default;
+
+}  // namespace gfx
diff --git a/ui/gfx/win/wuc_backdrop.h b/ui/gfx/win/wuc_backdrop.h
new file mode 100644
index 0000000..291f13d
--- /dev/null
+++ b/ui/gfx/win/wuc_backdrop.h
@@ -0,0 +1,48 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_GFX_WIN_WUC_BACKDROP_H_
+#define UI_GFX_WIN_WUC_BACKDROP_H_
+
+#include <windows.h>
+
+#include <windows.ui.composition.desktop.h>
+#include <windows.ui.composition.h>
+#include <windows.ui.composition.interop.h>
+#include <wrl/client.h>
+
+#include "base/component_export.h"
+#include "third_party/skia/include/core/SkColor.h"
+
+namespace gfx {
+
+// Creates a small Windows UI Composition (WUC) visual tree that serves as the
+// backdrop for any HWND that is specified.
+class COMPONENT_EXPORT(GFX) WUCBackdrop {
+ public:
+  WUCBackdrop(HWND hwnd);
+  ~WUCBackdrop();
+
+  // Takes an SkColor and applies it to the backdrop sprite visual.
+  void UpdateBackdropColor(SkColor color);
+
+ private:
+  // Represents the target of the WUC tree and retains a link to the root
+  // visual.
+  Microsoft::WRL::ComPtr<
+      ABI::Windows::UI::Composition::Desktop::IDesktopWindowTarget>
+      desktop_window_target_;
+  // Sprite visuals take on color. This will be the leaf of the WUC tree and
+  // serve as the backdrop. Maintain a reference to the visual so that the
+  // visual is updated with browser theme.
+  Microsoft::WRL::ComPtr<ABI::Windows::UI::Composition::ISpriteVisual>
+      backdrop_sprite_visual_;
+  // The color brush that will be used to color the backdrop sprite visual.
+  Microsoft::WRL::ComPtr<ABI::Windows::UI::Composition::ICompositionColorBrush>
+      solid_color_brush_;
+};
+
+}  // namespace gfx
+
+#endif  // UI_GFX_WIN_WUC_BACKDROP_H_
diff --git a/ui/native_theme/native_theme_win.cc b/ui/native_theme/native_theme_win.cc
index dcf2d14..0c6d689 100644
--- a/ui/native_theme/native_theme_win.cc
+++ b/ui/native_theme/native_theme_win.cc
@@ -243,7 +243,8 @@
     case kScrollbarVerticalThumb:
     case kScrollbarHorizontalTrack:
     case kScrollbarVerticalTrack: {
-      int size = display::win::ScreenWin::GetSystemMetricsInDIP(SM_CXVSCROLL);
+      int size =
+          display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CXVSCROLL);
       if (size == 0) {
         size = 17;
       }
diff --git a/ui/strings/ax_strings.grd b/ui/strings/ax_strings.grd
index f25ca21..7715f2e 100644
--- a/ui/strings/ax_strings.grd
+++ b/ui/strings/ax_strings.grd
@@ -692,9 +692,6 @@
           <message name="IDS_AX_TOGGLE_BUTTON_OFF" desc="Accessibility state description for a toggle button when it is in the off/unchecked state">
             Off
           </message>
-          <message name="IDS_AX_CHECKBOX_PARTIALLY_CHECKED" desc="Accessibility state description for a checkbox that is in the partially checked state">
-            Partially Checked
-          </message>
           <message name="IDS_AX_ARIA_CURRENT_PAGE" desc="Accessibility state description for aria-current value of page.">
             current page
           </message>
diff --git a/ui/strings/ax_strings_grd/IDS_AX_CHECKBOX_PARTIALLY_CHECKED.png.sha1 b/ui/strings/ax_strings_grd/IDS_AX_CHECKBOX_PARTIALLY_CHECKED.png.sha1
deleted file mode 100644
index ec5fec88..0000000
--- a/ui/strings/ax_strings_grd/IDS_AX_CHECKBOX_PARTIALLY_CHECKED.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-764812a9256d7be7e640e7906551872dc2e5cb7d
\ No newline at end of file
diff --git a/ui/views/accessibility/view_ax_platform_node_delegate_win.cc b/ui/views/accessibility/view_ax_platform_node_delegate_win.cc
index 7c336c0..51e531e6 100644
--- a/ui/views/accessibility/view_ax_platform_node_delegate_win.cc
+++ b/ui/views/accessibility/view_ax_platform_node_delegate_win.cc
@@ -101,7 +101,7 @@
     ui::AXOffscreenResult* offscreen_result) const {
   switch (coordinate_system) {
     case ui::AXCoordinateSystem::kScreenPhysicalPixels:
-      return display::win::ScreenWin::DIPToScreenRect(
+      return display::win::GetScreenWin()->DIPToScreenRect(
           HWNDForView(view()), view()->GetBoundsInScreen());
     case ui::AXCoordinateSystem::kScreenDIPs:
       // We could optionally add clipping here if ever needed.
@@ -121,7 +121,7 @@
     ui::AXOffscreenResult* offscreen_result) const {
   switch (coordinate_system) {
     case ui::AXCoordinateSystem::kScreenPhysicalPixels:
-      return display::win::ScreenWin::DIPToScreenRect(
+      return display::win::GetScreenWin()->DIPToScreenRect(
           HWNDForView(view()),
           ViewAXPlatformNodeDelegate::GetInnerTextRangeBoundsRect(
               start_offset, end_offset, ui::AXCoordinateSystem::kScreenDIPs,
@@ -147,8 +147,8 @@
   // This is because Chromium transforms the screen physical coordinates it
   // receives from Windows into an internal representation of screen physical
   // coordinates adjusted for multiple displays of different resolutions.
-  return ToRoundedPoint(
-      display::win::ScreenWin::ScreenToDIPPoint(gfx::PointF(screen_point)));
+  return ToRoundedPoint(display::win::GetScreenWin()->ScreenToDIPPoint(
+      gfx::PointF(screen_point)));
 }
 
 }  // namespace views
diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc
index c5f3700..adff8da 100644
--- a/ui/views/controls/menu/menu_controller.cc
+++ b/ui/views/controls/menu/menu_controller.cc
@@ -339,7 +339,7 @@
   }
 
   gfx::Point screen_loc_pixels =
-      display::win::ScreenWin::DIPToScreenPoint(screen_loc);
+      display::win::GetScreenWin()->DIPToScreenPoint(screen_loc);
   HWND target_window = ::WindowFromPoint(screen_loc_pixels.ToPOINT());
   // If we don't find a native window for the HWND at the current location,
   // then attempt to find a native window from its parent if one exists.
diff --git a/ui/views/views_switches.cc b/ui/views/views_switches.cc
index 06e6245..0a923ad 100644
--- a/ui/views/views_switches.cc
+++ b/ui/views/views_switches.cc
@@ -21,6 +21,11 @@
 // GetLocalBounds().
 const char kDrawViewBoundsRects[] = "draw-view-bounds-rects";
 
+// Force the use of a WUC tree as the window backdrop when the redirection
+// bitmap is removed on Windows. This will cause the backdrop to take the
+// frame color.
+const char kUseWUCForWindowBackdrop[] = "use-wuc-for-window-backdrop";
+
 // Captures stack traces on View construction to provide better debug info.
 const char kViewStackTraces[] = "view-stack-traces";
 
diff --git a/ui/views/views_switches.h b/ui/views/views_switches.h
index c4961354..3cdb588 100644
--- a/ui/views/views_switches.h
+++ b/ui/views/views_switches.h
@@ -14,6 +14,7 @@
 VIEWS_EXPORT extern const char
     kDisableInputEventActivationProtectionForTesting[];
 VIEWS_EXPORT extern const char kDrawViewBoundsRects[];
+VIEWS_EXPORT extern const char kUseWUCForWindowBackdrop[];
 VIEWS_EXPORT extern const char kViewStackTraces[];
 
 }  // namespace views::switches
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
index 8d778ab8..3af1fe1 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
@@ -11,12 +11,14 @@
 #include <vector>
 
 #include "base/check_op.h"
+#include "base/command_line.h"
 #include "base/containers/flat_set.h"
 #include "base/functional/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/trace_event/trace_event.h"
 #include "base/win/win_util.h"
+#include "base/win/windows_version.h"
 #include "third_party/skia/include/core/SkPath.h"
 #include "third_party/skia/include/core/SkRegion.h"
 #include "ui/aura/client/aura_constants.h"
@@ -32,6 +34,8 @@
 #include "ui/base/win/event_creation_utils.h"
 #include "ui/base/win/hwnd_metrics.h"
 #include "ui/base/win/win_cursor.h"
+#include "ui/color/color_id.h"
+#include "ui/color/color_provider_key.h"
 #include "ui/compositor/compositor.h"
 #include "ui/compositor/layer.h"
 #include "ui/compositor/paint_context.h"
@@ -112,6 +116,12 @@
   ::ClipCursor(&window_rect);
 }
 
+bool ShouldApplySystemBackdrop() {
+  return base::win::GetVersion() >= base::win::Version::WIN11_22H2 &&
+         !base::CommandLine::ForCurrentProcess()->HasSwitch(
+             switches::kUseWUCForWindowBackdrop);
+}
+
 }  // namespace
 
 DEFINE_UI_CLASS_PROPERTY_KEY(aura::Window*, kContentWindowForRootWindow, NULL)
@@ -175,13 +185,18 @@
 ////////////////////////////////////////////////////////////////////////////////
 // DesktopWindowTreeHostWin, WidgetObserver implementation:
 void DesktopWindowTreeHostWin::OnWidgetThemeChanged(Widget* widget) {
-  // Ensure that DWM knows to apply the correct color scheme to the window
-  // backdrop whenever it changes.
-  BOOL use_dark_mode =
-      widget->GetColorMode() == ui::ColorProviderKey::ColorMode::kDark;
-  HRESULT hr = DwmSetWindowAttribute(GetHWND(), DWMWA_USE_IMMERSIVE_DARK_MODE,
-                                     &use_dark_mode, sizeof(use_dark_mode));
-  CHECK_EQ(hr, S_OK);
+  if (ShouldApplySystemBackdrop()) {
+    // Ensure that DWM knows to apply the correct color scheme to the window
+    // backdrop whenever it changes.
+    BOOL use_dark_mode =
+        widget->GetColorMode() == ui::ColorProviderKey::ColorMode::kDark;
+    HRESULT hr = DwmSetWindowAttribute(GetHWND(), DWMWA_USE_IMMERSIVE_DARK_MODE,
+                                       &use_dark_mode, sizeof(use_dark_mode));
+    CHECK_EQ(hr, S_OK);
+    return;
+  }
+  wuc_backdrop_->UpdateBackdropColor(
+      GetWidget()->GetColorProvider()->GetColor(ui::kColorFrameActive));
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -212,7 +227,7 @@
 
   // We don't have an HWND yet, so scale relative to the nearest screen.
   gfx::Rect pixel_bounds =
-      display::win::ScreenWin::DIPToScreenRect(nullptr, params.bounds);
+      display::win::GetScreenWin()->DIPToScreenRect(nullptr, params.bounds);
   message_handler_->Init(parent_hwnd, pixel_bounds);
 
   // If the Redirection Surface is removed, there needs to be a replacement
@@ -227,20 +242,30 @@
       !message_handler_->is_translucent()) {
     // Observe the widget to update the backdrop when the color mode changes.
     widget_observation_.Observe(GetWidget());
-
     // Ensure that the hwnd has been created.
     CHECK(GetHWND());
-    DWM_SYSTEMBACKDROP_TYPE backdrop = DWMSBT_TRANSIENTWINDOW;
-    HRESULT hr = DwmSetWindowAttribute(GetHWND(), DWMWA_SYSTEMBACKDROP_TYPE,
-                                       &backdrop, sizeof(backdrop));
-    CHECK_EQ(hr, S_OK);
 
-    // Ensure that the backdrop honors the OS dark mode setting.
-    BOOL use_dark_mode =
-        GetWidget()->GetColorMode() == ui::ColorProviderKey::ColorMode::kDark;
-    hr = DwmSetWindowAttribute(GetHWND(), DWMWA_USE_IMMERSIVE_DARK_MODE,
-                               &use_dark_mode, sizeof(use_dark_mode));
-    CHECK_EQ(hr, S_OK);
+    // Apply backdrop to the window. If on Win10 or older versions of Win11, use
+    // WUC for the backdrop. If on Win11 22H2 or newer, use DWM since it has the
+    // functionality included.
+    if (ShouldApplySystemBackdrop()) {
+      DWM_SYSTEMBACKDROP_TYPE backdrop = DWMSBT_TRANSIENTWINDOW;
+      HRESULT hr = DwmSetWindowAttribute(GetHWND(), DWMWA_SYSTEMBACKDROP_TYPE,
+                                         &backdrop, sizeof(backdrop));
+      CHECK_EQ(hr, S_OK);
+
+      // Ensure that the backdrop honors the OS dark mode setting.
+      BOOL use_dark_mode =
+          GetWidget()->GetColorMode() == ui::ColorProviderKey::ColorMode::kDark;
+      hr = DwmSetWindowAttribute(GetHWND(), DWMWA_USE_IMMERSIVE_DARK_MODE,
+                                 &use_dark_mode, sizeof(use_dark_mode));
+      CHECK_EQ(hr, S_OK);
+    } else {
+      wuc_backdrop_ = std::make_unique<gfx::WUCBackdrop>(GetHWND());
+
+      wuc_backdrop_->UpdateBackdropColor(
+          GetWidget()->GetColorProvider()->GetColor(ui::kColorFrameActive));
+    }
   }
 
   CreateCompositor(params.force_software_compositing);
@@ -327,7 +352,7 @@
     // positions in variable-DPI situations. See https://crbug.com/1252564 for
     // details.
     pixel_restore_bounds =
-        display::win::ScreenWin::DIPToScreenRect(nullptr, restore_bounds);
+        display::win::GetScreenWin()->DIPToScreenRect(nullptr, restore_bounds);
   }
   message_handler_->Show(show_state, pixel_restore_bounds);
 
@@ -340,7 +365,7 @@
 
 void DesktopWindowTreeHostWin::SetSize(const gfx::Size& size) {
   gfx::Size size_in_pixels =
-      display::win::ScreenWin::DIPToScreenSize(GetHWND(), size);
+      display::win::GetScreenWin()->DIPToScreenSize(GetHWND(), size);
   gfx::Size expanded =
       GetExpandedWindowSize(message_handler_->is_translucent(), size_in_pixels);
   window_enlargement_ =
@@ -362,7 +387,7 @@
 
 void DesktopWindowTreeHostWin::CenterWindow(const gfx::Size& size) {
   gfx::Size size_in_pixels =
-      display::win::ScreenWin::DIPToScreenSize(GetHWND(), size);
+      display::win::GetScreenWin()->DIPToScreenSize(GetHWND(), size);
   gfx::Size expanded_size;
   expanded_size =
       GetExpandedWindowSize(message_handler_->is_translucent(), size_in_pixels);
@@ -377,25 +402,25 @@
     ui::mojom::WindowShowState* show_state) const {
   message_handler_->GetWindowPlacement(bounds, show_state);
   InsetBottomRight(bounds, window_enlargement_);
-  *bounds = display::win::ScreenWin::ScreenToDIPRect(GetHWND(), *bounds);
+  *bounds = display::win::GetScreenWin()->ScreenToDIPRect(GetHWND(), *bounds);
 }
 
 gfx::Rect DesktopWindowTreeHostWin::GetWindowBoundsInScreen() const {
   gfx::Rect pixel_bounds = message_handler_->GetWindowBoundsInScreen();
   InsetBottomRight(&pixel_bounds, window_enlargement_);
-  return display::win::ScreenWin::ScreenToDIPRect(GetHWND(), pixel_bounds);
+  return display::win::GetScreenWin()->ScreenToDIPRect(GetHWND(), pixel_bounds);
 }
 
 gfx::Rect DesktopWindowTreeHostWin::GetClientAreaBoundsInScreen() const {
   gfx::Rect pixel_bounds = message_handler_->GetClientAreaBoundsInScreen();
   InsetBottomRight(&pixel_bounds, window_enlargement_);
-  return display::win::ScreenWin::ScreenToDIPRect(GetHWND(), pixel_bounds);
+  return display::win::GetScreenWin()->ScreenToDIPRect(GetHWND(), pixel_bounds);
 }
 
 gfx::Rect DesktopWindowTreeHostWin::GetRestoredBounds() const {
   gfx::Rect pixel_bounds = message_handler_->GetRestoredBounds();
   InsetBottomRight(&pixel_bounds, window_enlargement_);
-  return display::win::ScreenWin::ScreenToDIPRect(GetHWND(), pixel_bounds);
+  return display::win::GetScreenWin()->ScreenToDIPRect(GetHWND(), pixel_bounds);
 }
 
 std::string DesktopWindowTreeHostWin::GetWorkspace() const {
@@ -409,7 +434,7 @@
       MonitorFromWindow(message_handler_->hwnd(), MONITOR_DEFAULTTONEAREST),
       &monitor_info);
   gfx::Rect pixel_bounds = gfx::Rect(monitor_info.rcWork);
-  return display::win::ScreenWin::ScreenToDIPRect(GetHWND(), pixel_bounds);
+  return display::win::GetScreenWin()->ScreenToDIPRect(GetHWND(), pixel_bounds);
 }
 
 void DesktopWindowTreeHostWin::SetShape(
@@ -422,7 +447,8 @@
   // TODO(wez): This would be a lot simpler if we were passed an SkPath.
   // See crbug.com/410593.
   SkRegion shape;
-  const float scale = display::win::ScreenWin::GetScaleFactorForHWND(GetHWND());
+  const float scale =
+      display::win::GetScreenWin()->GetScaleFactorForHWND(GetHWND());
   if (scale > 1.0) {
     std::vector<SkIRect> sk_rects;
     for (const gfx::Rect& rect : *native_shape) {
@@ -943,7 +969,7 @@
     return HTTRANSPARENT;
   }
   gfx::Point dip_position =
-      display::win::ScreenWin::ClientToDIPPoint(GetHWND(), point);
+      display::win::GetScreenWin()->ClientToDIPPoint(GetHWND(), point);
   return native_widget_delegate_->GetNonClientComponent(dip_position);
 }
 
@@ -957,13 +983,13 @@
 
   if (Widget* widget = GetWidget(); widget && widget->non_client_view()) {
     widget->non_client_view()->GetWindowMask(
-        display::win::ScreenWin::ScreenToDIPSize(GetHWND(),
-                                                 adjusted_size_in_px),
+        display::win::GetScreenWin()->ScreenToDIPSize(GetHWND(),
+                                                      adjusted_size_in_px),
         path);
     // Convert path in DIPs to pixels.
     if (!path->isEmpty()) {
       const float scale =
-          display::win::ScreenWin::GetScaleFactorForHWND(GetHWND());
+          display::win::GetScreenWin()->GetScaleFactorForHWND(GetHWND());
       SkScalar sk_scale = SkFloatToScalar(scale);
       SkMatrix matrix;
       matrix.setScale(sk_scale, sk_scale);
@@ -1020,7 +1046,7 @@
 
 gfx::Size DesktopWindowTreeHostWin::DIPToScreenSize(
     const gfx::Size& dip_size) const {
-  return display::win::ScreenWin::DIPToScreenSize(GetHWND(), dip_size);
+  return display::win::GetScreenWin()->DIPToScreenSize(GetHWND(), dip_size);
 }
 
 void DesktopWindowTreeHostWin::ResetWindowControls() {
@@ -1148,7 +1174,7 @@
   // Adding/removing a monitor, or changing the primary monitor can cause a
   // WM_MOVE message before `OnDisplayChanged()`. Without this call, we would
   // DCHECK due to stale `DisplayInfo`s. See https:://crbug.com/1413940.
-  display::win::ScreenWin::UpdateDisplayInfosIfNeeded();
+  display::win::GetScreenWin()->UpdateDisplayInfosIfNeeded();
   CheckForMonitorChange();
   OnHostMovedInPixels();
 }
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
index 2ee5e4b4..f268b15 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h
@@ -13,6 +13,7 @@
 #include "ui/aura/window_tree_host.h"
 #include "ui/base/mojom/ui_base_types.mojom-shared.h"
 #include "ui/base/mojom/window_show_state.mojom-forward.h"
+#include "ui/gfx/win/wuc_backdrop.h"
 #include "ui/views/views_export.h"
 #include "ui/views/widget/desktop_aura/desktop_window_tree_host.h"
 #include "ui/views/widget/widget_observer.h"
@@ -343,6 +344,9 @@
   // True if the window is allow to take screenshots, by default is true.
   bool allow_screenshots_ = true;
 
+  // A Windows.Ui.Composition visual tree that represents the window backdrop.
+  std::unique_ptr<gfx::WUCBackdrop> wuc_backdrop_;
+
   base::ScopedObservation<Widget, WidgetObserver> widget_observation_{this};
 
   // Visibility of the cursor. On Windows we can have multiple root windows and
diff --git a/ui/views/win/fullscreen_handler.cc b/ui/views/win/fullscreen_handler.cc
index 7daa1fd..b51df0e8 100644
--- a/ui/views/win/fullscreen_handler.cc
+++ b/ui/views/win/fullscreen_handler.cc
@@ -70,7 +70,7 @@
     // Store the original window rect, DPI, and monitor info to detect changes
     // and more accurately restore window placements when exiting fullscreen.
     ::GetWindowRect(hwnd_, &saved_window_info_.rect);
-    saved_window_info_.dpi = display::win::ScreenWin::GetDPIForHWND(hwnd_);
+    saved_window_info_.dpi = display::win::GetScreenWin()->GetDPIForHWND(hwnd_);
     saved_window_info_.monitor =
         MonitorFromWindow(hwnd_, MONITOR_DEFAULTTONEAREST);
     saved_window_info_.monitor_info.cbSize =
@@ -93,7 +93,7 @@
 
     // Set the window rect to the rcMonitor of the targeted or current display.
     const display::win::ScreenWinDisplay screen_win_display =
-        display::win::ScreenWin::GetScreenWinDisplayWithDisplayId(
+        display::win::GetScreenWin()->GetScreenWinDisplayWithDisplayId(
             target_display_id);
     gfx::Rect window_rect = screen_win_display.screen_rect();
     if (target_display_id == display::kInvalidDisplayId ||
@@ -128,13 +128,14 @@
             gfx::Rect(monitor_info.rcWork)) {
       window_rect.AdjustToFit(gfx::Rect(monitor_info.rcWork));
     }
-    const int fullscreen_dpi = display::win::ScreenWin::GetDPIForHWND(hwnd_);
+    const int fullscreen_dpi =
+        display::win::GetScreenWin()->GetDPIForHWND(hwnd_);
 
     SetWindowPos(hwnd_, nullptr, window_rect.x(), window_rect.y(),
                  window_rect.width(), window_rect.height(),
                  SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
 
-    const int final_dpi = display::win::ScreenWin::GetDPIForHWND(hwnd_);
+    const int final_dpi = display::win::GetScreenWin()->GetDPIForHWND(hwnd_);
     if (final_dpi != saved_window_info_.dpi || final_dpi != fullscreen_dpi) {
       // Reissue SetWindowPos if the DPI changed from saved or fullscreen DPIs.
       // The first call may misinterpret bounds spanning displays, if the
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc
index a183cfe..d0941e2c 100644
--- a/ui/views/win/hwnd_message_handler.cc
+++ b/ui/views/win/hwnd_message_handler.cc
@@ -1017,7 +1017,7 @@
 
   // Convert to pixels.
   excluded_margin_ =
-      display::win::ScreenWin::DIPToScreenSize(hwnd(), excluded_margin);
+      display::win::GetScreenWin()->DIPToScreenSize(hwnd(), excluded_margin);
 
   // When the aspect ratio is set, size the window to adhere to it. This keeps
   // the same origin point as the original window.
@@ -1191,7 +1191,7 @@
 
   const gfx::Rect dip_caret_bounds(client->GetCaretBounds());
   gfx::Rect caret_bounds =
-      display::win::ScreenWin::DIPToScreenRect(hwnd(), dip_caret_bounds);
+      display::win::GetScreenWin()->DIPToScreenRect(hwnd(), dip_caret_bounds);
   // Collapse any selection.
   caret_bounds.set_width(1);
   ax_system_caret_->MoveCaretTo(caret_bounds);
@@ -1846,7 +1846,7 @@
   // the DPI and thus must initialize dpi_ now. See https://crbug.com/1282804
   // for details.
   if (initial_bounds_valid_) {
-    dpi_ = display::win::ScreenWin::GetDPIForHWND(hwnd());
+    dpi_ = display::win::GetScreenWin()->GetDPIForHWND(hwnd());
   }
 
   // TODO(beng): move more of NWW::OnCreate here.
@@ -1883,7 +1883,7 @@
   // that case, when monitors are added or removed, without a lot of extra
   // updates of the global ScreenWin DisplayInfos state. See
   // https://crbug.com/1413940 for more info.
-  display::win::ScreenWin::UpdateDisplayInfosIfNeeded();
+  display::win::GetScreenWin()->UpdateDisplayInfosIfNeeded();
 
   base::WeakPtr<HWNDMessageHandler> ref(msg_handler_weak_factory_.GetWeakPtr());
   delegate_->HandleDisplayChange();
@@ -1919,7 +1919,7 @@
     dpi = display::win::GetDPIFromScalingFactor(scaling_factor);
   } else {
     dpi = LOWORD(w_param);
-    scaling_factor = display::win::ScreenWin::GetScaleFactorForDPI(dpi);
+    scaling_factor = display::win::GetScreenWin()->GetScaleFactorForDPI(dpi);
   }
 
   // The first WM_DPICHANGED originates from EnableChildWindowDpiMessage during
@@ -1939,7 +1939,7 @@
   // in which the display a window is on has a different scale factor than the
   // window, when the window handles the scale factor change.
   // See https://crbug.com/1368455 for more info.
-  display::win::ScreenWin::UpdateDisplayInfos();
+  display::win::GetScreenWin()->UpdateDisplayInfos();
   SetBoundsInternal(gfx::Rect(*reinterpret_cast<RECT*>(l_param)), false);
   delegate_->HandleWindowScaleFactorChanged(scaling_factor);
   return 0;
diff --git a/ui/views/win/hwnd_message_handler_headless.cc b/ui/views/win/hwnd_message_handler_headless.cc
index 59485466..58f83dab 100644
--- a/ui/views/win/hwnd_message_handler_headless.cc
+++ b/ui/views/win/hwnd_message_handler_headless.cc
@@ -33,7 +33,7 @@
 // cannot rely on the platform window size since it gets clamped to the monitor
 // work area.
 gfx::Rect ScaleWindowBoundsMaybe(HWND hwnd, const gfx::Rect& bounds) {
-  const float scale = display::win::ScreenWin::GetScaleFactorForHWND(hwnd);
+  const float scale = display::win::GetScreenWin()->GetScaleFactorForHWND(hwnd);
   if (scale > 1.0) {
     gfx::RectF scaled_bounds(bounds);
     scaled_bounds.Scale(scale);
diff --git a/ui/views/window/custom_frame_view.cc b/ui/views/window/custom_frame_view.cc
index 1551d87..7187bca 100644
--- a/ui/views/window/custom_frame_view.cc
+++ b/ui/views/window/custom_frame_view.cc
@@ -295,7 +295,7 @@
 #if BUILDFLAG(IS_WIN)
   // This metric scales up if either the titlebar height or the titlebar font
   // size are increased.
-  return display::win::ScreenWin::GetSystemMetricsInDIP(SM_CYSMICON);
+  return display::win::GetScreenWin()->GetSystemMetricsInDIP(SM_CYSMICON);
 #else
   // The icon never shrinks below 16 px on a side.
   constexpr int kIconMinimumSize = 16;
diff --git a/ui/views/window/non_client_view.cc b/ui/views/window/non_client_view.cc
index b5e85924..cf8b27db 100644
--- a/ui/views/window/non_client_view.cc
+++ b/ui/views/window/non_client_view.cc
@@ -107,7 +107,7 @@
   gfx::Point point(GetMirroredXInView(GetBoundsForClientView().x()),
                    GetSystemMenuY());
   View::ConvertPointToScreen(this, &point);
-  point = display::win::ScreenWin::DIPToScreenPoint(point);
+  point = display::win::GetScreenWin()->DIPToScreenPoint(point);
   // The native system menu seems to overlap the titlebar by 1 px.  Match that.
   return point - gfx::Vector2d(0, 1);
 }
diff --git a/v8 b/v8
index c04ae4d..9737790 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit c04ae4da0bf3c16eabed39c0f27bba1e87cfab93
+Subproject commit 9737790587bc0ce61a1ffc9fadde3abf70dbb5a9